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

[ATMEGA162][AVRGCC] zapis i odczyt string w EEPROM

pmmisiek 31 Mar 2010 19:16 2338 3
REKLAMA
  • #1 7903846
    pmmisiek
    Poziom 15  
    Witam,

    Mam problem z zapisem i odczytem do EEPROM łancucha zmiennych typu char
    Atmega162, avrgcc, program symuluje w winavr + hapsim + virtual port kit


    
    char ipaddress[16];
    char ipaddress_odczytany[16];
    char portnumber[6];
    char portnumber_odczytany[6];
    char phonenumber[11];
    char phonenumber_odczytany[11];
    
    
    static EEMEM char ipaddress_ee[16];
    static EEMEM char portnumber_ee[6];
    static EEMEM char phonenumber_ee[11];
    
    //zapis do eepromu np. ip=192.168.001.100
    
    for(i=0;i<17;i++)
    {
    	eeprom_write_byte(&ipaddress_ee[i], ipaddress[i]);
    	eeprom_busy_wait();
    }
    
    for(i=0;i<7;i++)
    {
    	eeprom_write_byte(&portnumber_ee[i], portnumber[i]);
    	eeprom_busy_wait();
    }
    
    for(i=0;i<12;i++)
    {
    	eeprom_write_byte(&phonenumber_ee[i], phonenumber[i]);
    	eeprom_busy_wait();
    }
    
    
    //odczyt z eepromu
    
    for(i=0;i<17;i++)
    {
    	ipaddress_odczytany[i]=eeprom_read_byte(&ipaddress_ee[i]);
    }
    
    for(i=0;i<7;i++)
    {
    	portnumber_odczytany[i]=eeprom_read_byte(&portnumber_ee[i]);
    }
    
    for(i=0;i<12;i++)
    {
    	phonenumber_odczytany[i]=eeprom_read_byte(&phonenumber_ee[i]);
    }



    Zmienne odczytane z eepromu wysyłam przez uart. Odczytywana jest jedynie ostatnia zapisana zmienna, wcześniejsze są puste (nie są wyświetlane żadne znaki). Jeśli usunę fragment kodu odpowiedzialny za zapis ostatniej zmiennej do EEPROM (phonenumber) to wtedy poprawnie zapisywana i odczytywana jest wcześniejsza zmienna czyli portnumber.

    Proszę o jakieś sugestie.
  • REKLAMA
  • Pomocny post
    #2 7903993
    tadzik85
    Poziom 38  
    Za długie pętle lub za krótkie tablice zmiennych.
  • REKLAMA
  • #3 7905361
    pmmisiek
    Poziom 15  
    Dziękuję kolego, odpowiedź krótka i na temat.

    Pętle zapisu były za długie o jeden znak - uwzględniłem znak końca łańcucha ale podczas liczenia znaków liczyłem od jeden zamiast od zera, stąd liczba znaków wyszła o jeden za duża.

    Pozdrawiam
  • #4 7906574
    tadzik85
    Poziom 38  
    Przy operacjach na stringach zamiast operować pętlami for na tablicach o stałej długości lepiej zostawać pętle while działająca tak długo dopóki nie odnajdzie znaku końca stringa.
REKLAMA