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

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

    em đang làm đếm xung encoder...
    cách là như thế này
    em cho chan A của encoder vào Timer/counter0 để đếm xung (rising egde)
    giả sử là 100xung/1 vòng thì interrupt timer0_overflow (ngắt tràn)
    trong hàm interrupt đó em cho một biến count++ cho mỗi làn ngắt tràn thì tăng lên một đơn vị
    vấn đề là em không biết hiển thị biến count++ ra LCD
    bác nào cho em cái thuật toán với...
    em ngồi mãi cũng phát trán vì không tim ra...

  • #2
    mình có thuật toán thế này ko biết có dc không:
    1-chia biến đếm count cho 10
    2-lấy phần dư +30h(lấy mã ascii)
    3-hiển thị,và dịch sang phải phần dư vừa cộng lên LCD
    4-thực hiện lai bc 1 đến khi nào không chia dc nữa thì thôi

    Comment


    • #3
      nhưng em không biết quản lý biến count vào trong hàm LCd hic...bác có thể nói rõ cho em được không

      Comment


      • #4
        Cái này dùng putchar thì phải , nhớ cộng thêm để hiện đúng trong bảnng mã ASCII. Đọc help để biết thêm chi tiết ( Codevision)
        Tý quên : nhớ chia số bạn cần hiển thị ra thành từng chữ số 1 rồi đẩy dần ra
        Cái gì người khác làm được , mình cũng làm được !

        Comment


        • #5
          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

          Comment


          • #6
            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
            bác daicaxomlieu ơi đây là mô phỏng và chương trình viết bằng codevision bác xem cho em để có hiển thị sỗ xung lên LCD thì code như thế nào...
            híc giúp em phát em đang cần gấp mà
            Attached Files

            Comment


            • #7
              The LCD Functions are intended for easy interfacing between C programs and alphanumeric LCD modules built with the Hitachi HD44780 chip or equivalent.
              The prototypes for these functions are placed in the file lcd.h, located in the ..\INC subdirectory. This file must be #include -ed before using the functions.

              Prior to #include -ing the lcd.h file, you must declare which microcontroller port is used for communication with the LCD module.
              The following LCD formats are supported in lcd.h: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24 and 2x40 characters.

              Example:

              /* the LCD module is connected to PORTC */
              #asm
              .equ __lcd_port=0x15
              #endasm

              /* now you can include the LCD Functions */
              #include <lcd.h>

              The LCD module must be connected to the port bits as follows:


              [LCD] [AVR Port]
              RS (pin4) ------ bit 0
              RD (pin 5) ------ bit 1
              EN (pin 6) ------ bit 2
              DB4 (pin 11) --- bit 4
              DB5 (pin 12) --- bit 5
              DB6 (pin 13) --- bit 6
              DB7 (pin 14) --- bit 7

              You must also connect the LCD power supply and contrast control voltage, according to the data sheet.

              The low level LCD Functions are:

              void _lcd_ready(void)

              waits until the LCD module is ready to receive data.
              This function must be called prior to writing data to the LCD with the _lcd_write_data function.

              void _lcd_write_data(unsigned char data)

              writes the byte data to the LCD instruction register.
              This function may be used for modifying the LCD configuration.
              Example:

              /* enables the displaying of the cursor */
              _lcd_ready();
              _lcd_write_data(0xe);


              void lcd_write_byte(unsigned char addr, unsigned char data);

              writes a byte to the LCD character generator or display RAM.

              Example:

              /* LCD user defined characters

              Chip: AT90S8515
              Memory Model: SMALL
              Data Stack Size: 128 bytes

              Use an 2x16 alphanumeric LCD connected
              to the STK200+ PORTC header as follows:

              [LCD] [STK200+ PORTC HEADER]
              1 GND- 9 GND
              2 +5V- 10 VCC
              3 VLC- LCD HEADER Vo
              4 RS - 1 PC0
              5 RD - 2 PC1

              6 EN - 3 PC2
              11 D4 - 5 PC4
              12 D5 - 6 PC5
              13 D6 - 7 PC6
              14 D7 - 8 PC7 */

              /* the LCD is connected to PORTC outputs */
              #asm
              .equ __lcd_port=0x15 ;PORTC
              #endasm

              /* include the LCD driver routines */
              #include <lcd.h>

              typedef unsigned char byte;

              /* table for the user defined character
              arrow that points to the top right corner */
              flash byte char0[8]={
              0b0000000,
              0b0001111,
              0b0000011,
              0b0000101,
              0b0001001,
              0b0010000,
              0b0100000,

              0b1000000};

              /* function used to define user characters */
              void define_char(byte flash *pc,byte char_code)
              {
              byte i,a;
              a=(char_code<<3) | 0x40;
              for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
              }

              void main(void)
              {
              /* initialize the LCD for 2 lines & 16 columns */
              lcd_init(16);

              /* define user character 0 */
              define_char(char0,0);

              /* switch to writing in Display RAM */
              lcd_gotoxy(0,0);
              lcd_putsf("User char 0:");

              /* display used defined char 0 */
              lcd_putchar(0);

              while (1); /* loop forever */
              }


              unsigned char lcd_read_byte(unsigned char addr);

              reads a byte from the LCD character generator or display RAM.

              The high level LCD Functions are:


              unsigned char lcd_init(unsigned char lcd_columns)

              initializes the LCD module, clears the display and sets the printing character position at row 0 and column 0. The numbers of columns of the LCD must be specified (e.g. 16). No cursor is displayed.
              The function returns 1 if the LCD module is detected and 0 if it is not.
              This is the first function that must be called before using the other high level LCD Functions.

              void lcd_clear(void)

              clears the LCD and sets the printing character position at row 0 and column 0.

              void lcd_gotoxy(unsigned char x, unsigned char y)

              sets the current display position at column x and row y. The row and column numbering starts from 0.

              void lcd_putchar(char c)

              displays the character c at the current display position.

              void lcd_puts(char *str)

              displays at the current display position the string str, located in SRAM.

              void lcd_putsf(char flash *str)

              displays at the current display position the string str, located in FLASH.
              Đồng chí chả chịu đọc help gì cả , mấy cái này ít dùng , ai mà nhớ đc
              Cái gì người khác làm được , mình cũng làm được !

              Comment


              • #8
                vấn đề hiển thị lên LCD phải là chuỗi ký tự chư không thể hiển thị số do đo phải chuyển giá trị biến bạn cần hiển thị về dạng ký tự. Ngày trước anh VNarmy có chỉ cho mình lệnh cũng đơn jản nhưng mình lâu không dùng nên quên mất rồi bạn thử hỏi anh ấy xem. Xong rồi chỉ cho mọi người cùng biết nhé
                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


                • #9
                  Đây là 2 cái hàm mình viết thêm vào thư viện của LCD tùy bạn dùng theo yêu cầu của số:
                  Code:
                  void lcd_number2(int32 number)//HIEN THI SO TU NHIEN 32 BIT RA MAN HINH LCD
                  {
                  int8 i;
                  int32 temp,exp10;
                  unsigned char a[10];
                  
                  temp=number;
                  exp10=1000000000;
                  for (i=9;i>=2;i--)
                      { 
                      a[i]=temp/exp10;
                      temp=temp%exp10;
                      exp10=exp10/10;
                      }
                  a[1]=temp/10;
                  a[0]=temp%10;
                  
                  for (i=9;i>=1;i--)
                  {
                      if (a[i]>0)
                      {
                      lcd_putc(a[i]+48);
                      delay_us(10);
                      }
                  }
                  lcd_putc(a[0]+48);
                  delay_us(10);
                  
                  }
                  
                  void lcd_number(int32 so)//HIEN THI SO CO 3 CHU SO RA MAN HINH LCD
                    {int t;
                    unsigned char a[3];
                    //setLCD();
                  
                    a[2]=so%10;
                    so=so/10;
                    a[1]=so%10;
                    a[0]=so/10;
                    for(t=0;t<3;t++)
                       {
                       lcd_putc(a[t]+48);delay_us(10);
                       }
                    }
                  Hàm lcd_number nên dùng để hiển thị số <999 định dạng của nó sẽ là xxx . VD: lcd_number(1) sẽ hiện trên LCD là: 001
                  Hàm lcd_number2 dùng hiện số 32 bit đầy đủ các số 0 đằng trước sẽ không được in ra trên màn hình. VD: lcd_number2(12453) thì sẽ hiện ra LCD là: 12453, lcd_number2(1) sẽ hiện trên LCD là 1
                  123...

                  Comment


                  • #10
                    Nguyên văn bởi nbb3i Xem bài viết
                    Đây là 2 cái hàm mình viết thêm vào thư viện của LCD tùy bạn dùng theo yêu cầu của số:
                    Code:
                    void lcd_number2(int32 number)//HIEN THI SO TU NHIEN 32 BIT RA MAN HINH LCD
                    {
                    int8 i;
                    int32 temp,exp10;
                    unsigned char a[10];
                    
                    temp=number;
                    exp10=1000000000;
                    for (i=9;i>=2;i--)
                        { 
                        a[i]=temp/exp10;
                        temp=temp%exp10;
                        exp10=exp10/10;
                        }
                    a[1]=temp/10;
                    a[0]=temp%10;
                    
                    for (i=9;i>=1;i--)
                    {
                        if (a[i]>0)
                        {
                        lcd_putc(a[i]+48);
                        delay_us(10);
                        }
                    }
                    lcd_putc(a[0]+48);
                    delay_us(10);
                    
                    }
                    
                    void lcd_number(int32 so)//HIEN THI SO CO 3 CHU SO RA MAN HINH LCD
                      {int t;
                      unsigned char a[3];
                      //setLCD();
                    
                      a[2]=so%10;
                      so=so/10;
                      a[1]=so%10;
                      a[0]=so/10;
                      for(t=0;t<3;t++)
                         {
                         lcd_putc(a[t]+48);delay_us(10);
                         }
                      }
                    Hàm lcd_number nên dùng để hiển thị số <999 định dạng của nó sẽ là xxx . VD: lcd_number(1) sẽ hiện trên LCD là: 001
                    Hàm lcd_number2 dùng hiện số 32 bit đầy đủ các số 0 đằng trước sẽ không được in ra trên màn hình. VD: lcd_number2(12453) thì sẽ hiện ra LCD là: 12453, lcd_number2(1) sẽ hiện trên LCD là 1
                    hic cho em hỏi đoạn code "lcd_putc(a[t]+48)" tại sao lại phải cộng 48?
                    "//set lcd();" chỗ này cần để gọi cái gì ra hay chỉ là dòng chú thích?
                    ở đây so em thay bằng count trong biến đếm được không?

                    Comment


                    • #11
                      Nguyên văn bởi soulasylum Xem bài viết
                      hic cho em hỏi đoạn code "lcd_putc(a[t]+48)" tại sao lại phải cộng 48?
                      "//set lcd();" chỗ này cần để gọi cái gì ra hay chỉ là dòng chú thích?
                      ở đây so em thay bằng count trong biến đếm được không?
                      +48 để putchar nó ra đúng cái ký tự số tương ứng. cái này xem thêm bảng mã Ascii sẽ rõ.
                      //set_lcd(); là cái dòng chú thích. quên ko xóa đi
                      hai cái hàm trên tương tác với số nguyên 32 bit. bạn chỉ cần nhập lệnh
                      Code:
                      lcd_number((int32) count);
                      là được hoặc thay đổi kiểu biến trong khai báo hàm lcd_number và lcd_number2 về dạng ngắn hơn (giống kiểu biến count) để tối ưu bộ nhớ.
                      123...

                      Comment


                      • #12
                        em đã hoàn thành
                        mời các bác xem...
                        cảm ơn bác nbb3i rất nhiều...
                        đó là chỉ là một phần nhỏ...nhưng càng ngày càng thích...
                        bây giờ tiếp theo, em thực hiện project là làm một con robot đi thẳng gặp vật cản dừng lại
                        mong các bác cho em ý kiến thực hiện tiếp như thế nào
                        (vd như là điều rộng xung PWM cho hai động cơ DC có gắn encoder chuột bi bằng và hỗ trợ cho nhau, sensor v...v...)
                        rất thanks các bác
                        Attached Files

                        Comment


                        • #13
                          OK rồi thì cứ thẳng tay làm tiếp đi
                          123...

                          Comment


                          • #14
                            híc nhưng đến đây thì làm sao tiếp mới là quan trọng ....bác nào giúp em típ làm bứoc nào với

                            Comment


                            • #15
                              thui vậy, các bác bầy cho em cách điều chỉnh động cơ đi thẳng
                              điều chế xung bằng nhau hay hỗ trợ cho nhau?
                              thuật toán ntn?

                              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