Dozownik nawozów do akwarium


Złożyłem już kilka projektów z avr-ami. Przyszedł czas na naukę programowania.
Przerobiłem znaleziony tu na forum program pod swoją płytkę testową. Program ma działać tak:
Po otrzymaniu impulsu na Sw1 (Pinb.3) ma kolejno włączać przekaźniki. Każdy przekaźnik ma mieć różny czas działania (czas wpisywany w programie). Niestety na razie mnie to przerasta potrzebuję wskazówki gdzie powinno się to znaleźć. Proszę o wskazówki.
Udało mi się częściowo podyfikując fragment

'******on przekaznik nr.1/3******
Pr1:
If Aktywny_pro = 0 Then                                     ' przekaźnik1
Aktywny_pro = 1
Set Przekaznik1
Czas_odliczony = Czas_zadany1
 
Elseif Aktywny_pro = 1 Then
Reset Przekaznik1
Aktywny_pro = 2                                             ' przekaźnik 2
Set Przekaznik2
Czas_odliczony = Czas_zadany2
 
Elseif Aktywny_pro = 2 Then
Reset Przekaznik2
 
Aktywny_pro = 0
End If
Return

Ale chyba nie tędy droga ? Nie działa gdy dołożę trzeci przekaźnik.

Później będę chciał dołożyć zabezpieczenie przed zawieszeniem programu, a może później zaprzęgnąć do pracy DS1307... ale to jak zrozumiem podstawy
Czy w poniższym programie nie narobiłem jakiś byków. Obecnie działa:
sw1 -> przekaźnik1 2sek
sw2 -> przekaźnik2 1sek
sw3 -> przekaźnik3 5sek

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb = &B11000111                                   'porty PB.3 PB.4 PB.5 przyciski PB.1 I PB.2 PRZEKAŹNIKI
       Portb = &B11111001                                   'przekaźniki wyłączone
Config Portd = &B11111111                                   ' PD.0 przekaźnik
       Portd = &B11111110
 
Config Portc = &B11111111
       Portc = &B11111111                                   'wszystkie linie wyjście
 
                                                            'przypisanie nazw dla przekaźników
Przekaznik1 Alias Portd.0                                   'przekaźnik 3
Przekaznik2 Alias Portb.1                                   ' przekaźnik 2
Przekaznik3 Alias Portb.2                                   'przekaźnik 1 / buzzer
 
 
Sw1 Alias Pinb.3                                            'przypisanie nazw przycisków
Sw2 Alias Pinb.4
Sw3 Alias Pinb.5
 
Set Portb.3                                                 'rezystory podciągające dla przyciskó
Set Portb.4
Set Portd.7
 
 
'*****konfiguracja timer0*******
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*****zmienne,stałe sterujące on/off*****
Const Czas_zadany1 = 2                                      '2 sek.  działanie przekaźnika   1
Const Czas_zadany2 = 1                                      '1 sek.  działanie przekaźnika   2
Const Czas_zadany3 = 5                                      '5 sek. działanie przekaźnika   3
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
 
'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End
 
'*****timer*****
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o 1
If Czas_odliczony = 0 Then
 
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return
'*****wyłączenie wszystkiego******
Power_off:
Reset Przekaznik1
Reset Przekaznik2
Reset Przekaznik3
 
Return
 
'******on przekaznik nr.1/3******
Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Czas_odliczony = Czas_zadany1
Set Przekaznik2
Czas_odliczony = Czas_zadany1
 
Elseif Aktywny_pro = 1 Then
Reset Przekaznik1
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.2/3*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Przekaznik2
Czas_odliczony = Czas_zadany2
Elseif Aktywny_pro = 2 Then
Reset Przekaznik2
 
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.3/3*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Przekaznik3
Czas_odliczony = Czas_zadany3
Elseif Aktywny_pro = 3 Then
Reset Przekaznik3
Aktywny_pro = 0
End If
Return




Portret użytkownika pkucaba

Dodaję jako następny post,

Dodaję jako następny post, żeby było widać z czego wyszedłem.

Udało mi się tak skomplikować program, aby robił to co chcę. Proszę o wytknięcie błędów. Ewentualnie jak uprościć program. Następnym krokiem będzie dodanie przerwy między kolejnymi krokami.

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
 
 
Config Portb = &B11111111                                   'wyjscia do wykorzystania pozniej
       Portb = &B11111111                                   'rezystory podciagajace
Config Portd = &B11111111                                   'wyjscia PD0,PD1,PD2, PD4,PD5,PD6
       Portd = &B10001000                                   ' NIEWYKORZYSTANE PD3, PD7
 
Config Portc = &B0001111
       Portc = &B11111111                                   'wejscia aktywujace: PC0-CNY17-transoptor; PC1-sw1, PC2-sw2
 
                                                            'przypisanie nazw dla wyjsc
Pompa1 Alias Portd.0                                        'pompa1
Pompa2 Alias Portd.1                                        'pompa2
Pompa3 Alias Portd.2                                        'pompa3
Pompa4 Alias Portd.4                                        'pompa4
Pompa5 Alias Portd.5                                        'pompa5
Pompa6 Alias Portd.6                                        'pompa6
 
 
 
Cny17 Alias Pinc.0                                          'przypisanie nazw przycisków
Sw1 Alias Pinc.1
Sw2 Alias Pinc.2
 
Set Portc.0                                                 'rezystory podciągające dla przyciskó
Set Portc.1
Set Portc.2
 
 
'*****konfiguracja timer0*******
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*****zmienne,stałe sterujące on/off*****
Const Czas_zadany1 = 4                                      '4 sek.-max działanie pompy   1
Const Czas_zadany2 = 2                                      '2 sek.-max działanie pompy   2
Const Czas_zadany3 = 3                                      '3 sek.-max działanie pompy   3
Const Czas_zadany4 = 4                                      '4 sek.-max działanie pompy   4
Const Czas_zadany5 = 5                                      '5 sek.-max działanie pompy   5
Const Czas_zadany6 = 6                                      '6 sek.-max działanie pompy   6
 
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
 
'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub                                'switch do testów
Debounce Cny17 , 0 , Pr1 , Sub                              'start przez transoptor
Loop
End
 
'*****timer*****
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o 1
If Czas_odliczony = 0 Then
 
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
Case 4:
Gosub Pr4
Case 5:
Gosub Pr5
Case 6:
Gosub Pr6
End Select
End If
End If
End If
Return
'*****wyłączenie wszystkiego******
Power_off:
Reset Pompa1
Reset Pompa2
Reset Pompa3
Reset Pompa4
Reset Pompa5
Reset Pompa6
 
Return
 
 
 
 
 
 
 
 
 
 
'******on Pompa nr.1/6******
Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Pompa1
Czas_odliczony = Czas_zadany1
Elseif Aktywny_pro = 1 Then
Reset Pompa1
Aktywny_pro = 0
 
Gosub Pr2                                                   'tu dodałem przechodzi do następnego programu
End If
 
 
 
Return
'*****on Pompa nr.2/6*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Pompa2
Czas_odliczony = Czas_zadany2
Elseif Aktywny_pro = 2 Then
Reset Pompa2
Aktywny_pro = 0
 
End If
 
Gosub Pr3                                                   'tu dodałem przechodzi do następnego programu
Return
 
'*****on Pompa nr.3/6*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Pompa3
Czas_odliczony = Czas_zadany3
Elseif Aktywny_pro = 3 Then
Reset Pompa3
Aktywny_pro = 0
End If
 
Gosub Pr4                                                   'tu dodałem przechodzi do następnego programu
Return
 
'*****on Pompa nr.4/6*****
Pr4:
If Aktywny_pro = 0 Then
Aktywny_pro = 4
Set Pompa4
Czas_odliczony = Czas_zadany4
Elseif Aktywny_pro = 4 Then
Reset Pompa4
Aktywny_pro = 0
End If
 
Gosub Pr5                                                   'tu dodałem przechodzi do następnego programu
Return
 
'*****on Pompa nr.5/6*****
Pr5:
If Aktywny_pro = 0 Then
Aktywny_pro = 5
Set Pompa5
Czas_odliczony = Czas_zadany5
Elseif Aktywny_pro = 5 Then
Reset Pompa5
Aktywny_pro = 0
End If
 
Gosub Pr6                                                   'tu dodałem przechodzi do następnego programu
Return
 
'*****on Pompa nr.6/6*****
Pr6:
If Aktywny_pro = 0 Then
Aktywny_pro = 6
Set Pompa6
Czas_odliczony = Czas_zadany6
Elseif Aktywny_pro = 6 Then
Reset Pompa6
Aktywny_pro = 0
End If
Return

Portret użytkownika mirley

Re: Dozownik

to jest niepotrzebne, przecież ustawiasz to zaraz po konfiguracji portów

Set Portc.0                                                 'rezystory podciągające dla przyciskó
Set Portc.1
Set Portc.2

Poza tym wykonujesz wszystko w przerwaniu.... czy zdąży wykonać się całość zanim przyjdzie kolejne przerwanie? Wywoływanie etykiety z wnętrza kolejnej etykiety też nie jest dobrym pomysłem. Jak dojdzie do ostatniej to skoczy do Pr5, potem do Pr4 i tak aż do przerwania z którego dopiero do pętli głównej... Raczej powinno być tak że wskakuje do przerwania, ustawia odpowiednie parametry i skacze spowrotem do pętli głównej.

Na końcu zwróć uwagę na robienie wcięć w programie. Jak nie ma poprawnych wcięć to jest to nieczytelne i nikomu się tego nie chce sprawdzać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pkucaba

Oczywiście to moje

Oczywiście to moje przeoczenie. Program jest zmodyfikowany nie mój. Więc to ja mieszam. Dziękuję postaram się zastosować do rad.