Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

EEPROM odczyt i zapis C ,gdzie znowu blad w kodzie

dturczak 06 Aug 2007 23:21 1469 6
  • #1
    dturczak
    Level 19  
    zapis do eeproma w atmedze16
    Code:

    void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
    {
       while(EECR & (1<<EEWE));
       EEAR = uiAddress;
       EEDR = ucData;
       EECR |= (1<<EEMWE);
       EECR |= (1<<EEWE);
    }

    unsigned char EEPROM_read(unsigned int uiAddress)
    {
       while(EECR & (1<<EEWE));
       EEAR = uiAddress;
       EECR |= (1<<EERE);
       return EEDR;
    }

          EEPROM_write(5,0x41);
          dana(EEPROM_read(5);); //wyswietl na lcd ten kod ascii




    gdzie robie znowu blad ? :/
    same jedynki do pamieci mi zapisuje...
    atmega16 , 8Mhz, Avr Studio
    sumulac miedzy EECR |= (1<<EEMWE);
    EECR |= (1<<EEWE);
    mam jakies 11 cykli :(
    przerwan tez nie mam wlaczonych ;)
  • #2
    zerpo
    Level 22  
    Często się zdarza ponieważ, że dane z początkowych ok. 100 adresów są błędnie zpisywane/odczytywane.
    Spróbuj (jeśli tego nie robiłeś) zapisywać do adresów dalszych, może koło 200...
    Oprócz tego kod wygląda OK, jak w dokumentacji :-)
  • #3
    zumek
    Level 39  
    zerpo wrote:
    Często się zdarza ponieważ, że dane z początkowych ok. 100 adresów są błędnie zpisywane/odczytywane.

    Pierwsze słyszę :|
    O "kłopotach" z komórką 0 - coś mi sie o oczy obiło , ale że 100 :?:
    To w "małych" atmelkach , gdzie jest tylko 64 B eepromu , byłby on bezużuteczny :(
    zerpo wrote:

    Oprócz tego kod wygląda OK, jak w dokumentacji :-)

    No prawie ;)
    Dokumentacja Atmela wspomina również , o warunku max 4 cykli pomiędzy ustawieniem bitu EEMWE i EEWE.Jeśli używasz GCC i masz wyłączoną optymalizację , to wygenerowany kod tego warunku nie spełnia :|
    Bez optymalizacji:
    Code:

    39:          EECR |= (1<<EEMWE);
    +000000AB:   E3AC        LDI     R26,0x3C         
    +000000AC:   E0B0        LDI     R27,0x00         
    +000000AD:   E3EC        LDI     R30,0x3C         
    +000000AE:   E0F0        LDI     R31,0x00         
    +000000AF:   8180        LDD     R24,Z+0         
    +000000B0:   6084        ORI     R24,0x04         
    +000000B1:   938C        ST      X,R24            ;zapis bitu EEMWE
    40:          EECR |= (1<<EEWE);
    +000000B2:   E3AC        LDI     R26,0x3C         
    +000000B3:   E0B0        LDI     R27,0x00         
    +000000B4:   E3EC        LDI     R30,0x3C         
    +000000B5:   E0F0        LDI     R31,0x00         
    +000000B6:   8180        LDD     R24,Z+0         
    +000000B7:   6082        ORI     R24,0x02         
    +000000B8:   938C        ST      X,R24            ;zapis bituEEWE
    +000000B9:   9623        ADIW    R28,0x03         
    +000000BA:   B60F        IN      R0,0x3F         
    +000000BB:   94F8        CLI                     
    +000000BC:   BFDE        OUT     0x3E,R29         
    +000000BD:   BE0F        OUT     0x3F,R0         
    +000000BE:   BFCD        OUT     0x3D,R28         
    +000000BF:   91DF        POP     R29             
    +000000C0:   91CF        POP     R28             
    +000000C1:   9508        RET 

    Jak widać na powyższym , nici z zapisu :(
    Poza tym , po co pisać własne(?) procedury , skoro można skorzystać z gotowych , umieszczonych w eeprom.h :?:

    Piotrek
  • #4
    dturczak
    Level 19  
    no mozna... o ile funkcje dzialaja ;)

    robie tak :

    while(eeprom_is_ready());
    eeprom_write_byte(5,0x41);
    while(eeprom_is_ready());
    unsigned char gg;
    gg=eeprom_read_byte(5);

    te while to tylko i wylacznie dla pewnosci
    bo za chiny nie chce dzialac...
    nadal nic... :(
    da sie to jakos obejsc w winavr..
    nie wierze ze nie da sie tego obsluzyc...
    kompiluje w avr-gcc
  • #5
    zumek
    Level 39  
    dturczak wrote:
    no mozna... o ile funkcje dzialaja ;)

    robie tak :
    Code:

          while(eeprom_is_ready()); // czy Ty aby na pewno rozumiesz co robi ta linia ???
          eeprom_write_byte(5,0x41);// czy 1-szy parametr jest na pewno odpowiedniego typu :?: :(

    dturczak wrote:

    kompiluje w avr-dude

    Chyba ładujesz program do flash-a :?:
    Czy kompilator nie "wywala" ostrzeżeń :?:
    Przecież z GCC korzysta masa ludzi i niepodobna by taki prosty przykład nie działał :(
    Próbowałeś zapisać do eepromu jakieś dane za pomocą programatora , a odczytać je w kodzie , itd... :?:

    Jestem zawiedziony ;)
    Piotrek
  • #6
    dturczak
    Level 19  
    dziala,panowie i panie...
    1.avr studio kompilowal mi hex z innego programu (przeoczenie :P)
    2. eeprom_is_ready() wystawia 1 a nie 0 kiedy pamiec jest gotowa...


    Code:
    #include <avr/eeprom.h>
    

    eeprom_write_byte(5,0x41);
    while(eeprom_is_ready()==0);
    unsigned char gg;
    gg=eeprom_read_byte(5);


    tak nawiasem mowiac ,w jakich wypadkach nalezaloby sprawdzac gotowosc pamieci ,przed kazda operacja , czy tylko przy przypadku powyzej?

    Zumek,juz nie musisz byc zawiedzony ;)
  • #7
    scrobik
    Level 10  
    To jest definicja makra uzycia eeprom dla atiny2313. Zostala zaczerpnieta z dokumentacji avr. Moze sie przyda


    Code:


    #define _EEGET(VAR,ADR)/* Read data in EEPROM address ADR into variable VAR
    */ \
    { \
    while(EECR & 0x02); /* Check if EEPROM is ready*/ \
    EEAR = (ADR); /* Write EEPROM address register*/ \
    EECR |= 0x01; /* Set the read strobe*/ \
    (VAR) = EEDR; /* Read the data into variable in the next cycle */ \
    }
    #define _EEPUT(ADR,VAL) /* Write data in VAL into EEPROM address ADR*/\
    {\
    while(EECR&0x02); /* Check if EEPROM is ready*/ \
    EEAR = (ADR); /* Write EEPROM address register*/ \
    EEDR = (VAL); /* Write EEPROM data register*/ \
    EECR |= 0x04; /* Set master write enable signal*/ \
    EECR |= 0x02; /* Set write strobe*/ \
    }