Thông báo

Collapse
No announcement yet.

Sử dụng eeprom của AVR

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

  • Sử dụng eeprom của AVR

    Đề tài của e là: Nhận một chuổi ký tự("Hello word") từ cổng COM RS232 lưu vào bộ nhớ eeprom của AVR, sau đó sử dụng một nút nhấn thực hiện lênh đọc chuỗi ký tự đó từ eeprom ra LCD. E mới viết được phần khung:
    Code:
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <avr/eeprom.h>
    #include "lcd_lib.h"

    //Dinh nghia cac cong va cac chan tin hieu
    #define BPORT PORTC //Port D noi voi cac nut ban phim
    #define BPIN PINC
    #define BDDR DDRC
    #define BUTTON 0


    int main(void){
    //set baud, 57.6k ung voi f=8Mhz
    UBRRH=0;
    UBRRL=8;
    //set khung truyen va kich hoat bo nhan du lieu
    UCSRA=0x00;
    UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//cho phep ca 2 qua trinh nhan va//truyen, va cho phep ngat sau khi nhan xong
    sei(); //cho phep ngat toan cuc
    //LCD
    init_LCD();
    clr_LCD();

    while(1){
    }
    }
    ISR(SIG_UART_RECV){ //trinh phuc vu ngat USART hoan tat nhan

    }

    Ai biết lập trình giúp e với.
    tks mọi người trước nha...
    Attached Files

  • #2
    không có pác nào giúp bạn này à, em cũng mới tìm hiểu, chưa chịu đọc phần tài liệu về eeprom lên đành chịu, có lẽ các pác chỉ cần chỉ cho cách lưu dữ liệu và đọc dữ liệu và ra của eeprom cũng thỏa mãn cho tụi em lắm ạ.
    chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
    Everything should be made as simple as possible, but not simpler

    Comment


    • #3
      em làm 89 xxx rồi chuyển qua avr thì cũng mới làm được xuất dữ liệu ra thôi nhưng cũng oánh được con matran 3 mầu mai em trình dien nhé, em thấy con avr hay quá mà ae trên diễn đàn ít quan tâm hơn con 89xxx , chắc có lẽ nó đắt hơn 1 tít và cũng không thông dụng bằng chăng ?
      chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
      Everything should be made as simple as possible, but not simpler

      Comment


      • #4
        Nếu dùng winavr như của bạn chủ thớt thì khi ghi eeprom dùng lệnh
        Code:
        eeprom_read_byte
        eeprom_read_word
        eeprom_read_dword
        eeprom_read_block
        Tương tự với write
        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
        Xem thêm tại Online Store ---> Click here
        Mob: 0982.083.106

        Comment


        • #5
          em đã đọc trên đây và thấy có pác trích trong help của codevision như thế này:
          Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the keyword eeprom.

          Example:

          /* The value 1 is stored in the EEPROM during chip programming */

          eeprom int alfa=1;

          eeprom char beta;

          eeprom long array1[5];

          /* The string is stored in the EEPROM during chip programming */

          eeprom char string[]=”Hello”;

          void main(void) {
          int i;

          /* Pointer to EEPROM */
          int eeprom *ptr_to_eeprom;

          /* Write directly the value 0x55 to the EEPROM */
          alfa=0x55;

          /* or indirectly by using a pointer */

          ptr_to_eeprom=&alfa;

          *ptr_to_eeprom=0x55;

          /* Read directly the value from the EEPROM */
          i=alfa;
          /* or indirectly by using a pointer */
          i=*ptr_to_eeprom;
          }
          Pointers to the EEPROM always use 16 bits.
          pác tham khảo nhé. em thì cũng hiểu chút rồi.
          chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
          Everything should be made as simple as possible, but not simpler

          Comment


          • #6
            Giải thix thêm 1 chút: nếu bạn dùng Winavr thì thêm thư viện #include <avr/eeprom.h>
            uint8_t eeprom_read_byte (const uint8_t *addr)
            void eeprom_write_byte (uint8_t *addr, uint8_t value)
            uint16_t eeprom_read_word (const uint16_t *addr)
            void eeprom_write_word (uint16_t *addr, uint16_t value)
            void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
            void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)
            byte là 1 byte
            word là 2 byte
            block thì độ dài tùy ý có thể lập trình được.
            Theo bạn yêu cầu thì dùng cái block.
            LCD xuất mã ascii nên 1 chuỗi ký tự thì chỉ cần 2 biến là vị trí bắt đầu và độ dài.

            Comment


            • #7
              Nguyên văn bởi daohuytien Xem bài viết
              em đã đọc trên đây và thấy có pác trích trong help của codevision như thế này:
              Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the keyword eeprom.

              Example:

              /* The value 1 is stored in the EEPROM during chip programming */

              eeprom int alfa=1;

              eeprom char beta;

              eeprom long array1[5];

              /* The string is stored in the EEPROM during chip programming */

              eeprom char string[]=”Hello”;

              void main(void) {
              int i;

              /* Pointer to EEPROM */
              int eeprom *ptr_to_eeprom;

              /* Write directly the value 0x55 to the EEPROM */
              alfa=0x55;

              /* or indirectly by using a pointer */

              ptr_to_eeprom=&alfa;

              *ptr_to_eeprom=0x55;

              /* Read directly the value from the EEPROM */
              i=alfa;
              /* or indirectly by using a pointer */
              i=*ptr_to_eeprom;
              }
              Pointers to the EEPROM always use 16 bits.
              pác tham khảo nhé. em thì cũng hiểu chút rồi.
              Ở đây đang muốn bàn luận với winavr (hoặc avr-gcc) còn với codevision thì chỉ cần khai báo biến với từ khóa eeprom là dùng như một biến bình thường. CV sẽ tự dịch ra mã lệnh để ghi đọc vào eeprom.
              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
              Xem thêm tại Online Store ---> Click here
              Mob: 0982.083.106

              Comment


              • #8
                như bác VNarmy nói đúng đó, nếu dùng codevision thì mình chỉ cần khai báo với từ khóa eeprom là trình biên dịch sẽ tự hiểu, cá nhân mình thấy codevision dễ dùng và khá thân thiện.
                Phone: 01676184300
                Mail:

                Comment


                • #9
                  Tình hình là chưa ai giúp e được cái chính hết. Lang thang trên mạng tìm được đoạn code này. Nhưng mà vẫn chưa write vào eeprom được. Các huynh tiếp tục chỉ giáo cho e với???
                  SIGNAL (SIG_UART_RECV)
                  {
                  //USART RX interrupt service routine
                  switch(UDR)
                  {
                  case(CMD_PING):
                  txbyte(ACK_OK);
                  CopyStringtoLCD(ACK_OK,0,0);
                  LCDgotoXY(0,1);
                  break;
                  case CMD_WRITE_EEPROM:
                  eeprom_write_byte ((uint8_t*)rxbyte(), (uint8_t)rxbyte());
                  txbyte(ACK_OK);
                  CopyStringtoLCD(CMD_WRITE_EEPROM,0,0);
                  LCDgotoXY(0,1);
                  break;
                  default:
                  txbyte(ACK_ERROR);
                  CopyStringtoLCD(ACK_ERROR,0,0);
                  LCDgotoXY(0,1);
                  break;
                  }

                  }



                  void txbyte(unsigned char data)
                  {
                  while ( !( UCSRA & (1<<UDRE)) ); //Wait for empty slot to send data
                  UDR = data; //Send it

                  }

                  unsigned char rxbyte (void)
                  {
                  while ( !(UCSRA & (1<<RXC)) ); //Wait until there is a byte to be read from RX buffer
                  return UDR; //Get it

                  }

                  Comment


                  • #10
                    Thực ra bây giờ lập trình cái gì cũng thế thôi. Câu trả lời luôn là keyword là gì. Keyword chuẩn thì sẽ tìm được framework tốt.

                    Lan man tí thế. UART thì vào đây: Peter Fleury Online: AVR Software
                    Có đầy đủ cả help.
                    AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                    Xem thêm tại Online Store ---> Click here
                    Mob: 0982.083.106

                    Comment


                    • #11
                      - Nếu bác dùng eeprom trong avr thì chỉ cần khai báo và ghi, đọc trục tiếp như một biến bình thường:
                      eeprom unsigned int led=4;
                      eeprom unsigned char phone[7] = {0x0c,0xee,0x0c,0xee,0x18,0x0c,0x88};// 0-1-2-3-4-5-6-7-8-9
                      - Nếu dùng eeprom ngoài như 24cxxx thì mới phải sử dụng các hàm trong thư viện hoặc đọc thêm về datasheet của eeprom đó mà can thiệp.

                      Comment


                      • #12
                        Nguyên văn bởi vuong321 Xem bài viết
                        Tình hình là chưa ai giúp e được cái chính hết. Lang thang trên mạng tìm được đoạn code này. Nhưng mà vẫn chưa write vào eeprom được.
                        }
                        bạn cũng là người rất chịu khó tìm tài liệu. nhưng đọc tài liệu của bạn thì.....
                        còn đề tài của bạn như vậy lên chia thành nhiều phần nhỏ đi, bạn sẽ dễ dàng ăn hơn là oánh chén một tô đầy toàn là bún, thị và sương.hehe:
                        + chương trình hiển thị lên LCD
                        + chương trình giao tiếp máy tính với VDK
                        + chương trình phím bấm
                        đầu tiên thử LCD. nếu chạy ngon rồi thì đến thử giao tiếp VDK với máy tính, lấy chuỗi nhận được hiển thị lên LCD . công đoạn tiếp theo là thử đến nút nhấn. cuối cùng là thử luu một ký tự hay một số nào vào eeprom sau đó hiển thị nó ra LCD. chúc bạn sớm tìm ra phương án giải quyết của mình
                        Last edited by daohuytien; 04-05-2013, 22:33.
                        chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                        Everything should be made as simple as possible, but not simpler

                        Comment


                        • #13
                          Nguyên văn bởi daohuytien Xem bài viết
                          bạn cũng là người rất chịu khó tìm tài liệu. nhưng đọc tài liệu của bạn thì.....
                          còn đề tài của bạn như vậy lên chia thành nhiều phần nhỏ đi, bạn sẽ dễ dàng ăn hơn là oánh chén một tô đầy toàn là bún, thị và sương.hehe:
                          + chương trình hiển thị lên LCD
                          + chương trình giao tiếp máy tính với VDK
                          + chương trình phím bấm
                          đầu tiên thử LCD. nếu chạy ngon rồi thì đến thử giao tiếp VDK với máy tính, lấy chuỗi nhận được hiển thị lên LCD . công đoạn tiếp theo là thử đến nút nhấn. cuối cùng là thử luu một ký tự hay một số nào vào eeprom sau đó hiển thị nó ra LCD. chúc bạn sớm tìm ra phương án giải quyết của mình
                          Hi. Đây mới là một phần nhỏ tô bún của mình thôi, mình cũng chia từng cộng bún ra để thử rôi. Đã text LCD chạy rồi, giao tiếp với máy tính thì cũng truyền được chuối "Hello". Vấn đề của mình là làm sao write vào eeprom(bắt buộc) va xuất ra LCD thôi???Help help

                          Comment


                          • #14
                            Bạn viết bằng codevision hay avr studio, hay winavr, mỗi loại nó có khai báo và cách viết hơi khác nhau. Nói ró mình mới chỉ được

                            Comment


                            • #15
                              Các hàm là có sẵn vấn đề là bạn giải thuật sao để sử dụng được các hàm đó thôi. Sử dụng 2 hàm
                              void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)
                              void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)
                              là giải quyết được bài toán rồi.
                              Nếu không nắm vững về con trỏ thì dùng kiểu thủ công nhất
                              + Xác định độ dài chuỗi cần ghi vào
                              + Dùng vòng lặp for (i=1;i<=size;i++) ghi từng byte vào eeprom (để tranh sai sót cho việc đọc sau này thì chèm thêm 2 byte đánh dấu khởi đầu vào kêt thúc)
                              Ví dụ: Bạn cần ghi chuỗi hello, chọn byte đánh dấu là 1 byte khó trùng nhất ví dụ 10101010 = 170 trong hệ thập phân, ghi từ ô nhớ có địa chỉ 0x01.
                              Dùng vòng for ghi từng byte lần lượt là 170|'h'|'e'|'l'|'l'|'o'|170
                              Đọc ra thì cứ theo byte đánh dấu mà đọc thôi

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X