Thông báo

Collapse
No announcement yet.

Ghi ,đọc EEPROM mega16

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

  • Ghi ,đọc EEPROM mega16

    Chào các bác mong được sớm giúp đỡ:
    Mình làm chương trình ghi đọc eeprom chương trình của mình như sau:
    Code:
    #include<avr/io.h>
    #include<avr/iom16.h>
    #include<D:\HamLCD.h>
    void EEPROM_write(unsigned int diachi,unsigned char data)
      {
         //doi cho den khi du lieu truoc duoc ghi xong(kiem tra xem EEWE co bang 0 hay khong)
        //EEWE=0 ghi xong,EEWE=1 chua xong
       while(EECR & (1<<1))
         ;
       //thiet lap dia chi va thanh ghi du lieu
       EEAR = diachi;
      // EEARH=0x00;
       EEDR=data;
      //EEMWE=1  cho phep ghi du lieu len eeprom khi EEWE=1;
      //EEMWE=0 khi EEWE=1 du lieu cung khong dc ghi
      EECR |=(1<<2);
      //bat dau ghi vao eeprom bang cach thiet lap EEWE
      EECR |=(1<<1);
      }
    unsigned char EEPROM_read(unsigned int diachi)
     {
      //doi cho den khi qua trinh ghi duoc hoan thanh
     while(EECR & (1<<1))
       ;
     // thiet lap thanh ghi dia chi
     EEAR = diachi;
     //EEARH =0x00;
    //bat dau doc eeprpm bang cach thiet lap EERE
    EECR |= (1<<0);
    //dua du lieu vao thanh ghi du lieu
    return EEDR;
    }
    
    void main()
    {
     unsigned char data1,data2;
     //PORTA=0x00;
    //DDRA=0xFF;
    
    // Port B initialization
    PORTB=0x00;
    DDRB=0xFF;
    
    // Port C initialization
    //PORTC=0x00;
    //DDRC=0xFF;
    
    PORTD=0xFF;
    DDRD=0x00;
    
     khoitaoLCD();
     while(1)
      {
       In_chuoi(0x80,"start*");
       //In_chuoi(0xC0,"4 ghi,5 doc*");
       
             
      if(!(PIND &(1<<5)))//khi nhấn phím ở PORTD.5 thì bắt đầu ghi eeprom
         {
          EEPROM_write(0x0002,234);
            
         In_chuoi(0x86,"vua vao*");
         
         
         //In_So_4(0xCB,EEPROM_read(0x03));
        }
        data1=EEPROM_read(0x0001);
        data2=EEPROM_read(0x0002);
                  In_So_4(0xC,data1);
         In_So_4(0xC7,data2);//hien thi eeprom lên LCD
       }
    }
    Last edited by VNarmy; 28-09-2008, 14:50.

  • #2
    mình ghi vào eeprom là :EEPROM_write(0x0002,234); nhưng sao khi đọc ra lai là 255,mình thay 234 bằng các số khác là 1,2,3,4.. vẫn thu được là 255 sao vậy các bác nhỉ,mong cao thủ sớm giúp đỡ cho tui đỡ mất ngủ...

    Comment


    • #3
      Giá trị mặc định eeprom của nhà sản xuất là 0xFF=256d. nếu bạn ghi vào 234 mà đọc ra là 256 có nghĩa bạn chưa ghi được giá trị 234 vào. Bạn tìm box ghi, đọc eeprom của Atmega8 mà xem thêm ,ở đấy đã trao đổi về vấn đề này rồi hoặc viết hàm ghi đọc như trong datasheet của ATMEGA16(Trang 21,22) là chạy ngay.

      Comment


      • #4
        Thì đoạn code trên mình lôi trong datasheet ra mờ.

        Comment


        • #5
          nếu dùng codevisionavr v2 trở đi có thể dùng cách khai báo biến kiểu eeprom để ghi đọc. ví dụ:

          eeprom unsigned char i @0x02; // lưu tại địa chỉ 0x02 trong eeprom
          unsigned char j;

          i = 234; // ghi giá trị 234 vào eeprom tương ứng lệnh EEPROM_write(0x02,234);

          j = i; // đọc giá trị trong eeprom và gán cho j. j lúc này bằng 234.tương ứng lệnh EEPROM_read(0x02);
          n
          ĐT: 0986 492 489

          Tham khảo:

          Comment


          • #6
            Các pác xem cái đoạn chương trình của em ở chỗ này có đúng không:
            if(!(PIND & (1<<4))//nhấn phím PORTD5 để bắt đầu ghi eeprom
            {
            EEPROM_write(0x02,123);
            }
            sau khi nhấn phím này đáng lẽ ra chương trình sẽ gọi hàm viết eeprom để thực hiện viết 123 vào bộ nhớ eeprom,nhưng khi em đọc ra thì nhânj được là 255 tức là giá trị ban đầu khi chưa ghi gì vào của eeprom ,đau đầu quá,các pác xem cái đoạn code của em xem sao.Có thấy lỗi chỗ nòa hok!

            Comment


            • #7
              Sao không viết theo kiểu này có phải đơn giản hơn không?
              if(!PIND.5)
              {
              EEPROM_write(0x02,123);
              }
              Trong câu lệnh của bạn phải thay phép ! bằng ~. Vì ! lấy đảo một bít. còn của bạn lấy đảo của một byte thì phải dùng ~

              Comment


              • #8
                thì (PIND & (1<<4)) là cho PORTD.4=1 mà,còn !(PIND & (1<<4))) là cho bít này =0 .Em muốn hỏi là làm tại sao khi nhấn phím thì cái hàm EEPROM_write(0x02,123) nó không hoạt động,em kiểm tra rồi chắc chắn là khi nhấn phím thì chương trình sẽ làm việc với đoạn chương trình trong phím nhấn,vậy thì tại sao ko ghi được vào eeprom,có nguyên nhân gì ngoài lỗi lập trình không nhỉ.

                Comment


                • #9
                  Nguyên văn bởi hungnp Xem bài viết
                  Trong câu lệnh của bạn phải thay phép ! bằng ~. Vì ! lấy đảo một bít. còn của bạn lấy đảo của một byte thì phải dùng ~
                  bác này về đọc lại về lập trình C.
                  Nguyên văn bởi btbk244 Xem bài viết
                  thì (PIND & (1<<4)) là cho PORTD.4=1 mà,còn !(PIND & (1<<4))) là cho bít này =0 .Em muốn hỏi là làm tại sao khi nhấn phím thì cái hàm EEPROM_write(0x02,123) nó không hoạt động,em kiểm tra rồi chắc chắn là khi nhấn phím thì chương trình sẽ làm việc với đoạn chương trình trong phím nhấn,vậy thì tại sao ko ghi được vào eeprom,có nguyên nhân gì ngoài lỗi lập trình không nhỉ.
                  Nói chung kiểm tra sơ qua thì thấy đúng hết. Nếu nó ko đc thì có thể IC bị toi phần 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


                  • #10
                    To pác VNarmy:Theo góp ý của bác ngày mai em đi mua con mega khác về làm lại xem sao!!!

                    Comment


                    • #11
                      He he, bác dùng eeprom trong bụng con Atmega à? Cái này bác làm thế thì phức tạp quá vì nếu bác dùng Codevision thì nó hỗ trợ rồi mà. Bác xem lại phần eeprom mẫu trong codevision cái đi, chỉ cần khai báo:
                      eeprom unsigned char i;
                      là tự nó sẽ đặt biến i vào một địa chỉ nhất định trong eeprom, sau đó ta chỉ cần gọi nó ra sử dụng như biến trên ram thôi.

                      Comment


                      • #12
                        khổ quá tìm mãi mà ko thấy cái hàm eepromm của codevision đâu cả.Đang bực mình thử làm mô phỏng với chương trình trên thì thấy khi nhấn phím PORTD.5 để ghi vào eeprom thì vi điều khiển không chạy nữa.hic chẳng nhẽ cái eeprom của con vi điều khiển mô phỏng cũng hỏng à pác VNarmy

                        Comment


                        • #13
                          Với CV bác chỉ cần khai báo VD: eeprom unsigned char a @0x01;
                          Là nó sẽ hiểu biến a bác lưu vào eep ở địa chỉ 0x01, khi bác gọi nó ra chỉ việc gọi như biến trong RAM thông thường
                          VD: b=a; // tuong duong ham` Doc eeprom
                          a=b; // tuong duong ham` Ghi eeprom
                          *** Thành viên không biết gì về điện ***

                          Comment


                          • #14
                            btbk244 gửi code và file mô phỏng vào hungnp82@gmail.com. Mình sẽ xem giúp bạn.

                            Comment


                            • #15
                              Bạn Hungnp thân mến mình gửi file mô phỏng và phần lập trình của mình lên đây cho mọi người xem thử luôn.Mô phỏng bằng proteus,còn phần mềm viết bằng avrstudio.mophong.rar

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X