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

[Rozwiązano] Wykrywanie zaniku zasilania na INT0 i podtrzymanie mikrokontrolera

Jakub17 27 Paź 2018 10:43 2604 52
  • #1 17520834
    Jakub17
    Poziom 6  
    Witam

    Procesor ATmega328P, kondesnatory 2 x 680 uF (równolegle), dioda schottkiego BAT15-03W

    Borykam się z następującym problemem. W czasie zaniku zasilania pragnę na moment podtrzymać działanie mikrokontrolera tak aby mógł zapisać pewne informacje do EEPROM. Do detekcji zaniku zasilania wykorzystuje przerwanie INT0 (wyzwalane poziomem niskim ponieważ mikrokontroler śpi przez większość czasu)
    Niestety przerwanie nie jest wywoływane przy zaniku zasilania natomiast jeżeli przytknę kabelek do połączony z pinem INT0 do masy to przerwanie się wywołuje.
    Oto kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To jest tylko testowy program, rozwiązanie posłuży mi do zaimplementowanie w sensownej aplikacji. Po wyświetlenie tekstu na wyświetlaczu OLED procesor idzie spać a watchdog wybudza go co 1 s. Przerwanie INT0 również może wybudzić procesor także nie powinno mieć znaczenia czy procek w chwili zaniku zasilania śpi czy też nie.

    Rysunek ilustrujący podłączenie:
    Wykrywanie zaniku zasilania na INT0 i podtrzymanie mikrokontrolera
  • #2 17520844
    viayner
    Poziom 43  
    Witam,
    obawiam sie ze INT0 wykrywa zmiane stanu H/L i pewnie threshold masz na niskim poziomie jak INT0 wykryje te zmiane to zasilanie jest juz na zbyt niskim poziomie, inna mozliowsc to to ze po zaniku zasilania napiecie na Vcc spada a wiec i threshold dla INT0 tez. Sadze ze jezeli rozwiazanie ma byc takie jak ty zaproponowales to podtrzymanie zasilania na Vcc musi byc lepsze.
    Dlaczego nie dasz np. malego akumulatorka czy "super kondensatora".
    Pozdrawiam
  • #3 17520847
    Konto nie istnieje
    Konto nie istnieje  
  • #4 17520857
    excray
    Poziom 41  
    Błąd konstrukcyjny. Załącz dokładny schemat z wartościami. Co oznacza Vcc? Jakiś zasilacz? Załącz jego schemat z wartościami bo to tutaj tkwi błąd.
  • #5 17520863
    Jakub17
    Poziom 6  
    Co do źródła podtrzymującego to chyba nie w tym rzecz bo:
    1. Dałem nawet 2x680 uF + 4 * 100 uF równolegle wszystko i problem występuje nadal.
    2. Spróbowałem wykonać to na przerwaniu od komparatora i tutaj o dziwo działa z tym że tylko wtedy gdy procesor nie śpi. Ponadto z nie wiadomych mi przyczyn gdy nawet uśpienie jest włączone i uC działa normalnie (nie odcinam zasilania), to watchdog nie wybudza uC. Po pierwszym uśpieniu procesor jest permanentnie w stanie uśpienia.

    Wniosek z tego taki, że na pewno wszystko w porządku z sekcją zasilającą i zasilaczem. Problem musi być gdzieś ukryty w programie w przypadku komparatora, a w przypadku przerwań INT0 może faktycznie ten trenshold się obniża, tylko co na to poradzić w takim razie? Więcej kondensatorów nic nie zmienia.

    Dodano po 53 [sekundy]:

    Ok, zrobie schemat

    Dodano po 6 [minuty]:

    A no i nie wspomniałem, że wszystko zasilam z programatora oraz procesor ATmega328P jest na płytce Arduino, także tutaj o poprawność zasilania samego procesora bym się nie martwił.

    Dodano po 11 [minuty]:

    Wykrywanie zaniku zasilania na INT0 i podtrzymanie mikrokontrolera

    Dodano po 41 [sekundy]:

    Schemat jest trywialny bo korzystam z gotowych modułów wyświetlacza i Arduino
  • #6 17520888
    excray
    Poziom 41  
    Przed diodą daj opornik 1k do masy:
    Wykrywanie zaniku zasilania na INT0 i podtrzymanie mikrokontrolera
  • #7 17520897
    Konto nie istnieje
    Konto nie istnieje  
  • #8 17520944
    Jakub17
    Poziom 6  
    excray
    Czemu ma służyć ten rezystor?

    StaryUczen
    Co proponujesz konkretnie zrobić?
    Ja nie odłączam USB tylko rozłączam przewodzik który dostarcza zasilani na całą szynę płytki sytkowej. Próbowałem tak samo ze sprawdzonym wysłużonym zsilaczem, to nic nie zmienia. Co do uzycia komparatora to program nie różni się niczym poza dwoma elementami:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co do niuansów zasilania samego procesora to tak jak mówilem: jest to płytka Arduino. Ktoś już za mnie pomyślał jak to dobrze zrobić, więc tutaj bym się nie czepiał.

    A jeśli chodzi o komparator to rozumiem że w stanie uśpienia nie wygeneruje przerwania no bo po prostu w trybie SLEEP_MODE_PWR_DOWN komparator nie działa, co nie zmienia faktu że watchdog powinien sukcesywnie budzić procesor wywołując przerwania (o czym informowałaby mnie dioda testowa) ale tak się nie dzieje.
  • #9 17520946
    Konto nie istnieje
    Konto nie istnieje  
  • #10 17520961
    Jakub17
    Poziom 6  
    Program jest w pierwszym poście, trzeba tylko podmienić funkcje tak jak napisałem w poście wyżej, nie wiem czego chcesz jeszcze?
    Tak ISR_NAKED użyłem świadomie. Poza tym jest to ostatnie co ma zrobić procesor przy zaniku zasilania. Wahań napięcia i przypadkowego wywołania przerwania które zablokowałoby cały program na razie nie biorę pod uwagę. Co do Twojej propozycji by zwiększyć obciążenie - dodałem jako dodatkowy odbiornik rezystor 1K a nawet i 10k i nic nie pomaga.


    A drugim dziwnym efektem jest to, że wyświetlacz jest pasożytniczo zasilany przez wyjścia uC nim sterujące mimo że wyraźnie w przerwaniu napisałem by wszystkie piny były odłączone ( w stanie wysokiej impedancji ). Ale nawet jak przed odłączeniem zasilania wyjmę wyświetlacz to i tak to nic nie zmienia, nadal problem występuje.

    while(1) jest w przerwaniu nie od watchdoga ale w przerwaniu od INT0 (w sytuacji zaniku zasilania) aby procesor nie wracał już do pętli głownej, bo po co? Zatem w sytuacji gdy zasilanie nie zanika, przerwanie to nie jest wywoływane/
  • #11 17520975
    Konto nie istnieje
    Konto nie istnieje  
  • #12 17521011
    Jakub17
    Poziom 6  
    StaryUczen napisał:


    Jam myślisz, jak dasz 100k albo 1M to bardziej obciążysz?
    Włączyłeś ten rezystor tak jak narysował @excray?

    No tak między VCC i GND na szynie zasilającej jak zwykły odbiornik
    Dodano po 3 [minuty]:
    StaryUczen napisał:

    Jakub17 napisał:
    dziwnym efektem jest to, że wyświetlacz jest pasożytniczo zasilany przez wyjścia uC nim sterujące mimo że wyraźnie w przerwaniu napisałem by wszystkie piny były odłączone

    Jak uC nie wchodzi w przerwanie i i nie ustawi portów na IN.

    Dodano po 2 [minuty]:

    .[/quote]
    Jeszcze raz:
    W przypadku komparatora przerwanie się wywołuje przy wyłączonym trybie uśpienia i stąd wiem że piny są odpowiednio konfigurowane bo na wyświetlaczu uzyskuje różne wartości po odcięciu zasilania (czyli zapis do eeprom w przerwaniu się dokonał), natomiast nie dziąła watchdog z niewiadomych mi przyczyn - ale ten wątek bym zostawił bo i tak nie robię tego na komparatorze.
    Natomiast w przypadku IN0 jak wspomniałem na początku przerwanie się wywołuje wtedy gdy zewrę przewód podłączony do INT0 do masy, a nie wtedy gdy zasilanie zanika.
    Niestety nie mam osyloskopu by podejrzeć co się dzieje :(
  • #13 17521015
    Konto nie istnieje
    Konto nie istnieje  
  • #14 17521035
    Jakub17
    Poziom 6  
    Gdybym robił zwarcie na zasilaniu to zadziałaby układ BOD i uC by się zresetował i ponownie wyświetliłby się napis "start" przed main, a tak się nie dzieje. Procesor zostaje w tym przerwaniu bo jest tam while(1).

    Próbowałem rezystor 100 R i nic.

    To jest jakaś chora anomalia, której nie umiem wyjaśnić. Tak samo tego, że watchdog nie działa gdy korzystam z komparatora i usypiam procesor, a bez usypiania działa. Komparatora i tak nie mogę użyć do rozwiązania swojego problemu bo jego przerwanie w stanie uspienia procesora się nie wykona - musiałbym mieć farta i odłączyć zasilanie wtedy gdy akurat procesor nie śpi, dlatego zostaje tylko INT0 lub INT1
  • #15 17521047
    Konto nie istnieje
    Konto nie istnieje  
  • #16 17521064
    dasej
    Poziom 32  
    Witam.

    Znalazłem w necie. To powinno pomóc rozwiązać twój problem.
    Gościu tu przedstawia jak uśpić procesor i obudzić go przerwaniem INT0.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Link
  • #17 17521081
    Konto nie istnieje
    Konto nie istnieje  
  • #18 17521127
    Jakub17
    Poziom 6  
    Przerwanie wybudza procesor gdy zwieram INT0 do masy ręcznie. Natomiast nie dochodzi do wywołania przerwania gdy napięcie samo opada w wyniku rozłączenia zasilania. Stan uśpienia nie ma tu nic do rzeczy ani wotchdog. Spróbowałem najprościej jak się da czyli brak watchdoga i brak uśpienia i nadal przerwanie się nie wywołuje gdy rozłączam układ.
  • #19 17521154
    dasej
    Poziom 32  
    A gdzie to ustawiasz ?
    MCUCR |=(1<<ISC01) -- Zgłaszanie opadającym zboczem dla INT0
    domyślnie masz ustawione -- Zgłaszanie niskim poziomem logicznym
  • #20 17521155
    Strumien swiadomosci swia
    Poziom 43  
    KOlego widocznie spada zbyt szybko i w chwili jak jest możliwość jego wykrycia to procesor nie ma już na tyle napięcia by je obsłużyć.

    Zasil układ wyższym napięciem 12 15V i tam monituj jego spadek .

    Taką logikę jak u ciebie da się obsłużyć jak masz dostęp wprost do transformatora zasilającego wtedy to zajmuje 10ms i jest proste.

    Moderowany przez Marek_Skalski:

    Kolega poważnie proponuje zasilenie mikrokontrolera napięciem 12-15 V? Jeżeli to jakiś skrót myślowy, to bardzo niebezpieczny.
    3.1.11. Nie wysyłaj wiadomości, które nic nie wnoszą do dyskusji. Wprowadzają w błąd, są niebezpieczne czy nie rozwiązują problemu użytkownika.

  • #21 17521172
    Jakub17
    Poziom 6  
    dasej napisał:
    A gdzie to ustawiasz ?
    MCUCR |=(1<<ISC01) -- Zgłaszanie opadającym zboczem dla INT0
    domyślnie masz ustawione -- Zgłaszanie niskim poziomem logicznym


    Poziomem czy zobczem - bez różnicy. I tak nie dziala. Probowałem dwie opcje.

    Dodano po 2 [minuty]:

    Strumien swiadomosci swia napisał:
    KOlego widocznie spada zbyt szybko i w chwili jak jest możliwość jego wykrycia to procesor nie ma już na tyle napięcia by je obsłużyć.

    Zasil układ wyższym napięciem 12 15V i tam monituj jego spadek .

    Taką logikę jak u ciebie da się obsłużyć jak masz dostęp wprost do transformatora zasilającego wtedy to zajmuje 10ms i jest proste.


    Tylko docelowo układ bedzie zasilany z baterii. Zalozylem 3,3 V I tak musi zostac bo.inne elementy tez są dostosowane do tego napięcia. Jest jakis inny sposob by spowolnić spadek napięcia? Zastanawialem sie właśnie jakie napiecie panuje na kondenstatorach w chwili odciecia zasilania. Ich sumaryczna pojemność to prawie 2000 uF

    Dodano po 3 [minuty]:

    Zgodnie z zależnością C =q/u wynika, że napiecie obniza sie gdy zwiekszam pojemnosc (pobor pradu stały). Zatem może napięcie jest poniżej progu detekcji
  • #23 17521223
    Konto nie istnieje
    Konto nie istnieje  
  • #24 17521233
    excray
    Poziom 41  
    Zasilanie wyświetlacza zrób za diodą - tak jak uC lub zadbaj aby przed uśpieniem wszystkie piny które łączysz z LCD były w stanie niskim.
  • #25 17521234
    Jakub17
    Poziom 6  
    Ok, dzięki za propozycje. A zwykły dławik z 10 uH szeregowo z kondensatorami złagodzilby troche zbocze I opóznil spadek napiecia? Jest to sensowne?

    Dodano po 4 [minuty]:

    StaryUczen napisał:

    Już pisałem jak to zrobiłem, 4093. U mnie to służy zarówno do usypiania jak i wybudzania.
    Tyle, ze jak masz coś "nie halo" i Vcc uC spada tak samo szybko jak zasilanie całości, to bez oscyloskopu nic się nie dowiesz.
    Zrób próby, o których pisałem bo tak naprawdę to nie masz pewności, czy przerwanie nie wykonuje sie wcale, czy może wykonuje ale zapis do EEPROM już nie. Do tego oscyloskop nie jest potrzebny. Przydałby się jednak debuger, którego ja sadzę też nie masz.


    Sprawdziłem tak jak mowiles. Wylaczylem zerowanie DDRC I PORTC I dodalem zapalenie diody na PC0 w przerwaniu. Diodka przy takiej pojemności powinna miarowo gasnąć tak jak wyŝwietlacz ale sie nie zapala po odcieciu zasilania, zatem przerwanie sie nie wywoluje. Natomiast wszystko.jest ok jak zwieram INT0 do gnd

    Dodano po 3 [minuty]:

    excray napisał:
    Zasilanie wyświetlacza zrób za diodą - tak jak uC lub zadbaj aby przed uśpieniem wszystkie piny które łączysz z LCD były w stanie niskim.


    Ok, ustawie je przed uśpieniem chociaz gdyby przerwanie sie wywoływalo to.jak widać w zamieszczonym.kodzie również zeruje IO.
    Ale jak zrobie zasilanie wyswietlacza za diodą to przy zaniku vcc wyswietlacz bedzie podkradał prąd dla uC z kondensatorów. Nie wiem czemu ma słuzyc to rozwiazanie
  • #26 17521258
    Konto nie istnieje
    Konto nie istnieje  
  • #27 17521350
    dasej
    Poziom 32  
    @Jakub17

    Zmontowałem układ na ATmega644 zegar 18Mhz, płytka stykowa i bateryjka 3.6V.

    Tak to wygląda.
    Wykrywanie zaniku zasilania na INT0 i podtrzymanie mikrokontrolera

    Tak to działa





    A tu pełen kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jak widać wszystko działa. Błąd masz u Siebie.
  • #28 17521395
    Jakub17
    Poziom 6  
    StaryUczen
    Możesz podesłać schemat ze swoim rozwiązaniem?

    Dodano po 1 [minuty]:

    dasej
    W main ustawiasz przerwanie od zbocza narastającego ustawiajac bity ICS00 I 01. Podtrzymabie zasilania jest na bateriach czy kondensatorach?
  • Pomocny post
    #29 17521421
    Konto nie istnieje
    Konto nie istnieje  
  • #30 17521439
    Strumien swiadomosci swia
    Poziom 43  
    Kolego <ciach>, wepnij 2 diody LED na wolne piny i jedną zapal przed zapisem, a drugą po zapisie EEPROM w obsłudze INT.

    Będziesz wiedział czy w ogóle wystarcza energii na ten krok.

    Moderowany przez Marek_Skalski:

    Poprawiłem pisownię i usunąłem niewłaściwe określenie.
    3.1.9. Nie ironizuj i nie bądź złośliwy w stosunku do drugiej strony dyskusji. Uszanuj odmienne zdanie oraz inne opinie na forum.

REKLAMA