Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATTiny2313 - EEPROM - niepokojący efekt, ktoś pomoże?

mirekk36 21 Nov 2006 22:49 2554 16
  • #1
    mirekk36
    Level 42  
    Witam,

    używam procka ATTiny2313, wszystko działa niby super ale...

    mam kłopoty z pamięcią EEPROM, tzn nie z zapisem czy odczytem. Procedury zapisu i odczytu też działają dobrze. Ustawiałem też fusebit EESAVE. Ale pomimo to po kilku nagłych wyłączeniach i włączeniach zasilania dwa zapamiętane bajty w tej pamięci potrafią zmienić swoją wartość. Normalnie na początku programu po resecie zawsze odczytywane są te 2 bajty (to taki parametr dla Timera1). Ostatnio dodałem nawet spore opóźnienie ok 1czy2 sek po resecie a przed odczytem EEPROMa i to troszkę pomogło ale niestety znowu pojawia mi się ten efekt że po którymś włączeniu lub (tak mi się wydaje) po dłuższej przerwie bez zasilania zapamiętane bajty się zmieniają czasem na inne wartości.

    czy trzeba na coś szczególnego zwrócić uwagę o czym nie wiem przy korzystaniu z tej pamięci???

    moja procedura odczytu:

    Read_EEPROM:
    push R18

    re_lop:
    in R16, EECR ; sprawdzanie czy skończona ew poprzednia
    sbrc R16, EEWE ; operacja zapisu do EEPROM
    rjmp re_lop ; jeśli nie to pętla re_lop

    in R18, SREG ; zapamiętanie stanu przerwań
    cli ; wyłączenie przerwań
    out EEAR, R17 ; wpisanie adresu do odczytu(parametr w R17)
    ldi R16, (1<<EERE)
    out EECR, R16 ; uruchomienie procedury odczytu
    in R16, EEDR ; pobranie wartości odczytanej do R16

    andi R18, 128 ; sprawdzenie czy były włączone przerwania
    brne rwe_ex ; jeśli nie to pomin nast instrukcję
    sei ; włącz przerwania
    rwe_ex:

    re_lop1:
    in R17, EECR ; ta pętla może jest niepotrzebna
    sbrc R17, EEWE nie szkodzi chyba że jest
    rjmp re_lop1

    pop R18
    ret

    i jak mówię to działa , zapis jest podobnie robiony, zresztą wszystko w oparciu o przykłady z noty aplikacyjnej.

    tylko dlaczego zawartość tak się potrafi zmieniać? to chyba nie jest normalne?

    przy zwykłym resecie bez wyłączania zasilania zawsze wszystko jest ok :(

    pozdrawiam i czekam na jakąś sugestę - z góry dziękuję
  • #2
    maciek_slon
    Level 29  
    A pod jakimi adresami zapisujesz? Na początku EEPROMU od razu?
  • #3
    mirekk36
    Level 42  
    tak dwa pierwsze bajty o adresach 0 i 1. .... hmm a ma to jakieś znaczenie gdzie? ... właśnie może są jakieś zasady których nie znam - nie doczytałem. Dodam tylko, że zapisu dokonuję i będę dokonywał bardzo rzadko. Jak narazie biorą pod uwagę próby wykonałem może max - 100- 150 zapisów. więc chyba nie przekroczyłem limitu dla tej pamięci? ;)
  • #4
    Samuraj
    Level 35  
    Pamiętam że kiedyś czytałem jakiegoś pdf'a ze stajni Atmela i napisane było aby nie adresować bajtu pod adresem 00. Mogą występować błędy zapisu i odczytu podczas resetowania.
    Ale Ty napisałeś że 00 i 01 tak więc nie wiem :D
    Dokumentacje miałem jakiś czas temu i nie pamiętam czy dotyczyła całej gamy mikrokontrolerów Atmela czy któregoś wybranego.
  • #5
    mirekk36
    Level 42  
    hmmm dzięki Samuraj, to ciekawa informacja... jutro spróbuję zmienić adres tych bajtów na jakiś sporo dalszy - może w środku pamięci? ciekawe czy to pomoże?

    a może jeszcze jakieś pomysły?
  • #6
    Samuraj
    Level 35  
    Wiem że kiedyś też z tym miałem zonka i głowiłem co jest nie tak.
    Rozwiązaniem było pozostawienie pierwszej komórki i adresowanie danych od adresu 01, jak pisałem wcześniej.
  • #7
    mirekk36
    Level 42  
    ok - chociaż wydaje mi się, że czsem i bajt spod adresu 01 też zmieniał wartość, ale teraz nie mam układu pod ręką. Jutro to koniecznie posprawdzam. Oby zadziałało tak jak mówisz ;) na szczęście mam do zapamiętywania tylko 2 bajty.

    dzięki za info - jutro dam napewno znać czy mi to pomogło

    pozdrówka
  • #8
    maciek_slon
    Level 29  
    Ano, nie zdążyłem napisać że właśnie o ten nieszczęsny bajt 00 chodzi - w czasie zaniku zasilania uC może tam zapisywać śmieci.
  • #9
    McRancor
    VIP Meritorious for electroda.pl
    Problem był dość znaczny w starszych (90S) AVRach, gdzie średnio 3-4 pierwsze komórki pamięci były "zaspamowywane" ;) po resecie, Atmel pisał o pierwszej komórce, z doświadczenia wiem że dopiero powyżej 15 komórki są "pewniejsze", teraz pewnie jest troche lepiej, bo rozudowane układy starujące itd, ale dalej nie ufałbym pierwszym komórkom, lepiej adresuj je od końca - miejsca w końcu tak samo braknie.
  • #10
    mirekk36
    Level 42  
    Witam,

    spróbowałem - teraz programuję od 24 komórki, hmmmm ale np dzisiaj po włączeniu układu okazało się, że są jakieś inne wartości niż 0xFF gdzieś w środku pamięci i pod koniec. A ja tam nic nie zapisywałem. Więc albo ten mój EEPROM a mam ATTiny2313 coś szwankuje albo ja nadal coś źle robię.

    Ale ok - zobaczę czy teraz będzie się to lepiej sprawowało jak mam wgrane te parametry w komórkach 24 i 25. Narazie po kilku wyłączeniach jest jakby ok, ale zobaczę jutro po dłuższym wyłączeniu zasilania całego układu.

    pozdrawiam i dzięki za zainteresowanie

    PS ... ale rozumiem, że w prockach które wy używacie panowie, tam gdzie robicie coś z EEPROMem to nie macie takich dziwnych bojawów po wyłączaniu zasilania? i wszystko działa dobrze na innych AVRkach?
  • #11
    Misiu111
    Level 12  
    blad w sofcie
    wyrzuc wszyskto i zacznij od poczatku
    lub wez sprawdzonego gotowca
    (pewnie bazujesz na gotowcach i cos gdzies zostalo)
    robilem dwa projekty na tych prockach i nigdy nie slyszalem o takim problemie (byly to projekty dla przemyslu - gdyby cos nie dzialalo, to bym sie dowiedzial : )

    przy okazji - sprawdz czy nowa wartos zapisywana do pamieci jest rozna od biezacej - tak jest przyzwoiciej


    Mark
  • #12
    mirekk36
    Level 42  
    o właśnie chodziło mi o taką opinię nt tych własnie prcków... co do softu to nie korzystam ni w ząb z gotowców - wziąłem procedurę zapisu i odczytu w asm wprost z noty aplikacyjnej - to źle wg ciebie? - pewnie, że też myślę iż to nadal gdzieś mój błąd tak jest po kolei z każdym kawałkiem procka którego się uczę ;) tak było z RSem, tak było z Timerami itp... teraz akurat walczę z EEPROM.

    ale w takim razie podpowiedz na co zwrócić uwagę poza sprawdzeniem po zapisie ? ja upatrywałem swojego błedu w tym, że ten pierwszy odczyt z EEPROM jest robiony zaraz po resecie - po ustawieniu wszystkich portów i wprowadziłem opóźnienie przed odczytem ok 1sek. Ale poza wszystkim skąd się może brać to, że raz wczytuję zawartość całego EEPROMa (PonyProgiem) i widzę że wszystkie komórki mają 0xFF a po którymś włączeniu (oczywiście działa wtedy tylko moja procedura odczytu a nie zapisu(bo ta jest robiona tylko na żądanie a nie automatycznie) ... po którymś włączeniu widzę, że np ze trzy komórki o różnych czasem adresach mają inne wartości niż 0xFF. Rozumiem, że może być problem z tymi pierwszymi komórkami jak pisali koledzy wyżej ale reszta?

    aha sugerujesz też aby po zapisie sprawdzać (tzn odczytywać) czy jest dobra wartość a jak nie to pętla i zapis ileś tam razy lub do bólu? ;)

    pozdrówka

    PS... chyba , że byłbyś tak łaskawy i pokazał ten fragmencik swojego kodu do zapisu i odczytu? ;)
  • #13
    szymtro
    Level 30  
    A jaki masz ukłąd resetu? moze za duza pojemność i przez to rbią sie jakieś dziwne historie.

    Co prawda problem rzeczywiscie był kiedyś opisany i tam podobno dotyczyło to tylko komórki 00. Doradzono (oprócz tego zeby używać innych) aby wmontować specjalizowany ukłąd resetu aby szybko zrobił reset układowi gdy tylko napięcie zaczyna spadać.
    Zmniejsz też kondensatory na lini zasilajacej uC - to na próbę - niech szybciej zabraknie mu prądu.
  • #14
    mirekk36
    Level 42  
    Witam,

    nie mam żadnego układu resetu, linia reset jest podpięta przez rezystor 4,7K do VCC. Napięcie spada powoli bo na wyjściu stabilizatora mam kondensator 2200uF a są jeszcze przy procku i 2 innych scalakch oddzielne 47uF. Hmmm ale zawsze wydawało mi się, że to dobrze dać duże pojemności... hmmm ale jutro i to spróbuję - dzięki za kolejne sugestie

    pozdrówka
  • #15
    GreG$
    Level 13  
    czesc.
    faktycznie tn2313 ma cos zwalone przynajmniej w serii, ktora ja kupilem. u mnie pierwsze 4 czy 5 bajtow eeprom'a dziwnie sie zmienialo. po zmianie poczatku adresowania - jak reka odjal.
    ponadto trzeba sprawdzic czy zapis nie leci np. przy wylaczaniu procka - niskie napiecie i ustawic mu odpowiedni BODLevel.

    te duze pojemnosci to z rozsadkiem sie stosuje ;-)
  • #16
    mirekk36
    Level 42  
    ... jutro z przyjemnością wypróbuję kolejne pomysły - mam nadzieję, że w końcu pozbędę się tego przykrego problemu.... tylko jak próbowałem ten BODLEVEL ustawiać to jakoś wogóle procek dziwnie mi działał... a dla 4,3V powinno być ustawione chyba 100 czyli w PonyProgu zaptaszkowane powinny być BodLevel0 i BodLevel1... to też jeszcze raz spróbuję i dam jutro znać jak mi z tym idzie dalej

    pozdrawiam
  • #17
    mirekk36
    Level 42  
    no i jestem po "wyczerpująych" testach ;) okazało się więc tak jak koledzy wspominaliście - że jak przestałem robić zapisy do pierwszych komórek, że jak ustawiłem sobie BodLevel na 4,3V to wszystko działa w pełni zadowalająco, już nie ma dziwnych wpisów do pamięci nawet po ciężkim teście - "non-stop przez kilkanaście sekund szybko włączane i wyłączane zasilanie"

    ogólnie wszystkim dziękuję za wszystkie cenne porady