Skocz do zawartości

Usypianie Arduino + watchdog


Ra5273x

Pomocna odpowiedź

A przed czym ten watchdog miałby chronić system? Albo inaczej: co jest kluczową działalnością proocesora, którą chcesz mieć za wszelką cenę? Czy CPU usypiasz do stanu POWERDOWN czy IDLE? Może opisz szerzej co chcesz uzyskać tj. co w ogóle robisz, bo rozwiązanie wcale nie musi być trywialne. A pytam o kluczowe zadania, bo to z nimi musisz powiązać kasowanie/restarty watchodga. Wszelkie patetny typu kasujemy w przerwaniu okresowym np. od timera są bez sensu.

Link do komentarza
Share on other sites

Usypiam arduino aby oszczędzać prąd w aucie w taki sposób, 

void sleepNow() // here we put the arduino to sleep
 {
 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
 sleep_enable(); // enables the sleep bit in the mcucr register
 attachInterrupt(0,wakeUpNow_1, HIGH); // use interrupt 0 (pin 2) and run function
 attachInterrupt(1,wakeUpNow_2, HIGH); // use interrupt 0 (pin 2) and run function
 sleep_mode(); 
 sleep_disable(); // first thing after waking from sleep:
 Wlacz_Zasilanie_ACS;
 detachInterrupt(0); // disables interrupt 0 on pin 2 so the
 detachInterrupt(1); // disables interrupt 0 on pin 3 so the

}

Wybudzany procesor jest przez D2 D3 potem po 25s procesor z powrotem się usypia, chce dodać watchdog aby procesor się nie zaciął a jeżeli już to ma się zresetować.

Arduino steruje przekaźnikami około 5s i potem 25s czeka i się usypia.

Link do komentarza
Share on other sites

WDT ma dwie główne funkcje, jedną z nich jest wybudzanie procesora z trybu SLEEP_MODE_PWR_DOWN, drugą to dbanie o ciągłość pracy programu. W trybie uśpienia nic Ci się nie zawiesi (bo wszystko przecież sam zatrzymałeś) i korzystasz z funkcji wybudzania, po ponownym wznowieniu działania programu możesz go "ustawić" w tryb ochrony przed zawieszeniem - do ewentualnego generowaniem resetu. W trybie uśpienia budzisz uC co max 8s, bo tyle max można ustawić czas WDT, jak potrzebujesz ustawić spanie na ~60s to możesz go uśpić na 15x4s lub 8x8s. Gdy to nie jest to właściwe przebudzenie to natychmiast usypiasz go ponownie.  Gdy uC nie ma się okresowo wybudzać to po prostu wyłączasz WDT, włączasz po ponownym wybudzeniu. Dzięki temu można zejść ze zużyciem prądu w czasie uśpienie poniżej 200nA. Z włączonym WDT zużycie prądu sporo rośnie, coś w końcu musi działać. No i generalnie to "sporo" ma znacznie na swojej płytce, ewentualnie w PRO MINI z wylutowanymi LED, w UNO i tak działają ledy/mostki/itp, które nawet jak wyjmiesz Atmegę z płytki zjadają kilkadziesiąt mA.

Opis użycia do wybudzania: http://www.gammon.com.au/forum/?id=11497 , przy okazji sporo informacji jak to robić by uzyskać te 100-200nA, jak wyłączyć naprawdę wszystko.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To może zamiast kombinować z usypianiem i walczyć z problemami, które sam sobie stwarzasz (jak niektóre rządy) pomyśl nad dwoma rzeczami:

  1. Ile tak naprawdę prądu będzie to średnio ciągnęło. Bo jeśli piszesz coś o przekaźnikach włączanych na 5s co 25s to i tak wyjdzie pewnie z 5-10mA średnio. A przy takim poborze mocy walka o uA nie ma sensu. Cały samochód bierze kilka/naście mA bez włożonego kluczyka (alarm, czujniki ultradźwiękowe itp) więc robienie wyczynowego urządzenia pobierającego <1uA w tych warunkach nie ma sensu.
  2. Jeśli chcesz mimo wszysko powalczyć, to dużo prościej będzie gdy zejdziesz z zegarem procesora. Jeśli masz tylko załączyć jakieś sygnały, coś tam zmierzyć czy tam  sprawdzić stan jakichś prostych czujników (bez szybkich komunikacji np. z graficznym LCD czy przez UART) to przecież nie potrzebujesz 16 lub 8MHz:
  • przełącz się (fusami) na wewnętrzny oscylator RC (8MHz) i ustaw jego podział przez 8 co od razu daje 1MHz
  • jeśli i to jest za szybko (a już masz pobór prądu rzędu 1mA w stabnie aktywności i <200uA w IDLE) to zmień fusy na wewnętrzny generator 128kHz - to już tylko ok. 20uA w stanie aktywnej pracy, rzecz nie do pogardzenia
  • jeśli i to jest za szybko (możesz też wcześniej), to zainteresuj się głównym podzielnikiem częstotliwości, czyli rejestrem CLKPR gdzie możesz zwalniać procesor od 2 do 256 razy
  • a jeśli i to do Ciebie nie przemawia, wlutuj kwarc zegarkowy 32.768kHz i ciesz się poborami na poziomie pojedynczych uA w czasie pracy - nie można wtedy za wiele zrobić, ale załączanie przekaźników i odliczanie czasu nie potrzebuje wiele.

Procesory CMOS są fajnie skalowalne z zegarem i dzięki takim prostym zabiegom być może wcale nie musisz nieczego usypiać a ciągle pracujące CPU łatwiej kontrolować i łatwiej też wstawić do kodu watchdog w sensownym miejscu.

Widzisz, dlatego pytałem co dokładnie robisz. Bez takiej wiedzy możemy tylko gdybać i pokazywać opcje. Gdybyś napisał co masz tam wokół procesora (jakie peryferia) i co musisz zrobić to nie rzucalibyśmy kulą w płot tylko dostałbyś konkrety. No nic, mam nadzieję, że pomyślisz o manipulacjach zegarem procesora. Nie zasilasz tego z baterii pastylkowej tylko z akumulatora samochodowego więc staranie się o prądy uA to sztuka dla sztuki.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Użycie WDT w kodzie to dwie linijki (no trzy z biblioteką, cztery jak również go wyłączasz):

/*
1 s WDTO_1S ATMega
2 s WDTO_2S ATMega
4 s WDTO_4S ATMega
8 s WDTO_8S ATMega
wdt_enable(WDTO_4S);
wdt_disable();
wdt_reset();
 */
#include <avr/wdt.h>

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);
wdt_enable(WDTO_4S);
Serial.println("Program został uruchomiony na nowo.");
}

void loop() {
  // put your main code here, to run repeatedly:
wdt_reset();
static int zmienna=0;
delay(1000);
Serial.print("Program dziala od sekund: ");
Serial.println(zmienna++);
delay(zmienna*100);
}

W komentarzu we wstępie jest zestawienie przydatnych opcji. Program tak musi być napisany, bo do pierwszego polecenia w loop wracał nie rzadziej niż czas do resetu. Jeśli używasz gotowej płytki Arduino to usypianie tak średnio się opłaca. Jeden led może zużyć więcej prądu niż uC, a jeszcze ustawiony tak jak proponuje marek1707 to już w ogóle...

Link do komentarza
Share on other sites

No właśnie moja płytka po uspaniu pobiera 2-3mA, przy normalnej pracy ok 15mA, układ musi być usypiany bo będzie na stałe w samochodzie i nasłuchuje na naciśnięcie przycisku(podanie napięcia na D2 lub D3) przekaźniki są uruchamiane tylko gdy auto będzie odpalone więc wtedy pobór prądu ok 37mA mnie nie martwi. Czytam właśnie jak zrobić przerwanie wewnętrzne które obudzi procesor, zrestartuje watchdog, i uśpi arduino, do arduino nie będzie dostępu więc jak się zatnie to kaplica. 

Link do komentarza
Share on other sites

Podaj możliwą przyczynę "zacięcia się" arduino - od tego zależy rozwiązanie.

Coś  mi się wydaje, że ten program nie jest specjalnie dobrze napisany i akurat teraz jest ten moment, kiedy cały kod wywalasz do kosza i piszesz go od nowa - tym razem uwzględniając już od początku watchdogi, sleepy i inne tego typu firdymałki... no ale to Twój kod i to Ty decydujesz.

Link do komentarza
Share on other sites

Wydaje mi się że kod się nigdy nie powinien zaciąć, nie posiadam ani jednego delaya, przy sterowaniu przekaźników wysyłam po UART "silnik 1 włączony" itp. No ale wolałbym aby arduino się zresetowało jeżeli za tydzień,miesiąc, rok się zatnie a ja będę musiał rozbierać pół samochodu aby się do niego dostać.

Link do komentarza
Share on other sites

Samochód to akurat bardzo wredne środowisko dla Arduino - mnóstwo zakłóceń, zawsze jest szansa że coś tam polezie po zasilaniu i procek zrobi coś nieprzewidywalnego (np. wyłączy watchdoga). Takie pilnowanie samego siebie przypomina mi historię pewnego barona, co sam się za włosy z bagna wyciągnął...

Fajnie, że zakładasz bezbłędność kodu (ja na przykład bałbym się takich założeń) ale przewidziałbym możliwość resetu. Mam takie jedno ustrojstwo sterujące światłem w pokoju, w ciągu 5 lat zwiesiło się dwa razy przy większej burzy - co prawda żeby zrobić reset muszę sięgnąć dość daleko i w mało wygodne miejsce, ale nie muszę wyłączać bezpieczników w domu ani włazić na drabinę żeby wdusić reset... a mój dom nie jedzie setką po autostradzie.

Dlaczego mówię że program jest źle napisany? Bo stwierdziłeś na początku, że masz gotowy kod (który nie przewidywał żadnych zacięć i watchdogów) a teraz na siłę chcesz dorobić coś, czego nie miałeś w założeniach..

A zmiana założeń (w tym przypadku uwzględnienie zacięć i watchdogów) to zmiana kodu.

Tak przy okazji - delay to funkcja która się akurat rzadko zacina, i nieposiadanie delayów nie oznacza bezbłędności programu.

 

Link do komentarza
Share on other sites

1 godzinę temu, radex324 napisał:

po uspaniu

A dlaczego uważasz, że te 2-3mA "w uspaniu" to dużo? Czy mierzyłeś ile pobiera Twój samochód bez tego magicznego urządzenia? Czy możesz jakoś się odnieść do kwestii zwalaniania zegarów? Nie rozumiesz tego, boisz się kombinować bo i tak jesteś przerażony projektem czy po prostu nie chciało Ci się o tym pomyśleć bo upał? Czy mógłbyś jednak w punktach wypisać co urządzenie będzie robiło podczas czuwania i po wybudzeniu w zależności od stanu czujników lub np. samochodu? Nie chodzi mi o fukcje użytkowe, bo pewnie nie chesz zdradzać jakiejś tam wielkiej tajemnicy, ale o aktywności procesora? Dlaczego nie możesz zrobić tak, by w czasie oczekiwania w stanie POWERDOWN na jeden z dwóch sygnałów, watchdog zwyczajnie okresowo dawał procesorowi po głowie - przecież i tak coś się musi zadziać, niech to będzie restart CPU. A gdy procesor dostanie D0 lub D1 wybudzi się do stanu aktywnego i tam zacznie kasować watchdog w jakimś sensownym i kluczowym miejscu. A gdy pójdzie spać (nie wiem, po wyjęciu kluczyka, czy co tam sobie wy myśliłeś) to znów co 8s.. czapa.  Czya aktywność urządzenia jest jakoś skorelowana z pracą silnika? Bo wiesz, podczas pracy alternatora możesz pobierać bezkarnie nawet i 100mA i nikt tego nie zauważy.

Wyjściem w sytuacji zabudowania urządzenia jest takie zaprojektowanie wejść D0 i D1 by te zgłaszały na chwilę RESET procesora a oprócze tego były doprowadzone do pinów portów jużnie jako przerwania tylko zwykłe wejścia. Wtedy aktywacja dowlnego z nich z definicji resetuje procesor, który wstając odczytuje stan wejść i robi co tam miał zrobić..

Link do komentarza
Share on other sites

(edytowany)

@marek1707 Samochód podczas postoju pobiera około 10-20mA, moje arduino po podaniu napięcia czeka 30s i się usypia(zmniejsza pobór do 2mA)  potem oczekuje na 2 sygnały(wysokie) D2 D3 otwarcia lub zamknięcia samochodu. Jeżeli auto się otworzy to arduino wstaje i już nie pójdzie spać, włączy na chwile przekaźnik i tak sobie będzie czekać na sygnał zamknięcia który spowoduje włączenie przekaźnika nr.2 na chwilkę i pójdzie spać. Chcę dorobić tylko to aby co 8s zrestartował się watchdog, aktualnie się bawię z watchdog ustawiając go na 8s i wstawiając delay na 9-10 sekund aby symulować zacinanie się procesora, jednak arduino tkwi w pętli restartów(miga dioda "L"). Mozliwe że źle zrozumiałem działanie watchdog i temu robię takie głupie testy.

#include <avr/wdt.h>
int licznik = 0;
void setup(){
  Serial.begin(115200);
   wdt_enable(WDTO_8S);
   Serial.println("!!! RESTART !!!");
}

void loop(){
   licznik++;
   Serial.print("Licznik = ");
   Serial.println(licznik);
   delay(10000); // symulacja zaciecia
   wdt_reset();
}

 

Winą jest stary bootloader, muszę wgrać nowszą wersje. 

ps. http://donalmorrissey.blogspot.com/2010/04/sleeping-arduino-part-5-wake-up-via.html Z tej strony informacje wziąłem i zrobiłem to co chciałem.

Kod jednak nie działa wg. moich założeń restartuje się podczas snu.

Edytowano przez radex324
Link do komentarza
Share on other sites

Rowniez mam ciekawe przygody z tym watchdog...na pro mini kod ktory podal @kaczakat dziala w ten sposob ze...dziala jak chce, nieregularnie, zawiesza sie tak ze albo trup albo dioda "L" szybko miga i tez trup...pomaga tylko odlaczenie zasilania. Doczytalem ze pasuje wrzucic optiboot'a no i tak...pobralem z gita zip wyodrebnilem i skopiowalem do folderu hardware w folderze Arduino...w menu sa widoczne nowe plytki ale podczas proby wypalenia boota wywala odrazu blad...wiec pobralem jeszcze minicore z gita i tu boot sie wypala bez problemu tylko ze ta opcja kompatybilna tylko z Uno...no ale dziala na pro mini...o matko..😕 moglby mi ktos tak w dwoch zdaniach rozjasnic kwestie tego optiboota/minicore jak to jest z tymi kompatybilnosciami?? Skoro boot jest dla Uno to moge go zastosowac do pro mini? Bo przeczytalem tysiac roznych rzeczy i mi sie juz wszystko poplatalo...

edit..podczas proby wypalenia optiboota wywala taki blad..hh.thumb.png.c81e6ab027764664afb82f64a2994d50.png

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Możesz wgrać dowolny bootloader "arduinowy" do PROMINI byle uC był zgodny, np. dla 328P do wyboru masz bootloader z UNO/NANO/PROMINI. Po tym jak wgrasz bootloader od UNO jako płytkę do wgrywania w Arduino IDE wybierasz UNO.  Akurat PROMINI miał zwalony bootloader w zakresie działania WD, nowe wersje mają to poprawione, ale jak używasz klona to Chińczycy przez 10 lat nie wpadli na to by wgrywać aktualny. Jeśli masz w miarę nowy program Arduino IDE to wystarczy wgrać aktualny bootloader PRO MINI dołączony standardowo, to już powinien być ten od OPTIBOOT.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.