Witam. Znalazłem kiedyś, zdaje się że nawet na elektrodzie, program napisany dla AT89C2051 którego zadaniem było sterowanie czasowe wycieraczkami samochodowymi.
Postanowiłem go zaadoptować do ATmega8 i moja propozycja jest taka:
Niestety pomimo pozytywnych testów w BASCOM-AVR program nie działa. Czy ktoś ma może jakieś sugestie co jest nie tak. Albo posiada ktoś może gotowy program napisany pod ATmega8?
Pozdrawiam Jarek
' Przerywacz pracy wycieraczek o programowanym czasie
'
'$sim
$regfile = "89c2051.dat"
$crystal = 12000000
Wajchain Alias P3.2 'Wejscie z dzwigni sterowania wycieraczka
Wajcha1in Alias P3.3 'Wejœcie z dêwigni - praca ci¹gùa
Przekaznik Alias P1.2 'Wyjscie sterujace przekaznikiem
Dim Przerwa As Byte 'Czas przerwy miedzy "wahnieciami" wycieraczki
Dim Stan As Byte
'Zmienne do mierzenia roznych czasow
Dim Czaswajchy As Byte
Dim Czasmachaczki As Byte
Dim Czasprzerwy As Byte
'Zmienne pomocnicze do badania stanu wajchy (tlumienie drgan)
Dim Up As Bit , Up1 As Bit
Dim Wajcha As Bit 'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
Dim Wajcha1 As Bit 'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
Dim Machaczka As Bit , Machaj As Bit
Dim Totaltime As Byte
'Stany:
' 0 - nic siê nie dzieje, badamy stan wajchy
' jesli wajcha=ON - rozpoczynamy pomiar czasu i idziemy do stanu 1
' 1 - mierzymy czas + badamy wajche
' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
' 2 - Sprawdzamy czy wajcha 1 jest on - jeœli tak to do stanu 0, jeœli nie to:
' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
' Jesli uplynelo 15 sekund - idziemy do stanu 0
' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
' 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> zaczynamy mierzyc czas i do stanu 2
Set Przekaznik ' Wylacz gdyby po resecie przypadkiem procek zapomnial
Set Wajchain ' Ustaw na 1 jako "do czytania"
Call Stanwajchy ' Ustaw stan wajchy
Reset Machaczka
Reset Machaj
Stan = 0
Przerwa = 50 ' Czas na pocz¹tek przerwy 50 * 100ms = 5s
Totaltime = 0
' Gùówna pêtla programiku
While 1 = 1
Call Stanwajchy() ' To czeka ok. 20 ms
Call Stanwajchy1() ' Tu te¿ czeka ok. 20 ms
If Stan = 0 Then Call Stan0
If Stan = 1 Then Call Stan1
If Stan = 2 Then Call Stan2 ' Tu czeka extra 20ms
If Stan = 5 Then Call Stan5
Call Przeliczczasy
Call Obslugamachaczki
' czekaj do peùnych 100ms --> 59ms (2x20ms+59ms plus narzut programu pi razy drzwi 1ms ?)
Waitms 59
'Jesli nic sie nie dzieje przez 25 sekund to wejdz w stan uspienia
If Stan = 0 Then
inc totaltime
If Totaltime >= 250 Then
On Int0 Proc_int0
Enable Interrupts
Enable Int0
Idle
nop
Disable Interrupts
End If
Else
Totaltime = 0
End If
Wend
Sub Stanwajchy
Up = Wajchain
Waitms 20
Up1 = Wajchain
If Up = Up1 Then
If Up = 1 Then
Reset Wajcha
Else
Set Wajcha
End If
End If
End Sub
Sub Stanwajchy1
Up = Wajcha1in
Waitms 20
Up1 = Wajcha1in
If Up = Up1 Then
If Up = 1 Then
Reset Wajcha1
Else
Set Wajcha1
End If
End If
End Sub
Sub Stan0
' 0 - nic siê nie dzieje, badamy stan wajch. Jesli wajcha=ON - rozpoczynamy pomiar czasu w "czaswajchy"
‘ i idziemy do stanu 1
If Wajcha = 1 Then
Stan = 1
Czaswajchy = 0
' Zainicjuj machanie wachaczk¹
Call Startmachaczki()
End If
End Sub
Sub Stan1
' 1 - mierzymy czas (czaswajchy) + badamy wajche
' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
' a jesli = OFF to jeszcze do stanu 2
If Czaswajchy > 10 Then
If Wajcha = 1 Then
' Call Stopmachaczki
Stan = 5
Else
Stan = 2
Call Stopmachaczki
End If
Else
' Czas od wlaczenia wajchy <= 1s
If Wajcha = 0 Then
Stan = 2
Call Stopmachaczki
End If
End If
End Sub
Sub Stan2
' 2 - Sprawdzamy czy wajcha1 jest on i wajcha = off - jeœli tak to do stanu 0, jeœli nie to:
' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
' Jesli uplynelo 15 sekund - idziemy do stanu 0
' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
If Wajcha1 = 1 Then
If Wajcha = 0 Then
Stan = 0
Exit Sub
End If
End If
If Czaswajchy > 160 Then '160=150+10 ktore juz wczesnij naliczyl
Stan = 0
Exit Sub
End If
' Jeszcze nie uplynelo 15 sekund
If Wajcha = 1 Then
Przerwa = Czaswajchy
'Nowy czas przerwy nie moze byc mniejszy od 2 sekund
If Przerwa < 20 Then Przerwa = 20
' Call Startmachaczki
Machaj = 1
Czasmachaczki = Czaswajchy
Stan = 5
End If
End Sub
Sub Stan5 ' stan 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> stan 0
If Wajcha = 0 Then
Call Stopmachaczki
Czaswajchy = 0
Stan = 0
End If
End Sub
Sub Przeliczczasy
inc czaswajchy ' Ta zmienna sluzy do obslugi chodzenia po stanach w zalezosci od stanu wajchy
End Sub
Sub Obslugamachaczki
' Minelo 0,5 sekundy ? Wylacz przekaznik
If Czasmachaczki >= 5 Then Machaczka = 0
If Machaj = 1 Then
If Czasmachaczki >= Przerwa Then
Machaczka = 1
Czasmachaczki = 0
End If
' Else
' Machaczka = 0
End If
If Machaczka = 1 Then
Reset Przekaznik
Else
Set Przekaznik
End If
inc czasmachaczki
End Sub
Sub Startmachaczki
Machaj = 1
Czasmachaczki = 0
Machaczka = 1
' Reset Przekaznik
End Sub
Sub Stopmachaczki
Machaj = 0
' Machaczka = 0
End Sub
Proc_int0:
nop
Return Postanowiłem go zaadoptować do ATmega8 i moja propozycja jest taka:
'Przerywacz pracy wycieraczek o programowanym czasie
'
'$sim
$regfile = "m8def.dat"
$crystal = 1000000
Config Pind.0 = Input
Config Pind.1 = Input
Config Pinc.5 = Output
Wajchain Alias Pind.0 'Wejscie z dzwigni sterowania wycieraczka
Wajcha1in Alias Pind.1 'Wej.cie z dęwigni - praca ciągůa
Przekaznik Alias Pinc.5 'Wyjscie sterujace przekaznikiem
Dim Przerwa As Byte 'Czas przerwy miedzy "wahnieciami" wycieraczki
Dim Stan As Byte
'Zmienne do mierzenia roznych czasow
'Zmienne do mierzenia roznych czasow
Dim Czaswajchy As Byte
Dim Czasmachaczki As Byte
Dim Czasprzerwy As Byte
'Zmienne pomocnicze do badania stanu wajchy (tlumienie drgan)
Dim Up As Bit , Up1 As Bit
Dim Wajcha As Bit 'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
Dim Wajcha1 As Bit 'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
Dim Machaczka As Bit , Machaj As Bit
Dim Totaltime As Byte
Declare Sub Stanwajchy
Declare Sub Stanwajchy1
Declare Sub Stan0
Declare Sub Stan1
Declare Sub Stan2
Declare Sub Stan5
Declare Sub Przeliczczasy
Declare Sub Obslugamachaczki
Declare Sub Startmachaczki
Declare Sub Stopmachaczki
' Stany:
' 0 - nic się nie dzieje, badamy stan wajchy
' jesli wajcha=ON - rozpoczynamy pomiar czasu i idziemy do stanu 1
' 1 - mierzymy czas + badamy wajche
' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
' 2 - Sprawdzamy czy wajcha 1 jest on - je.li tak to do stanu 0, je.li nie to:
' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
' Jesli uplynelo 15 sekund - idziemy do stanu 0
' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
' 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> zaczynamy mierzyc czas i do stanu 2
Set Przekaznik ' Wylacz gdyby po resecie przypadkiem procek zapomnial
Set Wajchain ' Ustaw na 1 jako "do czytania"
Call Stanwajchy ' Ustaw stan wajchy
Reset Machaczka
Reset Machaj
Stan = 0
Przerwa = 50 ' Czas na początek przerwy 50 * 100ms = 5s
Totaltime = 0
' Gůówna pętla programiku
Do
Call Stanwajchy ' To czeka ok. 20 ms
Call Stanwajchy1 ' Tu też czeka ok. 20 ms
If Stan = 0 Then Call Stan0
If Stan = 1 Then Call Stan1
If Stan = 2 Then Call Stan2 ' Tu czeka extra 20ms
If Stan = 5 Then Call Stan5
Call Przeliczczasy
Call Obslugamachaczki
' czekaj do peůnych 100ms --> 59ms (2x20ms+59ms plus narzut programu pi razy drzwi 1ms ?)
Waitms 59
'Jesli nic sie nie dzieje przez 25 sekund to wejdz w stan uspienia
If Stan = 0 Then
Incr Totaltime
If Totaltime >= 250 Then
On Int0 Proc_int0
Enable Interrupts
Enable Int0
Idle
nop
Disable Interrupts
End If
Else
Totaltime = 0
End If
Loop
Sub Stanwajchy
Up = Wajchain
Waitms 20
Up1 = Wajchain
If Up = Up1 Then
If Up = 1 Then
Reset Wajcha
Else
Set Wajcha
End If
End If
End Sub
Sub Stanwajchy1
Up = Wajcha1in
Waitms 20
Up1 = Wajcha1in
If Up = Up1 Then
If Up = 1 Then
Reset Wajcha1
Else
Set Wajcha1
End If
End If
End Sub
Sub Stan0
' 0 - nic się nie dzieje, badamy stan wajch. Jesli wajcha=ON - rozpoczynamy pomiar czasu w "czaswajchy"
' i idziemy do stanu 1
If Wajcha = 1 Then
Stan = 1
Czaswajchy = 0
' Zainicjuj machanie wachaczką
Call Startmachaczki()
End If
End Sub
Sub Stan1
' 1 - mierzymy czas (czaswajchy) + badamy wajche
' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
' a jesli = OFF to jeszcze do stanu 2
If Czaswajchy > 10 Then
If Wajcha = 1 Then
' Call Stopmachaczki
Stan = 5
Else
Stan = 2
Call Stopmachaczki
End If
Else
' Czas od wlaczenia wajchy <= 1s
If Wajcha = 0 Then
Stan = 2
Call Stopmachaczki
End If
End If
End Sub
Sub Stan2
' 2 - Sprawdzamy czy wajcha1 jest on i wajcha = off - je.li tak to do stanu 0, je.li nie to:
' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
' Jesli uplynelo 15 sekund - idziemy do stanu 0
' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
If Wajcha1 = 1 Then
If Wajcha = 0 Then
Stan = 0
Exit Sub
End If
End If
If Czaswajchy > 160 Then '160=150+10 ktore juz wczesnij naliczyl
Stan = 0
Exit Sub
End If
' Jeszcze nie uplynelo 15 sekund
If Wajcha = 1 Then
Przerwa = Czaswajchy
'Nowy czas przerwy nie moze byc mniejszy od 2 sekund
If Przerwa < 20 Then Przerwa = 20
' Call Startmachaczki
Machaj = 1
Czasmachaczki = Czaswajchy
Stan = 5
End If
End Sub
Sub Stan5 ' stan 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> stan 0
If Wajcha = 0 Then
Call Stopmachaczki
Czaswajchy = 0
Stan = 0
End If
End Sub
Sub Przeliczczasy
Incr Czaswajchy
' Ta zmienna sluzy do obslugi chodzenia po stanach w zalezosci od stanu wajchy
End Sub
Sub Obslugamachaczki
' Minelo 0,5 sekundy ? Wylacz przekaznik
If Czasmachaczki >= 5 Then Machaczka = 0
If Machaj = 1 Then
If Czasmachaczki >= Przerwa Then
Machaczka = 1
Czasmachaczki = 0
End If
' Else
' Machaczka = 0
End If
If Machaczka = 1 Then
Reset Przekaznik
Else
Set Przekaznik
End If
Incr Czasmachaczki
End Sub
Sub Startmachaczki
Machaj = 1
Czasmachaczki = 0
Machaczka = 1
' Reset Przekaznik
End Sub
Sub Stopmachaczki
Machaj = 0
' Machaczka = 0
End Sub
Proc_int0:
nop
Return
Niestety pomimo pozytywnych testów w BASCOM-AVR program nie działa. Czy ktoś ma może jakieś sugestie co jest nie tak. Albo posiada ktoś może gotowy program napisany pod ATmega8?
Pozdrawiam Jarek