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

ATMEGA8: Zapis unsigned char do EEPROM nie działa po wgraniu programu

kotecek 16 Wrz 2005 23:21 1743 7
REKLAMA
  • #1 1824683
    kotecek
    Poziom 11  
    Posty: 29
    Pomógł: 1
    Czy ktos zna rozwiazanie problemu:
    chce zapisac do EEPROMu w ATMEGA8 kilka "unsigned char" w rozne miejsca. Procedurki napisane sa na podstawie podanych w dokumentacji str. 20. Wszystko sie kompiluje, linkuje itd. (Dostaje gotowy *.hex) Korzystam z avr-gcc i symuluje dzialanie w VisualMicroLab - wszystko dziala. Wgrywam do procka i nic. Program sie wykonuje, a w EEPROMie nic sie nie pojawia.

    Gdzie blad??? Pomocy!
  • REKLAMA
  • #2 1824829
    soft.sc
    Poziom 17  
    Posty: 142
    Pomógł: 15
    Ocena: 4
    Procedury z noty są jak najbardziej prawidłowe i działające. Jako adres wstawiam stałe i u mnie wszystko działa bez pudła. Np:
       if (EEPROM_read(EE_STATUS) != STATUS) {
          EEPROM_write(EE_STATUS, STATUS);
          .....
       };    
    
  • REKLAMA
  • #3 1824873
    kotecek
    Poziom 11  
    Posty: 29
    Pomógł: 1
    Wstawilem "zywcem":). Podstawilem konkretne wartosci. Na symulatorze dziala, w realu nie. Powinno zapalic diodke gdy zapisze, ale nic sie nie dzieje. Podgladam tez EEPROM w Bascomie i nic nie zapisalo

    if ((i=EEPROM_read(3)) != 170) {
    EEPROM_write(3, 170);
    }

    if (i == 170) {
    LED1_ON;
    }

    P.S. Pozdrawiam pracujacych noca:)
  • REKLAMA
  • Pomocny post
    #4 1824905
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    A może skorzystasz z biblioteki eeprom.h? Jest tam procedura eeprom_write_byte (uint8_t *addr, uint8_t val); - do zapisu [nie rozumiem tylko dlaczego adres jest 8-bitowy - przecież np. ATmega8 ma 512 bajtów EEPROMU...]
    oraz uint8_t eeprom_read_byte (const uint8_t *addr); - do odczytu bajtu. (Jest też fajna procedurka eeprom_read_word(..) / eeprom_write_word(..) do zapisu / odczytu 16-tu bitowej liczby (integer lub unsigned integer) - fajna sprawa, nie trzeba kombinować) :D
    Procedura sama zadba o sprawdzanie gotowości zapisu etc. więc nic więcej nie trzeba robić.
    Pozdrawiam.
  • #5 1824976
    kotecek
    Poziom 11  
    Posty: 29
    Pomógł: 1
    Dziala!
    Ale adres (wskaznik) dostaje po zapisaniu wartosci, a zapisuje gdzie mu sie podoba. Nie mozna wskazac gdzie ma byc zapisane?


    Dzieki i pozdrawiam wszystkich.

    No fakt, adres wyglada na 8 bitow. Moze trzeba recznie ustawic ostatni bit w EEARH?
  • REKLAMA
  • #6 1825015
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Ja to robię tak:
    Odczyt zmiennej z komórki 3 EEPROM (trzeciego bajtu) do zmiennej T_ZAD:
    T_ZAD=eeprom_read_byte((unsigned char *) 3);

    Zapis zmiennej T_ZAD do 3 komórki EEPROM:
    eeprom_write_byte((unsigned char *) 3,T_ZAD)
    .
    Rzutowanie (unsigned char *) zrobiłem tylko dlatego, żeby kompilator (też używam avr-gcc w VMLab :)) nie zgłaszał mi ostrzeżenia o braku rzutowania, ale bez tego też mi działało dobrze.
  • #7 1825325
    soft.sc
    Poziom 17  
    Posty: 142
    Pomógł: 15
    Ocena: 4
    Fragment mojego kodu pochodził z programu, który sprawdzał STATUS czyli poprzedni stan urządzenie i jeśli wcześniej nie pracowało włączał inicjację. Nie musiałeś go pisać dosłownie tylko np tak:
    EEPROM_write(3,170);
    i=EEPROM_read(3);
    ....

    itd...
    Dlaczego nie działa u ciebie - nie wiem, ale eeprom.h to też dobry sposób.
  • #8 1826497
    kotecek
    Poziom 11  
    Posty: 29
    Pomógł: 1
    Tak, wiem, ale chcialem miec "spokojne sumienie" i dlatego wpisalem "zywcem".
    Jednak nadal jestem ciekawy czemu na symulatorze dzialalo a na atmedze nie.

Podsumowanie tematu

✨ Problem dotyczy zapisu kilku wartości typu unsigned char do pamięci EEPROM mikrokontrolera ATmega8. Procedury zapisu i odczytu oparte na dokumentacji (strona 20) kompilują się i działają poprawnie w symulatorze VisualMicroLab, jednak po wgraniu programu do rzeczywistego układu EEPROM pozostaje niezmieniony. Dyskusja wskazuje, że procedury z noty katalogowej są poprawne, a problem może wynikać z nieprawidłowego adresowania pamięci EEPROM. Zalecane jest użycie biblioteki eeprom.h, która oferuje funkcje eeprom_write_byte oraz eeprom_read_byte, automatycznie obsługujące gotowość zapisu i odczytu. Adresy w tych funkcjach są wskaźnikami 8-bitowymi, co wymaga odpowiedniego rzutowania i ewentualnej korekty rejestru EEARH w przypadku większej przestrzeni EEPROM (ATmega8 posiada 512 bajtów EEPROM). Przykładowe użycie to rzutowanie adresu na (unsigned char *) i wywołanie eeprom_write_byte((unsigned char *)3, 170). Różnice między symulatorem a rzeczywistym działaniem mogą wynikać z braku właściwego ustawienia adresu lub specyfiki sprzętowej mikrokontrolera.
Wygenerowane przez model językowy.
REKLAMA