at90s2313 resety i zwisy

Jan 31, 2010 19 Replies

Witam, Postanowiłem opisać pewien problem z układem mojej konstrukcji, który nie zachowuje się tak jak powinen. Otóż skonstruowałem sterownik do wentylatora łazienkowego na procesorze jak w temacie. Układ ma za zadanie uruchamiać wentylator na 2 możliwych biegach (pełna prędkość oraz zredukowana czyli cicha) oraz ma dawać możliwość wyboru jednego z kilku zaprogramowanych czasów pracy. Całe sterowanie odbywa się przy pomocy jednego wyłącznika sznurkowego jaki jest dołączony do wentylatora zaś procesor rozmawia z użytkownikiem przy pomocy mrugania jedną diodą led. W tescie nazwijmy to laboratoryjnym (czyli sterowanie żarówką zamiast wentylatora) układ działa znakomicie, natomiast po zamontowaniu ustrojstwa w kibelku układ od czasu do czasu robi dziwne fochy. Zdarza się mu bardzo często resetować procesor przy załączaniu wentylatora i przy jego wyłączaniu. To akurat nie jest dużym problemem bo po restarcie program rusza z domyślnymi ustawieniami i da się z tym żyć. Niestety, od czasu do czasu, powiedzmy raz na 2 tyg. przy wyłączaniu wentylatora procesor zawiesza się. Wchodzi w jakieś sobie tylko znane fragmenty kodu, co skutkuje brakiem lub nieprawidłową reakcją na pociągniecia wyłącznikiem sznurkowym oraz przypadkowym mruganiem diody. I nijak nie da się go z tego stanu wprowadzić. Koniecznie jest odłączenie go od zasilania. Tego efektu chciałbym się pozbyć i gdyby ktoś miał pomysł jak to zrobić to byłbym hepi. Kilka słów na temat hardware'u. Procek pracuje w standardowej aplikacji, zasilany jest ze stabilizatora + spore elektorlity filtrujące. Pin reset wisi w powietrzu gdyż wcześniejsze testy wykazały, że to jest najstabilniejsze rozwiązanie (podciąganie do plusa skutkowało większą wrażliwością procka na resety). Elementami wykonawczymi są 2 przekaźniki sterowane przez tranzystory,które są bezpośrednio sterowane z portów procesora. Jeden z przekaźników sluży do włączania 230V na wentylator, drugi zaś ma za zadanie zwierać (lub rozwierać) kondensator, który w obwodzie wentylatora ma za zadanie zmniejszać jego obroty. Wiem, że takie rozwiązanie jest nie do końca właściwe, powinienem zastosować jeszcze transoptory do optoizolacji portów i tranzystorów sterujących przekaźnikami. Ale cóż, układ robiłem z elementów dostępnych w szufladzie i złożyłem go na płytce uniwersalnej w kilka godzin. Nie chce mi się po prostu modyfikować strony sprzętowej gdyż sterownik w sumie działa w porządku. Irytujące jest tylko to zawieszanie procka. Nie jestem elektronikiem, zajmuję się elektroniką hobbystycznie i to od przypadku do przypadku. Dlatego zwracam się do mądrzejszych odmnie: co jest przyczyną zwisów procka? Oczywiście mój układ generuje silne impulsy zakłócające i procek ma prawo się resetować, ale co z tym zwisaniem? Co wtedy robi wachdog? Przecież procek w tym stanie nie powiniem przejść testów diagnostycznych i watchdog powieniem go zresetować. Program sterujący napisałem w bascomie, dla dociekliwych załączam listing poniżej. Dziękuję za uwagę i pozdrawiam Tomek


Config Portb = &01111111 Config Portd = &1111111 Portb = &B11111111 Portd = &B1111111 Config Timer0 = Timer , Prescale = 64 Config Timer1 = Timer , Prescale = 64 Stop Ac



Dim Oldb As Bit Dim Newb As Bit Dim Clik As Byte Dim Sclik As Bit Dim Dclik As Bit Dim Tclik As Bit Dim Per As Byte Dim Oldclik As Byte Dim Newclik As Byte Dim Diffclik As Byte Dim Setczas As Word Dim Licz As Word Dim Mryg As Byte Dim Czest As Byte Dim Nastawianie As Bit Dim Czasy(7) As Word Dim Blyski(7) As Byte Dim Index As Byte Dim Indexp As Byte Dim Czasnas As Byte Dim Czasreset As Word



On Ovf0 Bleble On Timer1 Co1s Enable Interrupts Enable Int0 Enable Timer0 Enable Timer1



Czasy(1) = 300 Czasy(2) = 600 Czasy(3) = 900 Czasy(4) = 1800 Czasy(5) = 3600 Czasy(6) = 5400 Czasy(7) = 7200



Blyski(1) = 6 Blyski(2) = 11 Blyski(3) = 21 Blyski(4) = 40 Blyski(5) = 80 Blyski(6) = 150 Blyski(7) = 254


Clik = 0 Sclik = 0 Dclik = 0 Tclik = 0 Oldclik = 0 Oldb = Pinb.0 Per = 0 Licz = 0 Mryg = 0 Index = 3 Czest = Blyski(index) Setczas = Czasy(index) Nastawianie = 0



Do


If Czasreset = 0 Then Tclik = 0 Clik = 0 Sclik = 0 Dclik = 0 Nastawianie = 0 Licz = 0 Idle End If



If Tclik = 1 Then Czasreset = 1 Set Portd.0 Set Portd.3 Licz = 0 Nastawianie = 1 Sclik = 0 Czasnas = 1 Do If Dclik = 1 Then Indexp = Index - 1 Indexp = 7 + Index Indexp = Indexp + 1 Index = Indexp Mod 7 Setczas = Czasy(index + 1) Czest = Blyski(index + 1) Dclik = 0 End If



Loop Until Sclik = 1 Or Czasnas = 0 Tclik = 0 Clik = 0 Sclik = 0 Dclik = 0 Nastawianie = 0 End If


Loop



Co1s: Load Timer1 , 62500



If Nastawianie = 0 Then



If Sclik = 1 Then Czasreset = 1 Reset Portd.3 Tclik = 0 Dclik = 0 If Licz < Setczas Then Sclik = 1 End If If Licz > Setczas Then Set Portd.3 Licz = 0 Sclik = 0 Tclik = 0 Dclik = 0 End If End If


If Dclik = 1 Then Czasreset = 1 Reset Portd.0 Sclik = 0 Tclik = 0 If Licz < Setczas Then Dclik = 1 End If Reset Portd.3 Sclik = 0 Tclik = 0 If Licz > Setczas Then Set Portd.0 Set Portd.3 Licz = 0 Dclik = 0 Sclik = 0 Tclik = 0 End If End If



If Dclik = 0 Then If Sclik = 0 Then Set Portd.0 Set Portd.3 Licz = 0 End If End If



Incr Licz



End If



Incr Czasnas



If Czasnas > 120 Then Czasnas = 0 End If



Incr Czasreset



If Czasreset > 10800 Then Czasreset = 0 End If



Return



Bleble:



Incr Per



If Per = 100 Then



Newb = Pinb.0 If Newb <> Oldb Then Incr Clik Oldb = Newb End If



Per = 0



Newclik = Clik



Diffclik = Newclik - Oldclik



If Diffclik = 0 Then


If Clik = 1 Then If Sclik = 0 Then If Dclik = 0 Then Sclik = 1 Dclik = 0 Tclik = 0 Else Sclik = 0 Dclik = 0 Tclik = 0 End If Else Sclik = 0 Dclik = 0 Tclik = 0 End If End If


If Clik = 2 Then Dclik = 1 Sclik = 0 Tclik = 0 End If



If Clik = 3 Then Tclik = 1 Dclik = 0 Sclik = 0 End If



Clik = 0



End If


Oldclik = Newclik


End If



Incr Mryg If Mryg > Czest Then If Sclik = 1 Or Dclik = 1 Or Tclik = 1 Or Nastawianie = 1 Then Toggle Portd.6 End If Mryg = 0 End If If Sclik = 0 And Dclik = 0 And Tclik = 0 And Nastawianie = 0 Then Set Portd.6 End If



Return


End


W dniu 2010-01-31 17:25, tomekp pisze:

Witam,

W twoim układzie zaniepokoiła mnie jedna sprawa. Zostawienie nóżki restetu zawieszonej w powietrzu. Z postu wynika, że po testach okazało się to mniej kłopotliwe. Aczkolwiek, takie rozwiązanie chyba nie jest zbyt zdrowe dla samego procesora. Czy w stanach przejściowych silnika jesteś wstanie zagwarantować napięcie na nóżce RESET wyższe od progu przełączania ? Wydaje mi się, że zdrowsze będzie ponowne spięcie resetu z linią zasilania przez jakiś rozsądny pull-up, a poprawy będzie wymagać stabilność zasilania MCU. Może pewniejsze okaże się zasilani impulsowe ? Czy przerwałeś ścieżkę do nóżki resetu zaraz obok niej? W przypadku indukowanych prądów to może powodować problem, przy montażu układu na płytce uniwersalnej. Ew. z tego co wiem, w fuse bitach jesteś wstanie zrezygnować z zewnętrznego resetu(do ustalenia z datasheetem). Co do samego programu, nie doszukałem się tam żadnej niespodzianki, ale nie jestem specem od basica na mcu, także tutaj sprawa zostaje otwarta.

Pozdrawiam, Wojtek.

Dzięki za odpowiedź. Problem resetu może być rzeczywiście związany ze słabą wydajnością zasilania. Zastosowałem do tego jakąś starą ładowarkę od telefonu simensa. Przy starcie przekaźnika może rzeczywiście być cienko z prądem i dochodzić do spadku napięcia i resetu. Jeśli chodzi o podciąganie pinu resetu to ćwiczyłem to dość dokładnie, wniosek był jeden: im więcej naczepiane tym gorzej. Dlatego zostawiłem po prostu reset niepodłączony do niczego, tzn przez podstawkę zlutowany jest ze ścieżka płytki. Ale ta ścieżka jest krótka, nie więcej niż 1cm albo coś koło tego. Generalnie resetowanie się procka to problem dla mnie drugorzędny i wolałbym nie dłubać w fusebitach bo wydaje mi się, że gdyby procek nie robił resetu to by się zawieszał znacznie znacznie częściej. To właśnie to zawieszanie mnie intryguje bo, z tego co wiem, w stanach gdzie procek głupieje zaczyna działać watchdog. Jesli procek nie odpowiada na pytania watchdoga to ten go resetuje. BYć może źle rozumuję, nie wiem. U mnie w czasie zwiechy procesor zachowuje się totalnie bez sensu, jak pociągne za sznureczek dioda zaczna migać w przypadkowy sposób ale świeci ciągle. A wentylator albo nie pracuje wcale albo pracuje non-stop. Konieczne jest wtedy odłączenie zasilania. Pozdrawiam Tomek

W dniu 2010-01-31 21:01, tomekp pisze:

Jak dokładnie rozwiązałeś stabilizację zasilania dla układu ? LM317/LM7805 + "bateria" kondensatorów ? Ja bym zrobił tak. Poprawił zasilanie, może coś impulsowego bym dał, najlepiej jakiś step-down, wtedy da się odciążyć źródło, zapewne transformator :). To powinno rozwiązać problem zasilania. Ew, dać większe trafo, które uciągnie układ podczas załączania przekaźników. Ale ta ścieżka jest krótka, nie więcej niż 1cm albo coś

Problem jest taki, że nie możesz zagwarantowac stałości potencjału tego kawałka ścieżki. Jego wartość będzie zależeć od tego co się dzieje w okół, może się zdarzyć, że będzie chwilowo mniejszy od progu przełączania.

Problem może być taki, że skoro przysiadał reset w testach, to zamiast tego, teraz przysiada zasilanie MCU. A w wyniku tego zaczynają się dziać dzikie rzeczy w całym układzie.

To właśnie to zawieszanie mnie intryguje bo, z tego co wiem, w

Watchdog restartuje procesor, gdy nie dostanie sygnału, że wszystko jest ok, czyli, np. długie pętle, intensywne obliczenia. Może wystarczy w pętlach które masz w programie wstawić takową instrukcję ?

BYć może źle

Może być to wywołane tym, że masz dziwne wartości w rejestrach po restarcie. Zgodnie z dokumentacją, po restarcie wykonywane jest przerwanie o adresie 0, czyli instrukcja spod adresu 0x0000. Zobacz też czy nie masz uaktywnionych innych przerwań od innych urządzeń, np. ADC, komparator analogowy ?

ja proponuje zrobić coś takiego (kod w asm)

Adres instr. instr.:

;; obsługa tylko startu/resetu jeżeli wystąpi

0x0000 rjmp start 0x0001 reti 0x0002 reti .... 0x00a reti

start: cli ;; blokuje przerwania <twoja inicjalizacja zmiennych>

sei ;; odblokowuje przerwania <cała reszta programu>

To powinno zagwarantować, że wystartujesz pewnie a procesor przejdzie pełny restart. Dodatkowo nawet jeżeli pojawi się jakieś niespodziewane przerwanie, to zostanie po prostu zignorowane. Jeżeli używasz jakichś przerwań (z kodu wnioskuje, że timery) to powinieneś pod odpowiednimi adresami mieć wpisane skoki do obsługi tych przerwań.

Pozdrawiam, Wojtek.

Dzieki za wnikliwą analizę. Byc może powyższy kod problem by rozwiązał ale nie wiem czy da sie pożenić asemblera z bascomem w sposób przez Ciebie opisany. Przerobiać program na asemblera nie dam rady... O ile rozumiem Twój kod chodzi o to, żeby dla wszystkich instrukcji o adresie od 0x0001 do 0x00a wykonywany był powrót z procedury obsługi przerwania. Nie wiem jak to zrealizowac w bascomie. Ta druga częśc, czyli blokowanie przerwań w trakcie inicjalizacji zmiennych jest do zrobienia. dzieki i pozdrawiam Tomek

Ja to siê tam na 2313 nie znam, ale daj szansê pieskowi. ¯eby zaszczeka³ trzeba mu powiedzieæ kiedy, ¿eby siedzia³ cicho to te¿ mu trzeba czym¶ pysk zatkaæ ;-)

gdzie¶ na pocz±tku przed pêtl± g³ówn± daj: Config Watchdog = 2048 'reset after 2048 mSec (nie wiem jaka tam jest maksymalna warto¶æ zobacz w pdf-ie) uwaga- czas musi byæ wiêkszy od najd³u¿szej pêtli ³acznie ze stanem IDLE potem: Start Watchdog 'start the watchdog timer

a potem gdzie¶ w pêtli g³ównej, najlepiej tu¿ przed loop : reset Watchdog

W czasie normalnej pracy przed ka¿dym zakoñczeniem pêtli licznik watchdoga bêdzie siê zerowa³, a gdy cos pójdzie ¼le - doliczy do ustawionej warto¶ci i zresetuje procesor.

Pozdrawiam MM

MM pisze:

Hmm. Ciekawe rozwiązanie i warte testów na żywym organiźmie. Powiedz mi jeszcze czy w moim programie (gdzie nie ma Config watchdog, start i reset watchdog) watchdog w ogóle pracuje? Zdaje się, że nie i stąd te zwiechy których istnienia nie rozumiem. Dzięki i pozdrawiam Tomek

U¿ytkownik "tomekp" snipped-for-privacy@ala.ma.kota.pl> napisa³ w wiadomo¶ci news:hk7dr1$bd2$ snipped-for-privacy@node2.news.atman.pl...

No przecie¿ do tego maleñstwa szklana kula siê nie zmie¶ci. Sk±d procesor ma wiedzieæ co ma robiæ jak mu tego wyra¼nie nie powiesz??? Konfigurujesz timery i je uruchamiasz? No to zrób to samo z watchdogiem - to te¿ licznik tylko ma osobny oscylator nie wy³±czany w stanie idle. Jedno na co musisz uwa¿aæ to ¿eby nie zrobiæ pêtli d³u¿szej ni¿ czas watchdoga - ¿adne tam "wait 10" no bo wtedy na pewno siê zresetuje. A - jeszcze jedno - rozkaz resetowania watchdoga musi byæ w pêtli g³ównej.

Pamiêtaj ¿e watchdog to tylko ostatnia deska ratunku w sytuacjach do których w ogóle nie powinno dochodziæ!!! Najpierw rozdziel zasilanie procesora od przeka¼ników - po mostku i ew. elektrolicie odej¶cie do zasilania przeka¼ników i z tego samego miejsca przez diodê separuj±c± do oddzielnych kondensatorów filtruj±cych zasilanie procesora (daj ze 100 mikroF i równolegle 100 nanoF zaraz za diod±, potem

100 nanoF bezpo¶rednio na nogach zasilania procesora). Przyda siê równie¿ taki kondensatorek na wej¶ciu z Twojego sznurka - tam te¿ mog± wchodziæ zak³ócenia. Najlepiej wrzuæ gdzie¶ schemat - wtedy zobaczymy czego brakuje.

Jszcze jedno - w Bascomie jest help - wpisz w indeks watchdog albo co Ciê tam innego interesuje i przeczytaj -- warto.

Pzdr MM

Witam, Zdaje się, że problem rozwiazany. Może nie w 100% ale 99 na pewno. Otóż postanowiłem najpierw zastosować najprostrze modyfikacje, czyli idąc za radą EM wprowadziłem gasik na styki przekaznika według pomysłu u. No może z lekką modyfikacją wartości kondensatora (47n) i opornika (200 om) bo takie miałem pod ręką. Ku mojemu zdumieniu układ od razu zaczął się zachowywać bardziej stabilnie. Od dwóch dni testuję go in vivo i do resetu doszło tylko raz może na 100 załączeń wentylatora. Oczywiście jak dotąd nie było żadnego zawieszenia procesora. Kodu programu nie modyfikowałem, zobaczę jeszcze jak będzie sie ustrojstwo zachowywać w dłuższym czasie. Ewentualnie wprowadzę jawne wywoływanie watchdoga. Dziekuję wszystkim za cenne wskazówki. Pozdrawiam Tomek

U¿ytkownik "tomekp" snipped-for-privacy@ala.ma.kota.pl> napisa³ w wiadomo¶ci news:hkoshj$86c$ snipped-for-privacy@news.lublin.pl...

Epilog? Rozwi±zany?

99% Pana zadowala? Przeka¼nik to z³om, a budowanie dodatkowo gasika na nim to ju¿ trudno zrozumieæ. SHARP S202 lub podobny i zapomnieæ o temacie. Obudziæ siê! Przeka¼niki na ¶mieci. Mamy 2010 rok. S.

Dlaczego zlom ? Jesli dobrze dziala, to czego wiecej od niego wymagac? Zly bo sie nie psuje w pierwszej mikrosekundzie przeciazenia ? :-)

Gasik uprzedzam puszcza troche pradu w stanie otwartym i tez mi sie nie podoba.

A do niego trzeba dodatkowo gasik, czy ma wbudowany ? :-)

J.

Gasik do tyrystora dodaje sie z definicji :-)

A tak z ciekawosci - sprawdz prad uplywu. Ciekaw jestem czy ma wbudowany :-)

J.

Dla mnie efekt końcowy jest zupełnie zadowalający. Po dłuższych testach niezawodność oceniam na nawet więcej iż 99%. Zaznaczam, że to konstrukcja amatorska. Co do przekazników półprzewodnikowych to przez moment chciałem je zastosować, ale w sklepie za rogiem takich akurat nie było. Moze by były lepsze a może odeszłyby do krainy bezpiecznych prądów po pierwszym załączeniu bo iskra na stykach wyglądała spektakularnie (przeświecało przez obudowe przekaznika).Myslę, że to było zwiazane z obecnośćią kondensatora zmniejszajacego obroty wentylatora, chyba dochodziło do powielenia napięcia w trakcie zwierania styków.

Do wentylatorka WC? Pr±d nominalny S202 8A 400V. U mnie steruje pompk± do C.O. Zapomnia³em gasika :-) S.

Ma:

formatting link
tyle pracy, ¿e ciekawo¶æ pomiaru sprawnie dzia³aj±cego sterowania pompki C.O. jest na pozycji 202 z listy zadañ :-) S.

Ju¿ Pan to pisa³. Usi³ujê Panu delikatnie wyt³umaczyæ, ¿e to oznacza pora¿kê. Zas³anianie siê amatorszczyzn± nic tu nie da. Uk³ad jest ¼le zaprojektowany i b³êdny.

W³a¶nie po to daje siê ³±czniki pó³przewodnikowe, aby iskry nie by³o.

Czasem trzeba siê pok³óciæ ze swoimi planami, aby by³o dobrze. To w³a¶nie ten przypadek. Je¶li teraz Pan nie wyrzuci tego przeka¼nika, to zostanie Pan amatorem do koñca ¿ycia. Nie ma nic z³ego w "byciu amatorem", ale byæ kiepskim amatorem to równie¿ pora¿ka. Powodzenia. Sylwester

Ale ja o prostym pomiarze - podlaczyc w szereg z amperomierzem pod

230V i sprawdzic ile przepuszcza. Kiedys sie na to nadzialem, to teraz jestem wyczulony.

Tak czy inaczej - zarzut na dolaczanie snubbera do przekaznika uwazam za smieszny, gdy sie proponuje triaka z wbudowanym snuberem :-)

J.

Trzeba siê czasem po¶miaæ:-) Snuber mo¿e mieæ X=1k lub X=1Meg. Mogê zmierzyæ, ale na wiosnê, bo ten piec stoi teraz gdzie indziej. Ale dziêki. Wyczulê siê na to i podam jakie mam straty mocy :-) S.

Z 1M to nie jest snubber :-) Z 1k to tez chyba jakis maluch, w sam raz do sterowania przekaznikiem.

Mnie ten kondensator interesuje, ile nF ?

A nie masz drugiego takiego elementu w szufladzie ?

Kondensator duzysz strat nie powoduje. Ale swietlowki blyskaja, przekazniki brzecza, kopac moze ..

J.

Ju¿ jeden mniej :-) Za³±czy³ siê po podaniu 230V. Zosta³o jeszcze 7 szt. S202S02. Pod³±czy³em w szereg z amperomierzem i musia³em w³±czyæ ponownie bezpieczniki. Jak Ci to zmierzyæ? S.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required