Goto page 1, 2 Next
tomekp
Guest
Sun Jan 31, 2010 5:25 pm
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
Wojciech Bartczak
Guest
Sun Jan 31, 2010 6:38 pm
W dniu 2010-01-31 17:25, tomekp pisze:
Quote:
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
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.
tomekp
Guest
Sun Jan 31, 2010 9:01 pm
Quote:
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.
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
beznick
Guest
Sun Jan 31, 2010 10:30 pm
Użytkownik "tomekp" <tomek@ala.ma.kota.pl> napisał w wiadomości
news:hk4nfa$ko7$1@node1.news.atman.pl...
Quote:
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ę
Dołóż potężny elektrolit to sie upewnisz
Quote:
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ę
Zapewne program obsługi resetu jest zły
Odporność na zakłócenia hobbystycznych konstrukcji mikroprocesorowych to
temat rzeka
tomekp
Guest
Sun Jan 31, 2010 10:56 pm
Quote:
Dołóż potężny elektrolit to sie upewnisz
Siedzi 470u przy zasilaniu uC i chyba 100u przy wejsciu
stabilizatora,dodatkowo małe ceramiczne też dodałem
Quote:
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ę
Zapewne program obsługi resetu jest zły
Co rozumiesz przez program obsługi resetu?
Quote:
Odporność na zakłócenia hobbystycznych konstrukcji mikroprocesorowych
to temat rzeka
Zdaje sobie sprawę z niedoskonałości konstrukcji i akceptuję resety
procesora, natomiast nie pojmuję tych zawieszeń...
beznick
Guest
Sun Jan 31, 2010 11:05 pm
Użytkownik "tomekp" <tomek@ala.ma.kota.pl> napisał w wiadomości
news:hk4u5o$lvr$1@node1.news.atman.pl...
Quote:
Co rozumiesz przez program obsługi resetu?
Jesteś pewien, ze wszystkie wartosci zmiennych ustawiają sie prawidłowo ?
Inaczej zachowuje się program resetowany, inaczej po włączeniu zasilania,
inaczej po krótkotrwałym obnizeniu zasilania. Wszystko przewidziałeś w
programie?
Moze on pamieta jakieś zmienne i idzie w maliny
tomekp
Guest
Sun Jan 31, 2010 11:32 pm
beznick pisze:
Quote:
Użytkownik "tomekp" <tomek@ala.ma.kota.pl> napisał w wiadomości
news:hk4u5o$lvr$1@node1.news.atman.pl...
Co rozumiesz przez program obsługi resetu?
Jesteś pewien, ze wszystkie wartosci zmiennych ustawiają sie prawidłowo ?
Inaczej zachowuje się program resetowany, inaczej po włączeniu zasilania,
inaczej po krótkotrwałym obnizeniu zasilania. Wszystko przewidziałeś w
programie?
Moze on pamieta jakieś zmienne i idzie w maliny
Z pewnością idzie w maliny ale nie wiem właśnie dlaczego. Ja nie wiem
czy wszystko przewidziałem, starałem się w każdym możliwym miejscu
ustawiać wartości wszystkich zmiennych na takie jakie być powinny w
danym fragmencie kodu. W programie jest tylko pętla gówna i w niej dwie
instrukcje warunkowe, jedna do włączania stanu idle a druga do
programowania czasu (w niej jest też pętla). Większość kodu jest zawarta
w 2 procedurach obsługi przerwania timerów. W nich nie ma pętli. Zatem
jeśli zapamięta jakieś wartości w chwili krytycznej i wskutek zakłóceń
wpada w przypadkowe miejsce kodu to może jedynie wylądować albo w
intrukcjach warunkowych (z których powinien wyjsc bez problemu) albo w
tej pętli programowania czasu. Z tym,że ona skończy się zawsze o ile
timer1 działa. Jeśli masz czas i ochotę to listing programu jest w moim
pierwszym poście. Bliższą analizę utrudnia jeszcze to, że te zawieszenia
pojawiają się rzadko i niewiadomo od czego zależą.
Pozdrawiam
Tomek
Wojciech Bartczak
Guest
Mon Feb 01, 2010 12:04 am
W dniu 2010-01-31 21:01, tomekp pisze:
Quote:
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.
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ś
Quote:
koło tego.
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.
Quote:
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.
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
Quote:
stanach gdzie procek głupieje zaczyna działać watchdog. Jesli procek nie
odpowiada na pytania watchdoga to ten go resetuje.
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
Quote:
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.
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.
EM
Guest
Mon Feb 01, 2010 7:37 am
Witam
Najpierw usuń źródło zakłóceń, czyli silnik

.
Czyli daj jakiś dobry gasik na stykach przekaźnika.
Pozdr
EM
tomekp
Guest
Mon Feb 01, 2010 10:08 am
Quote:
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
tomekp
Guest
Mon Feb 01, 2010 10:15 am
EM wrote:
Quote:
Witam
Najpierw usuń źródło zakłóceń, czyli silnik

.
Czyli daj jakiś dobry gasik na stykach przekaźnika.
Pozdr
EM
Ta drogą bym poszedł bo zaobserwowałem, że styki mocno iskrzą w trakcie
zwierania i rozwierania. Potęguje to jeszcze obecność kondensatora który
robi za zawadę w obwodzie zasilania silnika. Pytanie tylko jak zrobić
taki gasik. Zastanawiam się nad wstawieniem dużego opornika (rzedu 500k
lub 1M) równolegle z tym kondensatorem, tak aby go rozładowywać po
wyłączeniu zasilania silnika. Może są inne lepsze patenty?
Pozdrawiam
Tomek
u
Guest
Mon Feb 01, 2010 11:45 am
Użytkownik "tomekp" <tomek@ala.ma.kota.pl> napisał w wiadomości
news:hk661c$h0o$1@news.lublin.pl...
Quote:
Ta drogą bym poszedł bo zaobserwowałem, że styki mocno iskrzą w trakcie
zwierania i rozwierania. Potęguje to jeszcze obecność kondensatora który
robi za zawadę w obwodzie zasilania silnika. Pytanie tylko jak zrobić
Wywal gasik
Daj przekaźnik daleko od procesora
Jak koniecznie chcesz chronic styki to szeregowo opornik 100 Om i
kondensator 0,1uF wsadź równolegle od silnika
Na zakłócenia to nie pomoże.
MM
Guest
Mon Feb 01, 2010 8:56 pm
Quote:
CIACH
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
tomekp
Guest
Mon Feb 01, 2010 9:33 pm
MM pisze:
Quote:
CIACH
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
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
tomekp
Guest
Mon Feb 01, 2010 9:36 pm
Quote:
Wywal gasik
Gasika nie ma. Kondensator o którym mowa ma za zadanie zmniejszyć obroty
wentylatora.
Quote:
Daj przekaźnik daleko od procesora
Nie da się. Zespawane wszystko na jednej płytce
Quote:
Jak koniecznie chcesz chronic styki to szeregowo opornik 100 Om i
kondensator 0,1uF wsadź równolegle od silnika
Jesteś pewny, że opornik nie wyparuje a silnik będzie sie krecił?
Quote:
Na zakłócenia to nie pomoże.
Goto page 1, 2 Next