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

Atmega32 zapis do EEPROM po wyłączeniu zasilania

jaris1989 24 Gru 2011 11:42 3313 13
  • #1 10298602
    jaris1989
    Poziom 10  
    Witam, mam problem z zapisem do EEPROM po wyłączeniu zasilania. Dokładnie to zapisuje mi tylko pierwszą linijkę poniższego kodu:

    SIGNAL(SIG_INTERRUPT1)
    {
    eeprom_write_byte(&eeprom_val[0],0);
    eeprom_write_byte(&eeprom_val[1],0);
    eeprom_write_byte(&eeprom_val[2],0);
    eeprom_write_byte(&eeprom_val[3],0);
    eeprom_write_byte(&eeprom_val[4],0);
    }

    Po pojawieniu się zbocza opadającego na INT1, wywołuje to przerwanie. Nóżka INT1 jest na stałe do zasilania, jak odłączę ją w trakcie normalnej pracy uC i do zresetuje jest dobrze (wszystkie te wartości w eeprom są wyzerowane).

    Po wyłączeniu zasilania te pojemności kondensatorów 5000uF napięcie na ATmega jest ponad 4V przez prawie 2 sekundy, a wykonuje tylko pierwszą linie przerwania.

    Da się to jakoś zrobić tym sposobem. Inny sposób nie wchodzi w grę, ponieważ mam już wykorzystane wszystkie nóżki i zrobioną płytkę.

    Atmega32 zapis do EEPROM po wyłączeniu zasilania
  • #2 10298618
    Mol
    Poziom 30  
    Tą diodę to bym raczej na plusa dał.
  • #3 10298631
    jaris1989
    Poziom 10  
    Sory pomyliłem jest na plusie
  • #4 10298682
    Fredy
    Poziom 27  
    Zapewne masz BODLevel za nisko i procek ci się resetuje zanim zdążysz zrobić zapis.
    Spróbuj go zmniejszyć ile sią da, lub na chwile wyłącz go.
    Znacznie lepiej układowo byłoby gdybyś dał tą diodę i ten duży kondensator przed stabilizatorem, a detekcję zaniku napięcia dał przed diodą przed stabilizatorem. Oczywiście musisz zabezpieczyć wtedy to wejście zenerką.
    W takim układzie masz pewne że po zaniku napięcia procek będzie mieć jeszcze chwilę zasilanie stabilizowane, a ty w tym czasie możesz zrobić zapis.
    W takim układzie możesz wtedy znacznie zmniejszyć pojemność tego kondensatora.
  • #5 10298725
    jaris1989
    Poziom 10  
    BODLevel mam 2,7V i na 4V też sprawdzałem i jest to samo
  • #6 10298743
    Fredy
    Poziom 27  
    To spróbuj zrobić tak jak ci pisałem, a więc detekcję przełóż przed stabilizator.
  • #7 10298892
    manekinen
    Poziom 29  
    Zobacz jak u siebie to zrobiłem...
    Atmega32 zapis do EEPROM po wyłączeniu zasilania
    Na PB4 jest wykrywanie zaniku napięcia.
    Kondensator 470u spokojnie wystarcza żeby zapisać kilka bajtów do eeprom, gdzie kod najpierw czeka jeszcze około sekundy na powrót zasilania i dopiero potem zapisuje gdy te nie wróci. Zauważ że na wyjściu przetwornicy jest również niewielki kondensator, który zostaje bardzo szybko rozładowany przez 3W diodę LED (której nie ma na schemacie). W ten sposób zanik napięcia zostaje wykryty dość wcześnie. U Ciebie napięcie spada powolutku i to może być problemem.
  • #8 10298914
    Brutus_gsm
    Poziom 25  
    Jesli masz zwykłą wersję, nie L, to ona działa poprawnie od 4.5V. Może w tym problem?
  • #9 10298936
    jaris1989
    Poziom 10  
    Narazie zrobilem tak zę podłączyłem kondensator 1000uF i INT1 na główne zasilanie płyki tam też jest zasilanie lcd i paru tranzystorów. A ten kondensator co na schemacie zmniejszyłem do 2200uF. I narazie jest dobrze wszystko się zapisuje. Płytkę zasilam z zasilacza stabilizowanego 5V więc nie mam jak ingerować w to zasilanie.

    Dodano po 3 [minuty]:

    Brutus_gsm napisał:
    Jesli masz zwykłą wersję, nie L, to ona działa poprawnie od 4.5V. Może w tym problem?


    Właśnie ta dioda daje spadek że zasilanie uC mam 4,4V, może powinienem zastosować diodę Schottkiego. Mam mniejszy spadek napięcia.
  • #10 10298982
    manekinen
    Poziom 29  
    Cóż, niskonapięciowy procek w takim przypadku to podstawa, nawet o to nie pytałem bo sądziłem że zdajesz sobie z tego sprawę. Jak tylko wykrywasz zanik napięcia, to wszystkie porty sru jako wejścia żeby nic prądu nie ciągnęło. Postaraj się używaj w miarę niskiej częstotliwości żeby pobór prądu nie był duży. Wyłączaj przetwornik adc i inne cuda. Wtedy na pewno nie będziesz musiał wsadzać tam tak ogromnych kondensatorów, jak pisałem, u mnie 470u wystarcza na jakieś 2 sekundy pracy układu. Układ to lampka RGB, sterowana tylko i wyłącznie włącznikiem na przewodzie sieciowym (krótkie zaniki i dłuższe) i takie coś sprawdza się świetnie. Attiny oczywiście w wersji V, pracuje od 1.8V.
  • #11 10299013
    jaris1989
    Poziom 10  
    Procek oczywiście 32A więc praca w zakresie 2,7-5,5V. Na razie wszystko działa więc tak zostawię, a na przyszłość nauczka że należy wszystko przewidywać.
    Na razie temat uważam za zamknięty.

    Dzięki wszystkim za porady.
  • #12 10869256
    rassmuss
    Poziom 11  
    Witam,
    mam podobny problem co kolega autor wątku, jednakże część zaleceń z tego i innych wątków zostało wcześniej wdrożonych.

    Schemat jest jak w załączniku. Kondensator C2 ma wartość 2200uF, a nie 100uF. Reszta się zgadza.
    Czyli: zasilanie uc jest separowane diodą od zasilacza. Zanik napięcia jest wykrywany na zasilaniu jeszcze przed stabilizatorem. Napięcie zasilania w granicach 10-15V.

    Kod odpowiedzialny za zapis jest następujący:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    kod jest na początku głównej pętli programu, jest w niej też delay na 10ms, więc cała pętla wykonuje się maks. kilkanaście ms.
    Funkcja is_power_on() wykrywa, czy na nóżce PC3 (do której jest podłączony dzielnik) pojawił sie stan niski.
    Funkcja write_data_to_memory() zapisuje do eeprom 38 bajtów danych.

    Nie wiem czego się przyczepić, układ z grubsza działa poprawnie, jest jednak małe ale. Czasami (powiedzmy 1 na 100) przy zapisie pojawia się krzak i przy włączaniu jest problem.

    Nie wiem czego to może być skutek. Pętla na końcu tego bloku powoduje wstrzymanie procesora na dobre 2 sekundy po wyłączeniu zasilania. Innymi słowy muszę odczekać 2-3 sekundy po wyłączeniu i dopiero wtedy włączyć ponownie, bo inaczej się nie uruchomi - czyli w tym czasie tkwi w pętli.

    Jestem otwarty na wszelkie sugestie.
  • #13 10918740
    jaris1989
    Poziom 10  
    Po pierwsze zrobił bym to na przerwaniu zewnętrznym, po drugie do nóżki co wykrywasz zmianę napięcia dodaj rezystor 10k do masy aby po wyłączeniu zasilania od razu było 0 aby szybko procek zareagował.
  • #14 10918811
    rassmuss
    Poziom 11  
    Przerwanie odpada, bo wykrywanie zaniku jest na zwykłej nóżce.
    Co do drugiego to to już jest tak zrobione, tylko niestety za dużo schematu obciąłem i nie widać tego podłączenia. Mniej więcej na środku zrzutu jest dzielnik R18, R26 i zenerka i to jest to wykrywanie zaniku, więc ściąganie do masy już mam.
REKLAMA