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