Thông báo

Collapse
No announcement yet.

[help] hiển sỗ xung của encoder lên LCD

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    hic, tìm mà ko thấy, bạn thử tìm xem..
    mình xin nói phương pháp như sau:
    dung timer để định một đơn vị thời gian điều xung.
    cứ có ngắt thì bạn lại tăng biến đếm lên giống như TCNT của timer ấy
    và khi đó bạn muốn cho nó chạy ở chế độ pwm nào thì cứ việc làm theo chế độ ấy.
    ví dụ làm theo kiều fast pwm của timer
    khi tăng biến đếm thì bạn cần so sánh nó với 2 giá trị là compare và max
    giả sử nếu bằng compare thì clear chân pwm,nếu bằng max thì set pwm và đồng thời clear biến đếm.
    cách làm là như vậy có j thắc mắc thì bạn cứ hỏi.

    thân!

    Comment


    • #32
      Nguyên văn bởi dt_love Xem bài viết
      ram thì tốn thêm vài byte, cpu thì xử lí thêm mớ lệnh nữa. cái này mình có viết trên diễn đàn rồi mà ko nhớ ở toppic nào, để tìm lại đã
      Cái này bác viết bằng phần mềm thì PWM bao nhiêu chẳng đc , điều hay của fast PWM là thực hiện cung lúc với CPU , như thế sẽ tận dụng đc rất nhiều chức năng . Nói chung là không nên chơi kiểu này , timer counter đủ cả ,tại sao ko xài
      Cái gì người khác làm được , mình cũng làm được !

      Comment


      • #33
        Nguyên văn bởi aprninth Xem bài viết
        Cái này bác viết bằng phần mềm thì PWM bao nhiêu chẳng đc , điều hay của fast PWM là thực hiện cung lúc với CPU , như thế sẽ tận dụng đc rất nhiều chức năng . Nói chung là không nên chơi kiểu này , timer counter đủ cả ,tại sao ko xài
        bác vào top pic thì nên đọc từ trên xuống rồi hãy post bài nhé.. bạn hãy đọc lại yêu cầu ở trên đi, 1timer2 yêu cầu 2PWM

        Comment


        • #34
          Nguyên văn bởi soulasylum Xem bài viết
          phần mềm gì hả bác??có ngốn ram cua cpu không?
          bác bầy cho em cách chơi phần mềm với
          vả lại... bác soulasylum có hỏi nên mình mới post..

          Comment


          • #35
            Nguyên văn bởi dt_love Xem bài viết
            vả lại... bác soulasylum có hỏi nên mình mới post..
            em có cách khác dùng cho đếm counter
            hehe đó là ngắt ngoài...int0 và int1
            thế mà không nghĩ ra...kaka

            Comment


            • #36
              Nguyên văn bởi soulasylum Xem bài viết
              hic tuong test được bằng atmega8...nhưng cũng không được bác ah...
              c1 thì không ổn rùi vì như bác viết em hiểu bác dùng ngắt ngoài..
              c2 T2 chỉ có một cổng điều xung(PWM)-->không đủ
              c3 ban đầu em cũng nghĩ như bác nhưng khi sử dụng clk bên ngoài chắc chắn sẽ sai sô xung của encoder nhiều...
              híc huhu chả nhẽ lại bỏ ra 100k mua hẳn con 128 về ah??
              mà chỉ test thui thì nhỡ có mệnh hệ gì...thì ...huhu công toi...
              bác bảo như thế nào cho tiết kiệm bây giờ??
              hic.. bạn đọc kĩ bài mình viết chưa vậy. cách đầu tiên là dùng 2 cái ngắt ngoài để đếm đó..?

              Comment


              • #37
                Nguyên văn bởi soulasylum Xem bài viết
                em có cách khác dùng cho đếm counter
                hehe đó là ngắt ngoài...int0 và int1
                thế mà không nghĩ ra...kaka
                jo bạn lại bảo là có phát hiện mới.. pó tay luôn.

                Comment


                • #38
                  Nguyên văn bởi dt_love Xem bài viết
                  jo bạn lại bảo là có phát hiện mới.. pó tay luôn.
                  híc em quên mất còn ngắt ngoài...híc...em mới tìm hiểu thui mà

                  Comment


                  • #39
                    vậy bạn trở lên đọc bài mình viết ở trên đi. đọc kĩ rồi phân tích mà chon phương án cho thích hợp. mà khi đọc bài thì nhớ là đọc kĩ rồi hãy post trả lời nhé

                    Comment


                    • #40
                      Nguyên văn bởi daicaxomlieu Xem bài viết
                      bạn muốn đọc xung thế nào, VD trong 1 giây motor chay dược nhiu vòng và enconder dọc được nhiu xung thì bạn kết nối chân encoder vào chân ngắt ngoài rùi cho count++
                      sau đó khai báo timer trong đếm trong 1 giây rùi reset biến đếm
                      sau dó dùng lệnh
                      lcd_gotoxy(0,0);
                      itoa(count,st);(ham gán số vào chuỗi rùi xuất lên LCD)
                      lcd_put(st);
                      đây là mình viết trên codevision AVR
                      Em dùng CodevisionAVR 2.03.4
                      như thế này:
                      unsigned char chuoi[10];
                      int sochai;
                      itoa(sochai,chuoi);
                      lcd_putsf(chuoi);

                      Vậy không hiểu sao chương trình cứ báo lỗi
                      undefined symbol 'itoa'
                      mong các bác chỉ jáo!
                      Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                      Comment


                      • #41
                        Nguyên văn bởi Le Thi Bich Xem bài viết
                        Em dùng CodevisionAVR 2.03.4
                        như thế này:
                        unsigned char chuoi[10];
                        int sochai;
                        itoa(sochai,chuoi);
                        lcd_putsf(chuoi);

                        Vậy không hiểu sao chương trình cứ báo lỗi
                        undefined symbol 'itoa'
                        mong các bác chỉ jáo!
                        hình như bạn chưa khai báo thư viện stdlib.h

                        Comment


                        • #42
                          em có khai báo #include <stdlib.h> rui mà vẫn không được
                          Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                          Comment


                          • #43
                            Bạn đã khai báo thư viện stdlib.h chưa?
                            Code:
                            #include <stdlib.h>

                            Comment


                            • #44
                              Nguyên văn bởi Le Thi Bich Xem bài viết
                              em có khai báo #include <stdlib.h> rui mà vẫn không được
                              bạn post nguyên cái project của bạn lên thử xem. mình vừa vào CV tạo thử..vẫn chạy ok mà. có khi nào bạn include stdlib.h sau đoạn mã sử dụng hàm itoa ko?

                              Comment


                              • #45
                                Nguyên văn bởi Xem bài viết
                                Project :
                                Version :
                                Date : 8/22/2009
                                Author : F4CG
                                Company : F4CG
                                Comments:


                                Chip type : ATmega8
                                Program type : Application
                                Clock frequency : 1.000000 MHz
                                Memory model : Small
                                External SRAM size : 0
                                Data Stack size : 256
                                ************************************************** ***/

                                #include <mega8.h>
                                #include <delay.h>
                                #include <stdlib.h>
                                // Alphanumeric LCD Module functions
                                #asm
                                .equ __lcd_port=0x18 ;PORTB
                                #endasm
                                #include <lcd.h>
                                // Declare your global variables here
                                int vao=0; //bien dem chai cua vao
                                int ra=0; //bien dem chai cua ra
                                // External Interrupt 0 service routine
                                interrupt [EXT_INT0] void ext_int0_isr(void)
                                {
                                // Place your code here
                                vao=vao+1;
                                }

                                // External Interrupt 1 service routine
                                interrupt [EXT_INT1] void ext_int1_isr(void)
                                {
                                // Place your code here
                                ra=ra+1;
                                }


                                ///////////////////////////////////////////////////////////
                                //CHUONG TRINH CON LUU DU LIEU VAO EEPROM
                                void EEPROM_viet(unsigned int dchi, unsigned char dlieu)
                                {
                                while(EECR.1==1);
                                EEAR = dchi;
                                EEDR = dlieu;
                                EECR.2 = 1;
                                EECR.1 = 1;
                                }

                                //doc 1 byte du lieu tu dia chi cua eeprom
                                unsigned char EEPROM_doc(unsigned int dchi)
                                {
                                while(EECR.1);
                                EEAR = dchi;
                                EECR.0 = 1;
                                return EEDR;
                                }
                                /////////////////////////////////////////////

                                void main(void)
                                {
                                // Declare your local variables here

                                // Input/Output Ports initialization
                                // Port B initialization
                                // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
                                // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
                                PORTB=0x00;
                                DDRB=0xFF;

                                // Port C initialization
                                // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
                                // State6=T State5=0 State4=0 State3=0 State2=0 State1=T State0=T
                                PORTC=0x00;
                                DDRC=0x3C;

                                // Port D initialization
                                // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                                // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                                PORTD=0x00;
                                DDRD=0x80;

                                // Timer/Counter 0 initialization
                                // Clock source: System Clock
                                // Clock value: Timer 0 Stopped
                                TCCR0=0x00;
                                TCNT0=0x00;

                                // Timer/Counter 1 initialization
                                // Clock source: System Clock
                                // Clock value: Timer 1 Stopped
                                // Mode: Normal top=FFFFh
                                // OC1A output: Discon.
                                // OC1B output: Discon.
                                // Noise Canceler: Off
                                // Input Capture on Falling Edge
                                // Timer 1 Overflow Interrupt: Off
                                // Input Capture Interrupt: Off
                                // Compare A Match Interrupt: Off
                                // Compare B Match Interrupt: Off
                                TCCR1A=0x00;
                                TCCR1B=0x00;
                                TCNT1H=0x00;
                                TCNT1L=0x00;
                                ICR1H=0x00;
                                ICR1L=0x00;
                                OCR1AH=0x00;
                                OCR1AL=0x00;
                                OCR1BH=0x00;
                                OCR1BL=0x00;

                                // Timer/Counter 2 initialization
                                // Clock source: System Clock
                                // Clock value: Timer 2 Stopped
                                // Mode: Normal top=FFh
                                // OC2 output: Disconnected
                                ASSR=0x00;
                                TCCR2=0x00;
                                TCNT2=0x00;
                                OCR2=0x00;

                                // External Interrupt(s) initialization
                                // INT0: On
                                // INT0 Mode: Rising Edge
                                // INT1: On
                                // INT1 Mode: Rising Edge
                                GICR|=0xC0;
                                MCUCR=0x0F;
                                GIFR=0xC0;

                                // Timer(s)/Counter(s) Interrupt(s) initialization
                                TIMSK=0x00;

                                // Analog Comparator initialization
                                // Analog Comparator: Off
                                // Analog Comparator Input Capture by Timer/Counter 1: Off
                                ACSR=0x80;
                                SFIOR=0x00;

                                // LCD module initialization
                                lcd_init(16);

                                // Global enable interrupts
                                #asm("sei")
                                //doc du lieu so chai chiet mot me luu trong eeprom
                                if (PORTD.0==0) //an nut SET
                                {
                                int so; //bien nho so chai chiet mot me
                                int den=0; //bien dem thoi jan den sang
                                unsigned char chuoi[3]; //bien ki chuyen so thanh chuoix
                                so=EEPROM_doc(0x01); // Doc so chai tu dia chi 0x01 cua eeprom
                                while (PIND.1==1)
                                { den=den+1;
                                if (den<50) PORTD.7=1; //Bat sang den lighback den LCD
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,0); // Dua con tro ve goc, dong 0, cot 0
                                lcd_putsf("CHUONG TRINH CAI DAT");// Hien thi dong chu
                                lcd_gotoxy(1,2); // Dua con tro ve dong 1, cot 2
                                lcd_putsf("So chai:"); // Hien thi so chai trong mot me chiet
                                lcd_gotoxy(1,12); // Dua con tro ve goc, dong 1, cot 12
                                itoa(so,chuoi); // Ham gan so vao chuoi de hien thi lên LCD)
                                lcd_putsf(chuoi); // Hien thi so chai len LCD
                                delay_ms(300); // tren 0,3s de chong doi phim
                                if (PIND.5==0) //an phim UP
                                { if (so<10) so=so+1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.6==0) //an phim DOWN
                                { if (so>0) so=so-1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.0==0) //an phim SET
                                { den=0; //Reset den lightback
                                EEPROM_viet(0x01,so); //Luu vao eeprom o dia chi 0x01
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,2); // Dua con tro ve goc, dong 0, cot 2
                                lcd_putsf("Da luu so chai");// Hien thi dong chu
                                delay_ms(500);
                                };
                                if (den>=50)
                                { PORTD.7=0; //tat den lightback neu 15s khong dong vao ban phim
                                den=50;
                                };

                                };

                                so=EEPROM_doc(0x02);
                                while (PIND.1==1)
                                { den=den+1;
                                if (den<50) PORTD.7=1; //Bat sang den lighback den LCD
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,0); // Dua con tro ve goc, dong 0, cot 0
                                lcd_putsf("THOI GIAN CHIET");// Hien thi dong chu
                                lcd_gotoxy(1,2);// Dua con tro ve dong 1, cot 2
                                lcd_putsf("(S)");// Hien thi thoi gian chiet chan giay
                                lcd_gotoxy(1,12); // Dua con tro ve goc, dong 1, cot 12
                                itoa(so,chuoi); // gan so vao chuoi de hien thi lên LCD)
                                lcd_putsf(chuoi); // Hien thi thoi jan chan giay len LCD
                                delay_ms(300); // tren 0,3s de chong doi phim
                                if (PIND.5==0) //an phim UP
                                { if (so<100) so=so+1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.6==0) //an phim DOWN
                                { if (so>0) so=so-1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.0==0) //an phim SET
                                { EEPROM_viet(0x02,so); //Luu vao eeprom o dia chi 0x02
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,0); // Dua con tro ve goc, dong 0, cot 0
                                lcd_putsf("Da luu thoi jan chiet (s)");// Hien thi dong chu
                                den=0; //reset thoi gian den sang
                                delay_ms(500);
                                };

                                if (den>=50)
                                { PORTD.7=0; //tat den lightback neu 15s khong dong vao ban phim
                                den=50;
                                };

                                };
                                so=EEPROM_doc(0x03);
                                while (PIND.1==1)
                                { den=den+1;
                                if (den<50) PORTD.7=1; //Bat sang den lighback den LCD
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,0); // Dua con tro ve goc, dong 0, cot 0
                                lcd_putsf("THOI GIAN CHIET");// Hien thi dong chu
                                lcd_gotoxy(1,2);// Dua con tro ve dong 1, cot 2
                                lcd_putsf("(0.1S)");// Hien thi thoi gian chiet chan 0.1 giay
                                lcd_gotoxy(1,12); // Dua con tro ve goc, dong 1, cot 12
                                itoa(so,chuoi); // gan so vao chuoi de hien thi lên LCD)
                                lcd_putsf(chuoi); // Hien thi thoi jan chan giay len LCD
                                delay_ms(300); // tre 0,3s de chong doi phim
                                if (PIND.5==0) //an phim UP
                                {if (s2<=10)
                                s2=s2+1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.6==0) //an phim DOWN
                                { if (s2>0)
                                s2=s2-1;
                                den=0; //reset thoi gian den sang
                                };
                                if (PIND.0==0) //an phim SET
                                { EEPROM_viet(0x03,s2); //Luu vao eeprom o dia chi 0x03
                                lcd_clear(); //xoa man hinh
                                lcd_gotoxy(0,0); // Dua con tro ve goc, dong 0, cot 0
                                lcd_putsf("Da luu thoi jan chiet (0.1s)");// Hien thi dong chu
                                den=0; //reset thoi gian den sang
                                delay_ms(500);
                                };
                                if (PIND.1==0) //an phim EXIT
                                { thoat=1; //Thoat khoi vong lap
                                den=0;
                                };
                                if (den>=50)
                                { PORTD.7=0; //tat den lightback neu 15s khong dong vao ban phim
                                den=50;
                                };
                                };



                                };

                                while (1)
                                {
                                // Place your code here

                                };
                                }
                                Chương trình của em hơi cồng kềnh, các anh chịu khó đọc xem giúp em nhé,
                                chỉ có lỗi ở hàm itoa thôi còn các vấn đề khác nói chung tốt, em vân chưa soạn xong toàn bộ nhưng lại gặp lỗi rồi. Có file đính kèm phía các anh giúp em với nhé em cảm ơn nhiều nhiều
                                Attached Files
                                Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                                Comment

                                Về tác giả

                                Collapse

                                soulasylum Tìm hiểu thêm về soulasylum

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X