Sterownik pieca gazowego - odliczanie czasu [BASCOM]

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
ODPOWIEDZ
ruffin-89
-
Posty: 1
Rejestracja: 08 wrz 2012, 13:04
Lokalizacja: Krk

Sterownik pieca gazowego - odliczanie czasu [BASCOM]

Post autor: ruffin-89 » 08 wrz 2012, 13:15

Witam, nie do końca jestem pewien czy aby odpowiedni dział wybrałem, w razie pomyłki proszę o przeniesienie tematu.

Celem projektu jest zbudowanie bezprzewodowego sterownika do gazowego pieca CO.
Schemat sterownika:

SCHEMAT

Zasada działania:
Sterownik steruje pracą elektrozaworu gazu (grzanie) oraz pracą pompki wody. Sterownik po włączeniu zasilania przechodzi do stanu czuwania. W momencie podania stanu wysokiego na PinC.5 zostają wysterowane tranzystory T1 oraz T2 (jednoczesna praca elektrozaworu i pompki). Tranzystory są tak długo wysterowane jak długo jest podany stan wysoki na PinC.5, w momencie pojawienia się stanu niskiego na PinC.5, elektrozawór zostaje wyłączony, natomiast pompka pracuje nadal przez określony czas. Czas określamy poprzez przełącznik obrotowy, który zwiera do zera odpowiednie wejście (do wyboru mamy 15, 30, 45, 60 minut czasu pracy pompki). Po upływie tego czasu, pompka wody zostaje odłączona, program wraca do początku (stan czuwania). Jeżeli w trakcie pracy samej pompki, sterownik znów otrzyma stan wysoki na PinC.5, ma za zadanie ponownie wysterować elektrozawór gazu i pompkę, po pojawieniu się stanu niskiego na PinC.5, sterownik ma na nowo zacząć odliczać czas pracy samej pompki. Dodatkowo sterownik sprawdza czy na pewno jest wybrany jakiś czas pracy (czy np. nie odpięła się wtyczka od przełącznika), gdyby tak się zdarzyło po wyłączeniu grzania, sterownik nie pozwala na włączenie pompki lub ponownego grzania dopóki usterka nie zostanie naprawiona. Błąd nastawy czasu jest sygnalizowany poprzez diodę LED.

Reasumując w punktach:
1) Sterownik w stanie czuwania.
2) Stan wysoki na PinC.5 -> Sterownik włącza elektrozawór i pompkę.
3) Stan niski na PinC.5 -> Sterownika wyłącza elektrozawór, pompka pracuje przez ustalony czas (Nastawa 15, 30, 45, 60 minut).
4) Sterownik powraca do stanu czuwania.

*3) Sterownik dostaje znów stan wysoki, przestaje odliczać czas i powraca do punktu 2.

Mój problem polega na tym że odliczanie czasu jest zrealizowane komendą "WAIT xxx s." co blokuje procesor, a tym samym nie pozwala na ponowne włączenie grzania, póki nie skończy się jedno odliczanie. Próbowałem się z tym uporać poprzez Timery, jednakże w żaden sposób nie mogłem sobie z tym poradzić. W początkowych założeniach projekt był prostszy i jako początkujący w programowaniu dałbym sobie z nim radę, no ale po drodze od górnie zostały mi narzucone dodatkowe warunki, na rozwiązanie których nie mam już pomysłu.

Poniżej kod, który napisałem do tej pory, program testowałem na płytce testowej z stąd drobne różnice względem schematu:

[BASCOM]

Kod: Zaznacz cały

'Definiujemy typ mikroprocesora - Mega644P:           'Docelowo Mega8
$regfile = "m644pdef.dat"
'Definiujemy taktowanie kwarcu - 16MHz:
$crystal = 16000000                                         'Docelowo 8MHz

'Definiujemy wyjscia:
'Gaz
Config Pinc.1 = Output
'Woda
Config Pinc.2 = Output
'Blad
Config Pinc.3 = Output

'Definiujemy wejscia:
'Radiowe
Config Pinc.5 = Input

'Czasowe:
'T = 15min = 900s
Config Pinb.0 = Input
'T = 30min = 1800s
Config Pinb.1 = Input
'T = 45min = 2700s
Config Pinb.2 = Input
'T = 60min = 3600s
Config Pinb.3 = Input

'Przypisujemy nazwy portom:
'Wyjscia:
G1 Alias Portc.1
W1 Alias Portc.2
B1 Alias Portc.3

'Wejscia:
R1 Alias Portc.5
T15 Alias Portb.0
T30 Alias Portb.1
T45 Alias Portb.2
T60 Alias Portb.3

'Podciągamy wejscia wewn. rezystorem:
Set T15
Set T30
Set T45
Set T60


'Główny program:

'Pętla P0
P0:
Do
'Ustawiamy stan wyjść:
Reset G1 : Reset W1 : Set B1

'Jeżeli przycisk R1 wciśnięty przejdź do Pętli P1:
If R1 = 0 Then
Gosub P1
'Jeżeli nie to wróć do początku Pętli P0:
Else
Gosub P0
End If
Loop
'Koniec Pętli P0.

'Pętla P1:
P1:
Do
'Jeżeli R1 dalej jest wciśnięty Włącz W1 i G1:
If R1 = 0 Then
Set W1 : Set G1
'Gdy przycisk zwolniony, to wyłącz G1 i przejdź do Pętli P2
Else
Reset G1
Gosub P2
End If
Loop
'Koniec Pętli P1

'Pętla P2:
P2:
Do

M0:
'Jeżeli przęłącznik czasu jest ustawiony na 15, to czekaj 900s wyłącz W1 i wróć
'do początku Pętli P0:
If T15 = 0 Then
Wait 900
Reset W1
Gosub P0
'Jeżeli przełącznik nie jest na tej pozycji skocz do pod Pętli M1
Else
Gosub M1
End If

M1:
'Jeżeli przęłącznik czasu jest ustawiony na 30, to czekaj 1800s wyłącz W1 i wróć
'do początku Pętli P0:
If T30 = 0 Then
Wait 1800
Reset W1
Gosub P0
'Jeżeli przełącznik nie jest na tej pozycji skocz do pod Pętli M2
Else
Gosub M2
End If

M2:
'Jeżeli przęłącznik czasu jest ustawiony na 45, to czekaj 2700s wyłącz W1 i wróć
'do początku Pętli P0:
If T45 = 0 Then
Wait 2700
Reset W1
Gosub P0
'Jeżeli przełącznik nie jest na tej pozycji skocz do pod Pętli M3
Else
Gosub M3
End If

M3:
'Jeżeli przęłącznik czasu jest ustawiony na 60, to czekaj 3600s wyłącz W1 i wróć
'do początku Pętli P0:
If T60 = 0 Then
Wait 3600
Reset W1
Gosub P0
'Jeżeli przełącznik nie jest na tej pozycji czekaj 1s, włacz B1 i skocz
'do pod Pętli M0:
Else
Wait 1
Reset G1
Reset W1
Reset B1
Gosub M0
End If

Loop
Return
'Koniec Pętli P2.

End
'Koniec Programu

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 08 wrz 2012, 17:18

Faktycznie wait "wstrzymuje" procesor, więc użycie przerwania od timera wydaje się być najlepszym rozwiązaniem. Można jednak zmodyfikować nieco program mianowicie:
wprowadzić kilka zmiennych w których będzie zliczany czas
i inkrementowanie tych zmiennych co 1 sekundę. Cały program musi być wówczas w pętli
powtarzanej co 1 sekunde.

Kod: Zaznacz cały


.
.
.

do
incr czas1
incr czas2
incr czas3

if czas1 = 100 then
 'zrob cos
 czas1 = 0  
end if

if czas2 = 200 then
'itd
end if

if czas3 = 400 then
'itd
end if

wait 1
loop




to tylko pomysł, może uda sie to zastosowac w twoim programie, jesli nie to tylko przerwania. pozdrawiam.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 08 wrz 2012, 19:27

gotowiec, co prawda pisany na 51 ale sobie poradzisz :)

Kod: Zaznacz cały


Klawisz Alias P1.0
Pompka Alias P1.1
Elektrozawor Alias P1.2

T1 Alias P1.3
T2 Alias P1.4
T3 Alias P1.5
T4 Alias P1.6

Dioda_led Alias P1.7

Dim Zwloka As Integer




Do



Decr Zwloka

If Zwloka < 0 Then
Zwloka = 0
End If




If Klawisz = 0 Then

                                             '

Zwloka = 0

If T1 = 0 Then
Zwloka = 900
End If

If T2 = 0 Then
Zwloka = 1800
End If

If T3 = 0 Then
Zwloka = 2700
End If


If T4 = 0 Then
Zwloka = 3600
   End If

If Zwloka = 0 Then                                            ' jesli przełacznik jest odpiety wywolaj alarm
Call Alarm
End If

Set Elektrozawor 
Set Pompka

Else

 Reset Elektrozawor



End If




   If Zwloka > 0 Then
      Set Pompka
      Else
      Reset Pompka
      End If









Wait 1






Loop








Sub Alarm

Set Dioda_led
Reset Elektrozawor
Reset Pompka

Do
Loop Until T1 = 0 Or T2 = 0 Or T3 = 0 Or T4 = 0               ' czekaj az przelacznik bedzie naprawiony ;)

 Reset Dioda_led


 End Sub

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 08 wrz 2012, 22:03

Niestety bez zaprzęgania Timera odmierzanie czasu w tle się nie uda. Można spokojnie napisać własną procedurę Delay_ms i nią odmierzać czas.
Ogólnie wybrał sobie kolega dosyć skomplikowany procesor do tego celu co może skutecznie utrudnić programowanie w BASCOM AVR, ponieważ nie da się łatwo stosować na nim gotowych procedur typu Config Timer itd. Pewnie to był główny powód pierwszych porażek przy obsłudze TIMERów, które nie chciały działać jak należy. No i te 16MHz taktowania, do takiego błahego zadania wystarczą 4 góra 8MHz.

ODPOWIEDZ