Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega16 - Zapis danych do eeprom po zaniku zasilania

kamil12239 03 Wrz 2018 20:07 705 22
  • #1 03 Wrz 2018 20:07
    kamil12239
    Poziom 16  

    Szanowni Forumowicze,

    Chciałbym zrobić układ, który będzie zapisywał dane czasu do pamięci eeprom po wyłączeniu zasilania. W tym celu na wyjściu stabilizatora liniowego LM7805 umieściłem diodę schotky, za nią kondensator podtrzymujący zasilanie, zasila on sam procesor i reset procka. Przed diodą jest zasilanie reszty układów. Układ wykrywania awarii zasilania mam zaraz za stabilizatorem, podłączyłem poprzez diodę 1N4148 do pinu przerwania zewnetrznego INT0 na pinie PD2. Napisałem kod który nie działa - nie zapisuje wartości do pamięci eeprom po wyłączeniu napięcia z układu. Jak jest przyczyna? Lepiej zmodernizować schemat czy coś programowo robię źle? Udostępniam kod.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Robię to na płycie ZL15AVR. Na schemacie nie uwzględniłem wyświetlacza LCD HD44780. W przyszłości chce zrobić to na ATTINY25 lub 45.Atmega16 - Zapis danych do eeprom po zaniku zasilania

    0 22
  • Pomocny post
    #2 03 Wrz 2018 21:28
    tmf
    Moderator Mikrokontrolery Projektowanie

    Dlaczego uważasz, że zostanie wyzwolone przerwanie INT0? Vcc (o ile coś naprawdę nie ciągnie prądu z tej gałęzi) będzie wyższe od potencjału oznaczonego na schemacie jako +5V o spadek na diodzie D1. Przerwanie byłoby wygenerowane dopiero w sytuacji, w której stan na pinie INT0 byłby niski, co nie wystąpi w sytuacji zaniku zasilania. Lepiej byłoby wykorzystać np. komparator i badać napięcie na anodzie względem katody D1 (zakładając, że coś istotnie zżera prąd z Vcc).

    0
  • #4 04 Wrz 2018 06:20
    jakubek56
    Poziom 23  

    Prawdopodobnie kondensator za szybko się rozładowuje.

    0
  • #5 04 Wrz 2018 09:48
    kamil12239
    Poziom 16  

    Panie Dasej co do Pańskiego układu to wtedy to ma być przerwanie od ADC czy wtedy zostawić tak jak mam i od przerwania INT0?

    Panie Tomaszu,
    Spróbuje Pańską propozycję.

    Kondensator wydaje mi się że przeładowuje się wolno około 0.8V na sekundę. Później przy jednym wolcie to bardzo wolno.

    Dziękuję Panowie za poświęcony czas. Spróbuje wszystkich propozycji i dam znać jak wyszło.

    Pozdrawiam

    0
  • Pomocny post
    #6 04 Wrz 2018 10:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    kamil12239 napisał:
    Panie Dasej co do Pańskiego układu to wtedy to ma być przerwanie od ADC czy wtedy zostawić tak jak mam i od przerwania INT0?

    Ta propozycja nie jest zła, ale ma pewną wadę. Napięcie za mostkiem będzie się zmieniać od 0V do napięcia szczytowego podanego na mostek. W efekcie na pinie będą generowane cyklicznie przerwania, z częstotliwością 100 Hz. W efekcie detekcja zaniku zasilania będzie polegała na detekcji braku kolejnego impulsu. Ponieważ odstępy wynoszą 10 ms, więc potencjalnie tyle czasu na to stracisz. A to już czas umożliwiający zapis do EEPROM kilku bajtów. No i uśpienie MCU nie wchodzi w grę.

    Dodano po 1 [minuty]:

    jakubek56 napisał:
    Prawdopodobnie kondensator za szybko się rozładowuje.

    Kondensator 4700 uF za szybko się rozładowuje jeśli jest obciążony tylko MCU? Niech kolega sobie to policzy najpierw.

    0
  • Pomocny post
    #7 04 Wrz 2018 16:12
    dasej
    Poziom 30  

    @kamil12239

    Do wyjścia za mostkiem trzeba dobrać pojemność tak by przerzutniki schmitta stojący za dzielnikiem ( tworzący sygnał dla INT ) na jakimś wzmacniaczu operacyjnym działał popranie.
    Zamiast 4700uF raczej trzeba zastosować supercapa 1F na 5.5V ( lub mniejszy, pobór prądu zależy od typu procesora i jego zegara ).
    Przy tak dużej pojemności procesor na pewno zdąży wszystko zrobić zanim zabraknie mu napięcia.

    Część sygnału z przerzutniki schmitta musi sterować zasilaniem pozostałych urządzeń tak by je odcinać przy zaniku napięcia i nie wpływać na rozładowanie supercapa.
    Łatwo można to osiągnąć przy pomocy p-Mosfet-a.

    Twoja dioda D1 obniża zasilanie układu o około 0,5V. Obniżenie napięcia przed stabilizatorem nie wpływa na zasilanie całego układu.

    Supercapa w polskich sklepach kosztuje około 10zł za 1F/5.5v.

    0
  • #8 04 Wrz 2018 16:59
    tmf
    Moderator Mikrokontrolery Projektowanie

    dasej napisał:
    Zamiast 4700uF raczej trzeba zastosować supercapa 1F na 5.5V

    Tu naprawdę nie trzeba zgadywać, to można policzyć. Po co 1F? Na zapis kilku bajtów do EEPROM wystarczy kondensator rzędu 100 uF.
    dasej napisał:
    Część sygnału z przerzutniki schmitta musi sterować zasilaniem pozostałych urządzeń tak by je odcinać przy zaniku napięcia i nie wpływać na rozładowanie supercapa.
    Łatwo można to osiągnąć przy pomocy p-Mosfet-a.

    Po co? Ta dioda załatwi sprawę. Jedynie wyjścia MCU warto dać w stan niski, żeby pasożytniczo nie zaslały reszty układu.
    dasej napisał:
    Twoja dioda D1 obniża zasilanie układu o około 0,5V.

    Przy prądzie jaki pobiera mikrokontroler, dioda Schottkiego będzie miała spadek rzędu 120-200 mV, co w niczym nie przeszkadza.

    Dodano po 1 [minuty]:

    dasej napisał:
    Do wyjścia za mostkiem trzeba dobrać pojemność tak by przerzutniki schmitta stojący za dzielnikiem ( tworzący sygnał dla INT ) na jakimś wzmacniaczu operacyjnym działał popranie.

    Przerzutnik Schmitta jest już na każdym wejściu IO AVR.

    0
  • #10 04 Wrz 2018 17:18
    tmf
    Moderator Mikrokontrolery Projektowanie

    dasej napisał:
    tmf napisał:

    Po co? Ta dioda załatwi sprawę. Jedynie wyjścia MCU warto dać w stan niski, żeby pasożytniczo nie zaslały reszty układu.



    W układnie jest jeszcze wyświetlacz, zapewne z podświetlaniem. Warto by było go wyłączyć.

    Autor wyprowadził domenę Vcc, zapewne więc zasila wyświetlacz z tej domeny. Wyłączy się więc sam. Jedyne o co trzeba zadbać, to o ustawienie pinów w stan niski po detekcji zaniku, żeby tego LCD nie zasilały.

    0
  • Pomocny post
    #11 04 Wrz 2018 21:01
    pawlik118
    Poziom 25  

    Podłącz INT1 przez dzielnik rezystancyjny do napięcia zasilania, tak aby INT0 generował przerwanie gdy napięcie 12V spadnie do wartości około 10V. Wówczas wystarczy czasu aby zapisać dane do eeprom. Zamiast samego dzienika możesz wykorzystać dowonlny komparator - wtedy całość będzie działała poprawniej.

    0
  • #12 04 Wrz 2018 21:04
    kamil12239
    Poziom 16  

    Wyświetlacz zasilam z Vcc. Kondensator będzie mniejszy planuje 470uF. Uklad zamierzam zrobić na ATtiny25 lub większej. Także odpadnie wyświetlacz. Nie będzie możliwości wykorzystania komparatora ponieważ zabraknie mi pinow. Dlatego muszę myśleć jak to zrobić wykorzystując jeden Pin.

    0
  • Pomocny post
    #13 04 Wrz 2018 21:08
    tmf
    Moderator Mikrokontrolery Projektowanie

    Z komparatorem też może wystarczyć jeden pin, jeśli procesor ma możliwość programowego podłączenia drugiego pod Vcc procesora. Można też zrobić tak jak pisze kol. @pawlik118, tylko trzeba pamiętać, że próg przełączenia stanu pinu jest dosyć płynny i zależy m.in. od egzemplarza MCU, temperatury itd. Niemniej da się tak zrobić.

    0
  • #14 04 Wrz 2018 23:47
    pawlik118
    Poziom 25  

    tmf napisał:
    Z komparatorem też może wystarczyć jeden pin, jeśli procesor ma możliwość programowego podłączenia drugiego pod Vcc procesora. Można też zrobić tak jak pisze kol. @pawlik118, tylko trzeba pamiętać, że prób przełączenia stanu pinu jest dosyć płynny i zależy m.in. od egzemplarza MCU, temperatury itd. Niemniej da się tak zrobić.


    Zawsze można też użyć choćby LM358 w roli komparatora. Jedną nóżką do dzielnika z 12V, drugą do VCC jako referencyjne. Tanio, prosto i jako tako :)

    0
  • #15 05 Wrz 2018 17:02
    kamil12239
    Poziom 16  

    Panowie dlaczego mając taki kod nie chce mi zapisać do pamięci eeprom ? Sam komparator działa. Mam podłączony bandgap a nóżkę ujemną z wejścia ADC3 czyli w tym procku PIN PA2. Diody zmienają stany natomiast i tak nie chce zapisać mi czasu do pamięci. Co robię źle?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #17 05 Wrz 2018 20:32
    kamil12239
    Poziom 16  

    Okej spróbuję. Z tym że jak ma coś takiego;

    Kod: c
    Zaloguj się, aby zobaczyć kod


    No to po przekroczeniu tego czasu i zresetowaniu procka zapisze mi wartość i odczyta od 30. Czemu tak jest?

    0
  • #19 05 Wrz 2018 20:58
    kamil12239
    Poziom 16  

    Nie mam tego w kodzie i nie planuje. Tak tylko sobie sprawdzałem. I jak tam zrobię to działa. Jutro sprawdzę Pańską wersję może na tej pójdzie.

    0
  • #20 08 Wrz 2018 10:35
    kamil12239
    Poziom 16  

    Kod Pana Daseja działa. Problemem był źle podłączony przycisk resetu. Po odłączeniu mojego połączenia wszystko zadziałało. Problemem teraz będzie uciążliwe podłączanie ponowne przewodu w chwili programowania. Dziękuję Panowie za poświęcony czas.

    0
  • #22 08 Wrz 2018 12:39
    tmf
    Moderator Mikrokontrolery Projektowanie

    dasej napisał:
    10K w resecie trochę za dużo. 4,7K lub 2,2K

    Niekoniecznie. Pin RESET w AVR ma wewnętrzne podciąganie i zewnętrzny rezystor zwykle jest niepotrzebny. Nawet jeśli go damy, to będzie układ dwóch równolegle połączonych rezystorów (wewnętrzny i zewnętrzny) o wypadkowej rezystancji niższej, jak to w tym typie połączenia.
    Warto też pamiętać, że w nowszych układach (z interfejsem PDI) dodanie rezystora podciągającego na reset o wartości <10 k może powodować problemy z programatorem.

    0
  • #23 03 Paź 2018 12:57
    kamil12239
    Poziom 16  

    Szanowni Państwo. Temat jest rozwiązany. Zastosowałem tutaj przerwanie od komparatora analogowego tak jak wspominał Pan tmf. Odpowiednio również trzeba było zasilić reset procesora ja miałem na swojej płycie jakiś uklad scalony do resortu. Dziękuję wszystkim którzy mi pomogli szczególnie dasej

    0
  Szukaj w 5mln produktów