Autor: Dondu
Często zdarzają się problemy związane z nieoczekiwanym resetowaniem się mikrokontrolera. Wykrycie przyczyny tego zjawiska może być niezmiernie trudne dla początkującego.
Czy tylko dla początkującego?
Nie, o czym przekonali się na przełomie lat 2011/2012 inżynierowe NASA, którzy przez dwa miesiące szukali przyczyny resetu sondy Mars Science Laboratory Curiosity rover (na zdjęciu), który wydarzył się 29 listopada 2011r (trzy dni po starcie z Ziemi).
Dopiero 9 lutego 2012r. zakończono pracę nad znalezieniem i rozwiązaniem problemu:
Project Manager Richard Cook
Good detective work on understanding why the reset occurred has yielded a way to prevent it from occurring again
Good detective work on understanding why the reset occurred has yielded a way to prevent it from occurring again
tłumaczenie:
Project Manager Richard Cook
Dobra praca detektywistyczna nad zrozumieniem, dlaczego reset wystąpił, pozwoliła nam wypracować drogę do zapopiegania ponownemu jego występowaniu.
Dobra praca detektywistyczna nad zrozumieniem, dlaczego reset wystąpił, pozwoliła nam wypracować drogę do zapopiegania ponownemu jego występowaniu.
i nie pracował nad tym problemem tylko jeden inżynier, lecz cały zespół. :-)
Szczegóły: NASA: Spacecraft Computer Issue Resolved
EDIT:
13 listopada 2013r. Przydarzył się drugi reset: Curiosity: Reset niekontrolowany nr 2.
Najczęstsze przyczyny niekontrolowanych resetów.
.1. Zasilanie i zakłócenia
Bardzo częsty przypadek, a jednocześnie temat rzeka opisany w kilku osobnych artykułach:
2. Watchdog
Reset następuje, gdy po włączeniu wewnętrznego układu Watchdog zapominasz zerować jego licznik lub robisz to rzadziej niż ustawiony czas watchdoga.
3. Brown Out Detection (BOD)
Reset następuje w momencie wykrycia przez włączony wewnętrzny układ BOD napięcia zasilania poniżej wybranego przez Ciebie progu.
4. Brak pętli nieskończonej
Reset następuje po dojściu do końca programu. Dlatego w większości przypadków powinieneś w programie umieścić nieskończoną pętlę for(), while(), do() lub inną.
5. Brak wektorów przerwań
Włączenie któregoś z przerwań bez zadeklarowania funkcji jego obsługi kończy się bliżej nieokreślonym rezultatem.
Czasami się patrzy, a nie widzi :-)
6. Zbyt duży zegar przy danym zasilaniu
Znaczna część mikrokontrolerów może pracować na różnych napięciach zasilania. Niestety część z nich ma ograniczenia częstotliwości zegara, którym mogą być taktowane przy danym napięciu. W szczególności dotyczy to sytuacji, gdy chcesz użyć duży zegar przy niskim napięciu zasilania.
Przykład:
Rys. Przykład ograniczenia - zegar vs Vcc |
Rys. Przykład ograniczenia - zegar vs Vcc |
Mikrokontrolery pobierają prąd impulsowo w zależności od wielu czynników wewnętrznych i programowych. Często może dojść do sytuacji, w której mikrokontroler pobiera znacznie więcej prądu, niż dostarcza mu zasilające go źródło, co skutkuje natychmiastowym spadkiem napięcia zasilania, a w konsekwencji nieprawidłowego działania lub resetu mikrokontrolera.
W szczególności może to się zdarzyć, przy zasilaniu bateryjnym lub ze stabilizatorów LDO o małym prądzie wyjściowym.
8. Skok do adresu 0 (zero)
To raczej świadome działanie, ale czasami użycie do skoku adresu obliczanego w niedopracowany sposób, może powodować rozpoczęcie programu od niekontrolowanego miejsca lub od początku.
Należy pamiętać, że skok do adresu 0, to nie jest w pełnym tego słowa znaczeniu reset, ponieważ wewnętrzne układy nie są sprzętowo resetowane.
Należy pamiętać, że skok do adresu 0, to nie jest w pełnym tego słowa znaczeniu reset, ponieważ wewnętrzne układy nie są sprzętowo resetowane.
Brak komentarzy:
Prześlij komentarz