Thông báo

Collapse
No announcement yet.

EEPROM của ATmega8

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

  • EEPROM của ATmega8

    anh VNarmy ah!
    em đang học lập trình cho con AVR. em làm một bài về ghi đọc eeprom.
    nhưng ko chạy được. anh có đoạn code mẫu nào ko. ??? anh post cho em được ko??
    Cảm ơn anh nhiều!
    |

  • #2
    Đọc/viết EEPROM trong AVR đã có nói đến rồi thì phải. Sẵn đây, mình xin giới thiệu 2 hàm dùng cho ATmega32, ATmega8 chắc cũng giống thế, bạn tham khảo thêm.
    //Viet 1 byte du lieu den dia chi cua 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;
    }
    !e

    Comment


    • #3
      cái này trong datasheet của nó đã có sẵn ví dụ rồi. Chả chịu đọc gì cả. Copy and Paste chạy luôn.

      Comment


      • #4
        Nếu dùng code vision thì chỉ cần khai báo biến kiểu eeprom là được.
        VD:
        eeprom int eVal;
        eVal=10000;
        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
          VNARMY có đùa không đấy? Không thể gán eVal=10000; được. Trình dịch sẽ báo lỗi "not alow..." gì đấy.

          Comment


          • #6
            Nguyên văn bởi hungnp Xem bài viết
            VNARMY có đùa không đấy? Không thể gán eVal=10000; được. Trình dịch sẽ báo lỗi "not alow..." gì đấy.
            Let try it.
            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


            • #7
              Xin lỗi VNARMY.
              Trích trong Help của CAVR.
              Accessing the AVR internal EEPROM is accomplished using <b>global variables</b>, 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;
              }

              Comment


              • #8
                Eeprom ????

                Nguyên văn bởi zemen Xem bài viết
                Đọc/viết EEPROM trong AVR đã có nói đến rồi thì phải. Sẵn đây, mình xin giới thiệu 2 hàm dùng cho ATmega32, ATmega8 chắc cũng giống thế, bạn tham khảo thêm.
                Code:
                //Viet 1 byte du lieu den dia chi cua 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;
                }
                Chào bạn
                ///////////////////////////////////////
                Mình có đoạn code bạn xem giúp mình
                mình không dọc đựoc dư liệu của EEPROM của ATmega8
                //////////////////////
                Code:
                /*****************************************************
                This program was produced by the
                CodeWizardAVR V1.25.8 Standard
                Automatic Program Generator
                © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
                http://www.hpinfotech.com
                
                Project : DUNG KHI CO LENH
                Version : 
                Date    : 7/28/2008
                Author  :    Doanh Dien                       
                Company : V DT VT                 
                Comments: 
                
                
                Chip type           : ATmega8
                Program type        : Application
                Clock frequency     : 11.059200 MHz
                Memory model        : Small
                External SRAM size  : 0
                Data Stack size     : 256
                *****************************************************/
                
                #include <mega8.h>
                
                #define TEST_PIN PINC.2
                // Khai bao ma LED
                 const unsigned char LED_Code[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f};
                		               /* 0    1    2    3    4    5    6    7    8    9   Hiden*/
                unsigned char tdelay,sttled,Led1,Led2,Led3;
                bit alarm_f,DOGW;
                unsigned int i,d;
                unsigned int uiAddress;
                char r[10],ucData; 
                
                //Khai bao cac thu tuc
                void Delaytms(unsigned char t);
                void showled();
                void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
                unsigned char EEPROM_read(unsigned int uiAddress);
                
                
                void Delaytms(unsigned char t)
                { 
                 tdelay=t;
                 while(tdelay!=0);
                } 
                  
                
                void showled()
                {  
                     PORTB |=0x0e;	/*Tat led1, Tat led2 va 3: xxxx.123x*/
                     if((alarm_f & DOGW)==0)
                        {
                        PORTB |=0x0e;	/*Tat led1, Tat led2 va 3: xxxx.123x*/
                        switch(sttled)
                        {
                        case 1:
                		PORTD	= Led1;
                                PORTB.3=0;	/*Bat led1, Tat led2,Tat3: xxxx.0xxx*/		
                		sttled++;
                        	break;
                        case 2:
                		PORTD	= Led2;
                                PORTB.2=0;	/*Tat led1, Bat led2,Tat3: xxxx.x0xx*/		
                		sttled++;
                        	break;
                        default:
                		PORTD	= Led3;
                                PORTB.1=0;	/*Tat led1, Tat led2,Bat3: xxxx.xx0x*/		
                		sttled	= 1;
                        	break;
                        }//case
                        }
                }
                
                // Timer 1 overflow interrupt service routine
                interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                { 
                 TCCR1B=0x00;      //Stop timer1
                 TCNT1= 0xea66;    // 4ms 
                 TCCR1B=0x02;      //Start timer1     
                 tdelay--;
                 showled(); 
                }
                
                
                //Ghi vao EEPROM
                void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
                {
                /* Wait for completion of previous write */
                while(EECR.1==1);
                /* Set up address and data registers */
                EEAR = uiAddress;
                EEDR = ucData;
                EECR.2 = 1;
                EECR.1 = 1;
                } 
                
                // Doc du lieu tu EEPROM
                unsigned char EEPROM_read(unsigned int uiAddress)
                { 
                /* Wait for completion of previous write */
                while(EECR.1==1);
                /* Set up address register */
                EEAR = uiAddress;
                /* Start eeprom read by writing EERE */
                EECR.0 = 1;
                /* Return data from data register */
                return EEDR;
                }
                
                
                /*********************************************************************************************
                /**************************   CHUONG TRINH CHINH *********************************************
                /*********************************************************************************************/
                
                void main(void)
                {
                // Declare your local variables here
                // Input/Output Ports initialization
                // Port B initialization
                // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
                // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
                PORTB=0x00;
                DDRB=0x0F;
                
                // Port C initialization
                // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                PORTC=0x00;
                DDRC=0x00;
                
                // Port D initialization
                // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In 
                // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=T 
                PORTD=0x00;
                DDRD=0xFE;
                
                // 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: 1382.400 kHz
                // Mode: Normal top=FFFFh
                // OC1A output: Discon.
                // OC1B output: Discon.
                // Noise Canceler: Off
                // Input Capture on Falling Edge
                // Timer 1 Overflow Interrupt: On
                // Input Capture Interrupt: Off
                // Compare A Match Interrupt: Off
                // Compare B Match Interrupt: Off
                
                TCCR1A=0x00;
                TCCR1B=0x02;
                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: Off
                // INT1: Off
                MCUCR=0x00;
                
                // Timer(s)/Counter(s) Interrupt(s) initialization
                TIMSK=0x04;
                
                // Analog Comparator initialization
                // Analog Comparator: Off
                // Analog Comparator Input Capture by Timer/Counter 1: Off
                ACSR=0x80;
                SFIOR=0x00;
                
                // Global enable interrupts
                
                //Doc du lieu tu EEPROM
                SREG&=0x7f;;
                TCCR1B=0x00;
                uiAddress=0x00;
                r[0]=EEPROM_read(uiAddress);
                TCCR1B=0x02;
                SREG|=0x80;
                     while (1){
                               for(i=r[0];i<200;i++){              
                                Delaytms(250);
                 if(TEST_PIN==0){  ucData=i;
                                   uiAddress=0x00;
                                  SREG&=0x7f; 
                                  EEPROM_write(uiAddress,ucData);
                                  SREG|=0x80;
                     while(TEST_PIN==0);
                                }
                                 //Don vi 
                                 d=i;
                                Led1=LED_Code[d%10] <<1;
                                //chuc
                                Led2=LED_Code[(d/10)%10] <<1;
                                //tram
                                Led3=LED_Code[(d/100)%10] <<1;
                                                }
                                      
                }}
                Last edited by VNarmy; 07-08-2008, 19:05.
                |

                Comment


                • #9
                  Mong mọi người trong diễn dàn giúp mình??
                  mình đọc datasheet của nó thấy bảo phải xóa tất cả các ngắt trước khi
                  Ghi và đọc????
                  Mình thư đoạn code trong datasheet
                  và đoạn code của anh zemen
                  nhưng ko được???

                  Anh em trong diễn đàn giúp em với
                  Đọc mãi datasheet. em bi giờ loạn lên
                  Last edited by VNarmy; 07-08-2008, 19:11.
                  |

                  Comment


                  • #10
                    Bạn có một số lỗi sai:
                    + hàm Delaytms()
                    void Delaytms(unsigned char t)
                    {
                    tdelay=t;
                    while(tdelay!=0); // bị can thiệp với biến sử dụng trong ngắt., nếu muốn dùng phải sửa thành while(tdelay--);
                    }

                    Bạn không cần phải tạo hàm delay, trong thư viện của Codevision có sẵn thư viện delay.h rồi. bạn chỉ cần khai báo và dùng là xong. Ví dụ muốn trễ 2 ms như sau: delay_ms(2); tương tự cũng có trễ micro giây delay_us(200);


                    Trong ngắt không nên để hàm hoặc đoạn code dài, chuyển hàm hiển thị về hàm main();
                    Hàm đọc và ghi eeprom của bạn không sai, chỉ có phần bạn gọi và sử dụng không đúng thôi. Bạn viết code lại cho gọn một chút sẽ thấy ngay.



                    Bạn bỏ thanh ghi SREG đi. Nếu muốn cho phép ngắt thì dùng #asm("sei"); ngược lại cấm ngắt dùng #asm("cli");

                    Bạn ghi vào địa chỉ 0x00 một giá trị bằng 1 chẳng hạn. sau đó đọc r[0]=EEPROM_read(0x00); có trường hợp bạn ghi vào giá trị > 200 thì vòng for sẽ không có giá trị.

                    Bạn viết code hơi khó đọc.
                    Trước tiên để thử bạn phải thử phần hiển thị xem đã hiển thị đúng chưa? ví dụ cho d = 15 xem có hiển thị đúng hay không?
                    Nếu sai bạn phải kiểm tra lại phần hiển thị.
                    Sau khi khẳng định phần hiển thị tốt, tiến hành kiểm tra ghi đọc eeprom:
                    đầu tiên ghi vào eeprom địa chỉ 0x01 chẳng hạn, với giá trị bất kì như 12. sau đó đọc dư liệu từ eeprom ra và hiển thị giá trị vừa đọc được. Nếu không hiển thị đúng lúc đó bạn kiểm tra lại phần đọc hoặc gán giá trị sau khi đọc từ eeprom cho phần hiển thị không đúng. Bạn kiểm tra lại và viết code gọn theo từng phần một chút để dễ kiểm soát hơn.
                    Bạn thử test đọc eeprom bằng cách ghi một giá trị vào một địa chỉ sau đó đọc giá trị đó và hiển thị. Nếu giá trị đúng lúc đó bạn không phải quan tâm đến eeprom.
                    Last edited by minhhieu; 07-08-2008, 19:42.
                    n
                    ĐT: 0986 492 489

                    Tham khảo:

                    Comment


                    • #11
                      Đã dùng cavr thì chỉ cần khai thêm từ khóa eeprom là đc. Cần gì phải chạy đoạn mã như của datasheet đâu. Bây giờ em lập một project mới và ghi một giá trị bất kỳ vào rồi tắt đi đọc lại xem.
                      Mọi vấn đề về eeprom có thể mở ví dụ trong thư mục examples của cavr.
                      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


                      • #12
                        Nguyên văn bởi VNarmy Xem bài viết
                        Đã dùng cavr thì chỉ cần khai thêm từ khóa eeprom là đc. Cần gì phải chạy đoạn mã như của datasheet đâu. Bây giờ em lập một project mới và ghi một giá trị bất kỳ vào rồi tắt đi đọc lại xem.
                        Mọi vấn đề về eeprom có thể mở ví dụ trong thư mục examples của cavr.
                        Đúng công nhận làm theo cách này rất hay. Nhưng mình có thắc mắc là nếu muốn ghi 100 byte dữ liệu riêng biệt vào địa chỉ từ 0x0010 trở đi dùng theo kiểu biến như của bác VNarmy thì dùng như thế nào? và đọc một địa chỉ chẳng hạn là 0x0016 thì đọc như thế nào? Cảm ơn nhiều!
                        n
                        ĐT: 0986 492 489

                        Tham khảo:

                        Comment


                        • #13
                          Bạn có thể dùng con trỏ. Xem ví dụ trong thư mục example.
                          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


                          • #14
                            dữ liệu em muốn lưu vào eprom chỉ là số đếm vậy có nhất thiết phải khai báo biến dữ liệu là char không ạ, có thể khai báo dạng int khôg ạ?
                            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


                            • #15
                              Vẫn khai báo được. nếu là kiểu int thì giá trị sẽ được lưu vào 2 ô liên tiếp. nếu là kiểu long int sẽ lưu 4 ô liên tiếp.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                                Hôm qua, 13:11
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                                Hôm qua, 09:25
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                                Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                                Hôm qua, 09:10
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                09-01-2025, 19:44
                              • viettinh
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi viettinh
                                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                09-01-2025, 18:12
                              • nguyendinhvan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi nguyendinhvan
                                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                Cách đơn giản...
                                09-01-2025, 00:04
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                08-01-2025, 19:02
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                08-01-2025, 15:43
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                08-01-2025, 15:28
                              • mèomướp
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi mèomướp
                                Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                                08-01-2025, 11:44
                              Đang tải...
                              X