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

[Atmega]Niepoprawne odczyty pamięci EEPROM

pempek 30 Lis 2010 08:12 2114 6
REKLAMA
  • #1 8807451
    pempek
    Poziom 10  
    Sprawa wygląda następująco:
    Mam Atmegę8, którą programuję w C (avr-libc). Zapisuję 20 bajtów danych do pamięci eeprom za pomocą funkcji eeprom_write_byte pod określone adresy. Następnie, nie wyłączając zasilania, w dalszej części kodu odczytuję te dane przez eeprom_read_byte. Wyświetlam je, wszystko jest ok.
    Kolejno, wyłączam zasilanie, włączam ponownie, pomijam etap zapisywania za pomocą przycisku i znów odczytuję te same komórki EEPROM. Tym razem, jakieś 25% odczytów jest niepoprawnych.

    Samo zresetowanie uC (bez wyłączania zasilania) nie powoduje błędnych odczytów.

    Dodam, że na czas zapisów i odczytów wyłączam przerwania. Dokumentacja avr-libc mówi, że funkcje obsługi EEPROMu same dbają o to, żeby pamięć była gotowa do odczytu/zapisu (eeprom_is_ready()).

    Co może być przyczyną takiego działania? Czy to wina uC?
    Nie używałem wcześniej EEPROMu w tym uC, więc na pewno przeszedł więcej niż 100 cykli zapisu.
  • REKLAMA
  • #2 8807560
    chudybyk
    Poziom 31  
    Witam!
    Po pierwsze rzuć kodem. Przynajmniej w newralgicznych punktach ewentualnie strukturę programu.
    Pozdrawiam!
  • REKLAMA
  • #3 8807852
    mirekk36
    Poziom 42  
    pempek napisał:

    Co może być przyczyną takiego działania? Czy to wina uC?
    .


    Skąd wam przychodzą od razu takie wnioski - wina uC? Szok!

    Wina to jest twojego programu i podejścia zapewne. A że nie raczyłeś pokazać choćby jego fragmentu to tylko tyle można powiedzieć.

    Na pewno nie trzeba wyłączać przerwań na czas zapisu/odczytu i sprawdzać gotowości za pomocą takich poleceń o jakich pisałeś.

    Za to na bank źle coś w kodzie robisz. Poza tym do zapamiętywania w C danych w eeprom naucz się od razu , od samego początku używać struktur - bo to jest najbardziej zalecane rozwiązanie. Ale żebyś źle nie zrozumiał, nie ze względu na jakieś wydumane błędne zapisy i odczyty. Ale o tym później. Najpierw przejdź poprawnie początki.

    100 cykili zapisu to wg ciebie dużo? a spojrzałeś chociaż raz do noty PDF i to na pierwszą jej stronę żeby doczytać ile przewidzianych jest takich cykli ?
  • REKLAMA
  • Pomocny post
    #4 8807915
    Jaca
    Poziom 31  
    1. Włącz BOD'a w fusebit'ach
    2. Dla pewności omiń np 8 pierwszych komórek EEPROM'u i nic do nich nie zapisuj.
  • REKLAMA
  • #5 8832444
    pempek
    Poziom 10  
    Jaca napisał:
    1. Włącz BOD'a w fusebit'ach
    2. Dla pewności omiń np 8 pierwszych komórek EEPROM'u i nic do nich nie zapisuj.


    Dzięki, pomogło!
  • Pomocny post
    #6 8832589
    tmf
    VIP Zasłużony dla elektroda
    BOD to tylko terapia doraźna. Popraw przede wszystkim zasilanie, musisz mieć nieźle pokaszanione, skoro napięcie tak pływa, że miałeś 25% błędów. Popraw też program. Dobrą praktyką jest ustawienie EADR pomiędzy zapisami/odczytami na nieużywaną komórkę pamięci EEPROM. Dzięki temu przypadkowy zapis zostanie wykonany w nieużywanym obszarze.
  • #7 9371738
    pempek
    Poziom 10  
    Dzięki tmf za sugestię, choć problem jest już rozwiązany :)
REKLAMA