logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C][Atmega8] - zapis i odczyt eeprom.

regrom 26 Wrz 2010 21:24 12172 8
  • #1 8554102
    regrom
    Poziom 16  
    Witam, korzystam z WinAVR oraz AVR Studio.

    Napisałem dwie proste funkcje:

    
    void zapisz( uint8_t pozycja, uint8_t wartosc )
    {
       eeprom_busy_wait();
       eeprom_write_byte(&pozycja,wartosc);
    } 
    
    char odczyt(uint8_t pozycja)
    {
    eeprom_busy_wait();
    return eeprom_read_byte(&pozycja);
    }
    


    Wiem, że ATmega posiada 512 bajtów, ale nie wykorzystam tyle stąd zmienna pozycja jest 8 bitowa.

    Do rzeczy o co mi chodzi, zapis w programie i odczyt działa. Jednak chce zobaczyć co zostało zapisane w eepromie.
    Odczytuje eeprom przez programator i widzę cały czas tylko to:
    [C][Atmega8] - zapis i odczyt eeprom.

    Możecie mi wytłumaczyć jak odczytać zmienne które zapisałem w eepromie? Zapisu dokonywałem na pierwszych adresach, 0x00 do 0x04 i coś tam jest bo jak zaprogramuje Atmegę, tylko żeby pobrała dane spod tych adresów to odczytuje poprawnie.
  • Pomocny post
    #2 8555252
    grzewoj
    Poziom 27  
    Aby zapisywać i odczytywać zmienne z wbudowanej pamięci EEPROM musisz zadeklarować jakąś zmienną w tej pamięci

    http://avr.elektroda.eu/node/3

    W tej chwili zapisujesz i odczytujesz jakąś przypadkową zmienną w pamięci SRAM
  • #3 8556099
    regrom
    Poziom 16  
    Dziękuje kolego rozjaśniłeś mi sytuacje zrobiłem tak:

    uint8_t eeprom_val[512] __attribute__((section(".eeprom")));
    
    void zapisz(uint8_t pozycja, uint8_t wartosc )
    {
       eeprom_busy_wait();
       eeprom_write_byte(&eeprom_val[pozycja],wartosc);
    } 
    
    char odczyt(uint8_t pozycja)
    {
    eeprom_busy_wait();
    return eeprom_read_byte(&eeprom_val[pozycja]);
    }
    


    [C][Atmega8] - zapis i odczyt eeprom.

    Działa, mogę teraz odczytać wartość przez programator, adresuje komórki poprzez index tablicy, czy takie rozwiązanie jest poprawne?
  • Pomocny post
    #4 8556125
    grzewoj
    Poziom 27  
    Skoro działa to jak najbardziej poprawnie :-) Możesz też zadeklarować zmienną typu rekordowego czyli struct i pogrupować w niej inne zmienne, wtedy program będzie bardziej przejrzysty. Generalnie nie powinno się alokować kilku osobnych zmiennych w pamięci EPPROM gdyż po zmianie układu kompilator może je inaczej rozlokować i wtedy zapisane wcześniej dane będą nieprawidłowo odczytane.
  • #5 8556161
    regrom
    Poziom 16  
    No tak, będzie lepiej to wyglądać ;) jednak w tej chwili aż tak nie jest mi to potrzebne, za dużo tam nie zapisuje, do tej pory nie korzystałem z epprom, lecz w końcu kiedyś trzeba, także dziękuje że wyjaśniłeś mi tą podstawową rzecz.

    pozdrawiam.
  • #6 8563963
    cz_e_ch_u
    Poziom 10  
    oo właśnie tego szukałem. chciałbym się jeszcze dowiedzieć jak by miała ta wspomniana struktura wyglądać bo nie bardzo mam pomysł na to ?

    takie cos ??
    
    typedef struct struczas{
    int min;
    int godz;
    int dzienmies;
    int mies;
    int rok;
    uint8_t eeprom_val __attribute__((section(".eeprom")));
    };
    


    nie wiem nawet czy to działa wiec sie nie śmiejcie
  • #7 8564107
    grzewoj
    Poziom 27  
    Usuń w ostatniej linii deklarację "uint8_t" nie jest potrzebna. Jeśli nie wiesz czy działa to spróbuj :-)

    
    typedef struct struczas{ 
    int min; 
    int godz; 
    int dzienmies; 
    int mies; 
    int rok; 
    };
    
    struczas czas eeprom_val __attribute__((section(".eeprom"))); 
    
    


    Powinno zadziałać, używasz zmiennej czas, odczytujesz bajty za pomocą instrukcji "eeprom_read_byte()"
  • #8 8568205
    cz_e_ch_u
    Poziom 10  
    Wrzucam działający kod może się komuś przydać bo ja sie oszukałem i o kombinowałem jak głupi, jest dużo przykładów z błędami w necie

    Deklaracja
    
    typedef struct  {
         uint8_t h;
         uint8_t m;         
         uint8_t s;   
    } czas;
    
    czas ee EEMEM;
    czas ram;
    


    zapis
    eeprom_busy_wait();
    eeprom_write_block(&ram, &ee, sizeof(ram));


    odczyt
    eeprom_busy_wait();
    eeprom_read_block(&ram,&ee, sizeof(ram));


    zastrzeżenia mile widziane
  • #9 8575583
    ginar
    Poziom 21  
    przy zapisie powinieneś uważać na przerwania,

    zapis
    
    uint8_t uiStatusSREG = SREG;
    cli();
    eeprom_busy_wait();
    eeprom_write_block(&ram, &ee, sizeof(ram));
    SREG|=uiStatusSREG&0x80; 
    
REKLAMA