Co może spowodować nieoczekiwany reset mikrokontrolera?

26

Jedną ze szczególnie irytujących odmian błędów w systemie kontrolowanym przez mikroprocesor jest nieoczekiwany reset mikroprocesora. Ważnym narzędziem do debugowania tego rodzaju problemów jest lista możliwych przyczyn. Co może spowodować nieoczekiwany reset mikrokontrolera?

Stephen Collings
źródło
1
Niektóre odpowiedzi tutaj mogą być pomocne: electronics.stackexchange.com/questions/30430/... Jakiego mikrokontrolera używasz?
Jon L
Zazwyczaj używam dsPIC. Ale nie próbuję teraz debugować niczego szczególnego, po prostu kompiluję listę potencjalnych problemów.
Stephen Collings,
2
czy to jest zadanie domowe?
old_timer
1
@dwelch Prawdopodobnie dla kogoś, ale nie dla mnie ani żadnego z moich studentów.
Stephen Collings,
1
@Vorac musi przeczytać, że Atmel nie może zobowiązać się do zachowania wiarygodności adresu URL.
Kaz

Odpowiedzi:

51

W układach PIC i dsPIC zaobserwowałem następujące przyczyny nieoczekiwanego resetu.

Sprzęt komputerowy:

  • Zresetować pin sterowany niskim lub swobodnym Najpierw sprawdź oczywiste rzeczy!
  • Sprzęgło ESD w bolcu resetującym. Widziałem to, gdy na tym samym biurku włączano całkowicie niezwiązany sprzęt. Upewnij się, że na pin resetujący jest wystarczająca pojemność, być może nawet 1 uF.
  • Sprzężenie ESD z innymi pinami procesora. W szczególności sondy zakresowe mogą działać jak anteny, sprzęgać szumy z chipem i powodować dziwne resety. Słyszałem raporty o resetowaniu kodów „niepoprawnego kodu operacyjnego”.
  • Zły styk lutu / przerywany mostek. Może to oznaczać zgubienie lub zwarcie szyny zasilającej na procesorze lub w innym miejscu na płycie.
  • Usterka / hałas szyny zasilającej. Może to być spowodowane wieloma problemami zewnętrznymi, w tym uszkodzonym regulatorem lub spadkiem dostaw. Upewnij się, że szyny zasilające procesor są stabilne. Może wymagać gdzieś więcej ograniczeń, być może oddzielenie ograniczeń bezpośrednio na procesorze.
  • Niektóre mikrokontrolery mają styk Vcap, który nie może być podłączony do VDD i musi mieć wspólny kondensator. Nieprawidłowe podłączenie tego pinu może mieć nieprzewidywalne skutki.
  • Przejechanie ujemnego wejścia analogowego poza określony limit powoduje zresetowanie, które zgłasza się w RCON jak brak prądu. To samo może dotyczyć wejść cyfrowych.
  • Bardzo wysokie dV / dt w pobliskim przetworniku mocy może spowodować reset wyłączenia. (Zobacz to pytanie .) Widziałem to w dwóch przypadkach i w jednym byłem w stanie prześledzić to do sprzężenia pojemnościowego. IGBT przełączał 100-200 amperów, a przy wyłączaniu niektóre obwody sprzężenia zwrotnego widziały kilka mikrosekund hałasu, przechodząc z 2 V do ponad 8 V na procesorze 3,3 V. Zwiększenie nasadki filtra na szynie sprzężenia zwrotnego spowodowało zatrzymanie resetowania. Można sobie wyobrazić, że dodanie filtra dV / dt przez tranzystor mogło mieć podobny efekt.

Oprogramowanie:

  • Timer nadzorujący. Upewnij się, że licznik czasu watchdoga jest czyszczony wystarczająco często, szczególnie w gałęziach kodu, których wykonanie może zająć dużo czasu, tak jak w przypadku EEPROM. Przetestuj to, wyłączając watchdog, aby zobaczyć, czy problem zniknie.
  • Dzielony przez zero. Jeśli wykonujesz dowolną operację dzielenia w kodzie, upewnij się, że dzielnik nigdy nie może być równy zero. Dodaj granicę przed podziałem. Nie zapominaj, że dotyczy to również operacji modulo .
  • Przepełnienie stosu. Zbyt wiele zagnieżdżonych wywołań funkcji może spowodować, że w systemie zabraknie pamięci dynamicznej stosu, co może prowadzić do awarii w nietypowych momentach wykonywania kodu.
  • Przepełnienie stosu. Jeśli programujesz w asemblerze, możesz przypadkowo wykonać więcej ZWROTÓW niż wykonałeś POŁĄCZENIA.
  • Nieistniejąca procedura przerwania. Jeśli przerwanie jest włączone, ale nie zdefiniowano żadnej procedury przerwania, procesor może się zresetować.
  • Nieistniejąca procedura pułapki. Podobne do procedury przerwań, ale wystarczająco różne, wymieniam ją osobno. Widziałem dwa osobne projekty korzystające z dsPIC 30F4013, które resetują się losowo, a przyczynę śledzono w pułapce, która została wywołana, ale niezdefiniowana. Oczywiście teraz masz pytanie, dlaczego pułapka jest wywoływana w pierwszej kolejności, co może być dowolną liczbą rzeczy, w tym błędem krzemowym. Jednak zdefiniowanie wszystkich programów obsługi pułapek powinno być dobrym początkowym krokiem w diagnozowaniu niewyjaśnionych resetów.
  • Błąd wskaźnika funkcji. Jeśli wskaźnik funkcji nie wskazuje prawidłowej lokalizacji, wyrejestrowanie wskaźnika i wywołanie wskazanej funkcji może spowodować reset. Jedną z zabawnych przyczyn tego było inicjowanie struktury z kolejnymi wartościami NULL (dla wskaźnika funkcji) i -1 (dla int). Przecinek został literówka, więc wskaźnik funkcji został zainicjowany na NULL-1. Więc nie zakładaj, że tylko dlatego, że jest to CONST, musi zawierać prawidłową wartość!
  • Nieprawidłowy / ujemny indeks tablicy. Upewnij się, że wykonujesz sprawdzanie granic dla wszystkich indeksów tablic, zarówno górnej, jak i dolnej granicy, jeśli dotyczy.
  • Tworzenie tablicy danych w pamięci programu, która jest większa niż największa część pamięci programu. Może to nawet nie spowodować błędu kompilacji.
  • Przesłanie adresu struktury do wskaźnika na inny typ, usunięcie dereferencji z tego wskaźnika i użycie dereferencyjnego wskaźnika jako wartości LVALUE w instrukcji może spowodować awarię. Zobacz to pytanie . Przypuszczalnie dotyczy to również innych niezdefiniowanych zachowań.

W niektórych dsPIC rejestr RCON przechowuje bity wskazujące przyczynę resetu. Może to być bardzo pomocne podczas debugowania.

Stephen Collings
źródło
1
@ reset pin: pływający pin reset znany jest z fałszywych resetów. Zawsze przywiązuj go do Vcc przez rezystor.
jippie
4
To niezwykle wyczerpująca lista. Wierzę w moje doświadczenia z AVR, że większość, jeśli nie wszystkie z tych samych sytuacji, spowodują nieoczekiwane wyniki lub resety.
HL-SDK,
4
Dodaję jeszcze jeden do programowania w języku asemblera - Niezrównany rejestr PUSH i POP ze stosu.
Michael Karas
2
Jeszcze kilka: w ramach sprzętu reset resetowania. W oprogramowaniu instrukcja resetowania oprogramowania. Oba są dostępne na kilku mikrokontrolerach.
tcrosley,
2
Kolejny na liście: telefony komórkowe umieszczone w pobliżu kabla mogą wywoływać zaskakująco znaczące napięcia na słabo napędzanych liniach. Jeśli masz linię resetowania przechodzącą przez kabel (np. Aby jedna karta mogła wymusić reset drugiej), telefon komórkowy w pobliżu kabla może wywołać reset, jeśli np. Odbierze połączenie.
supercat
7

Pin RESET musi być odpowiednio napędzany przez obwód resetu monitorujący napięcie za wysokie / za niskie i wytwarzający wystarczająco długi sygnał resetowania. Mając to na uwadze, moje doświadczenia związane z niekontrolowanym resetowaniem sprzętu pochodzą z:

  • Przesłuch z przełączania linii na pin / linię RESET (skróć je)
  • Przesunięcia uziemienia / pętla spowodowane włączeniem / wyłączeniem zewnętrznego obciążenia wysokoprądowego
  • Skok napięcia nie jest filtrowany przez zasilacz i jest zbyt krótki, aby aktywować prawidłowe RESET
  • Przełączanie obciążeń zewnętrznych przez mikrokontroler, co powoduje powyższe problemy (głównie przy obciążeniach indukcyjnych, takich jak włączanie / wyłączanie silnika, przekaźniki lub stara lampa (prąd rozruchowy)
  • Skok napięcia / prądu na dowolnym z pinów mikrokontrolera (najgorszy jest oscylator) może powodować odwrotny prąd i może przełączać rejestr wewnętrzny (tak samo jak skoki napięcia na linii zasilającej). Ogólnie rzecz biorąc, w przypadku łączenia się z pewnego rodzaju środowiskiem przemysłowym należy zachować ostrożność (więcej informacji: http://www.ichaus.biz/wp1_mcu_interface ). Należy wziąć pod uwagę przesunięcie poziomu we / wy, filtrowanie wejść i wyjścia łagodnego przełączania. Czyszczenie linii zasilających ma pierwszeństwo po stronie sprzętowej. Następnie RESET i piny oscylatora, a następnie linie IO. -mm
użytkownik27465
źródło
1
Przesunięcia ziemi tylko mnie ugryzły. W moim przypadku konkretna część mojej wspólnej sieci zawierała ~ 100 amperów. Mikrokontroler został odniesiony do jednej strony tego grubego śladu, ale niektóre obwody, które napędzał mikrokontroler, były odniesione do drugiego końca śladu. Śledzenie wynosiło zaledwie 3 mOhm, ale przy 100 amperach to wystarczy, aby uzyskać różnicę 300 mV między mikro a urządzeniami peryferyjnymi, które napędzał. Przekierowałem urządzenia peryferyjne, aby były wspólne dla tego samego końca tego śladu, co kontroler, i wszystko jest teraz w porządku. Przy tych prądach nie ma czegoś takiego jak węzeł.
Stephen Collings
4

Jedną dodatkową możliwością, której nie widziałem na tej liście, jest urządzenie obsługujące ICSP. Jeśli niewystarczające podciągnięcia są stosowane na liniach, które wyzwalają w trybie programowania szeregowego obwodu, czasami można przypadkowo wejść w ten tryb. Prowadzi to do resetu po krótkim czasie, gdy żadna aktualizacja programu nie jest wysyłana do wyznaczonych linii odbiornika szeregowego. Podejrzewam, że wewnętrzny zegar nadzorujący wymusza resetowanie, jeśli ICSP zostanie uruchomiony i nie zostaną wysłane żadne dane programowe. To jest błąd, który popełniłem i spędziłem dużo czasu na szukaniu 16F876.

steverino
źródło
3

Upewnij się, że jeśli używasz układów logicznych CMOS lub TTL w swoim obwodzie, że mają one odpowiednie kondensatory odsprzęgające w poprzek Vdd i masy (zwykle 0,1 uF). Używałem CD4021 w projekcie, a kiedy był w użyciu, najwyraźniej powodował pewien skok, który powodował restart mikroprocesora. Następnie cykl się powtórzy. Dlatego też dobrym pomysłem jest umieszczenie na początku kodu oczywistej sekwencji testowej (np. Kilkukrotne miganie diody LED), abyś wiedział, że mikroprocesor działa i wykonuje kod.

Mark Jensen
źródło
2

To jedna z tych rzadkich rzeczy, które mogą się pojawić:

Miałem projekt z mikrokontrolerem, który sporadycznie się resetuje. Krótko mówiąc, okazuje się, że niektóre opcje musiały być włączone lub wyłączone, w przeciwnym razie mogą wystąpić resety. Dowiedziałem się o tym, czytając erratę po tym, jak zrezygnowałem ze wszystkiego innego.

Teraz mam w zwyczaju czytać erratę, zanim jeszcze zdecyduję się użyć chipa, aby dowiedzieć się, w co się pakuję i czy jest to coś, z czym mogę sobie poradzić. Niestety, po ukończeniu studiów tak naprawdę nie miałem nikogo, kto mógłby mnie pouczyć o powszechnych praktykach, więc w moim prawdziwym świecie nauka polegała na niepowodzeniach i frustracji.

efox29
źródło
Nawet nie zdawałem sobie sprawy, że to pytanie było stare i już udzielono odpowiedzi. Ups
efox29