Mam oto taki problemik.
Programik jest banalnie prosty i działa mniej więcej tak:
Gdy zmienna (Wart) nie osiągnie 30 zostaje załączone wyjście Portc.0 .
Po osiągnięciu tej wartości wyjście zostaje wyłączone i załącza się kolejne czyli Portc.1 .
Podprogram kończy się na wyłączeniu wyjścia Portc.3 .
To wszystko jest proste.
Problemem dla mnie jest natomiast zrobienie opóźniena np. 1 sek. przed załączeniem poszcze-
gólnych wyjść.
np:
wart < 30 załącz wyjście Portc.0 po około 1sek.
wart > 30 i wart < 60 wyłącz wyjście Portc.0 po około 1sek. załącz Portc.1
wart > 60 i wart < 90 wyłącz wyjście Portc.1 po około 1sek. załącz Portc.2
wart > 60 i wart < 90 wyłącz wyjście Portc.2 po około 1sek. załącz Portc.3
Wartość zmiennej (Wart) zwiększa się dopiero po załączeniu jednego z wyjść Portc.0 ..Portc.3 .
Wstawienie instrukcji Wait 1 jest prostym rozwizaniem, ale zależy mi na płynności głównej
pętli programu Do-Loop w której jest odczyt zmiennej (Wart), obsługa klawiatury, wyświetlanie
wyniku i inne. Instrukcja Wait zatrzymuje wykonywanie pętli i ją dyskwalifikuje w tym przypadku.
Próbowałem do opóźnień użyć procedury przerwania od Timer0, która ładnie dziala tylko nie potrafię
załączać (Start Timer0) i zatrzymywać Timera0 w odpowiednich miejscach podprogramu Doza.
Może Ktoś z Kolegów bardziej biegłych w Bascom mi coś podpowie. Może muszę przebudować podprogram
Doza na procedury i je po kolei wywoływać z wcześniejszym opóżnieniem, ale nie bardzo wiem jak.
Za podpowiedzi z góry dziękuję.
Poniżej moje wypociny:
Sory za przejżystość kodu.
ROKO
Programik jest banalnie prosty i działa mniej więcej tak:
Gdy zmienna (Wart) nie osiągnie 30 zostaje załączone wyjście Portc.0 .
Po osiągnięciu tej wartości wyjście zostaje wyłączone i załącza się kolejne czyli Portc.1 .
Podprogram kończy się na wyłączeniu wyjścia Portc.3 .
To wszystko jest proste.
Problemem dla mnie jest natomiast zrobienie opóźniena np. 1 sek. przed załączeniem poszcze-
gólnych wyjść.
np:
wart < 30 załącz wyjście Portc.0 po około 1sek.
wart > 30 i wart < 60 wyłącz wyjście Portc.0 po około 1sek. załącz Portc.1
wart > 60 i wart < 90 wyłącz wyjście Portc.1 po około 1sek. załącz Portc.2
wart > 60 i wart < 90 wyłącz wyjście Portc.2 po około 1sek. załącz Portc.3
Wartość zmiennej (Wart) zwiększa się dopiero po załączeniu jednego z wyjść Portc.0 ..Portc.3 .
Wstawienie instrukcji Wait 1 jest prostym rozwizaniem, ale zależy mi na płynności głównej
pętli programu Do-Loop w której jest odczyt zmiennej (Wart), obsługa klawiatury, wyświetlanie
wyniku i inne. Instrukcja Wait zatrzymuje wykonywanie pętli i ją dyskwalifikuje w tym przypadku.
Próbowałem do opóźnień użyć procedury przerwania od Timer0, która ładnie dziala tylko nie potrafię
załączać (Start Timer0) i zatrzymywać Timera0 w odpowiednich miejscach podprogramu Doza.
Może Ktoś z Kolegów bardziej biegłych w Bascom mi coś podpowie. Może muszę przebudować podprogram
Doza na procedury i je po kolei wywoływać z wcześniejszym opóżnieniem, ale nie bardzo wiem jak.
Za podpowiedzi z góry dziękuję.
Poniżej moje wypociny:
$regfile = "m8def.dat"
$crystal = 16000000
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Timer0 = Timer , Prescale = 64
On Timer0 Przerwanie_timer
Enable Timer0
Timer0 = 6 'wartość początkowa timera
'Stop Timer0
Config Portc = Output
Config Pinb.0 = Output 'linia pb.0 jako wyjscie
Dim Licznik As Integer
Dim Wart As Single
Dim Flaga As Bit
Led Alias Portb.0 'alias dla wyjscia b.0
Licznik = 0 'wyzerowanie zmiennej licznikowej
Flaga = 0
Portc = 0
Enable Interrupts
'******************* Główna pętla wyświetlania *********************
Do
'obsługa klawiatury
'odczyt zmiennej (Wart)
.
.
Gosub Doza
Loop
Doza:
If Wart < 30 Then
'If Flaga = 1 Then
Set Portc.0 'zał. wyjśćie
Portc = Portc And &B00000001 'wył. pozostałe wyjścia (zab.)
'Flaga = 0
Elseif Wart > 30 Then
Reset Portc.0 'wył. wyjście
'Flaga = 1
'Start Timer0
End If
'End If
If Wart > 30 And Wart < 60 Then
'If Flaga = 1 Then
Set Portc.1
Portc = Portc And &B00000010
'Flaga = 0
Elseif Wart > 60 Then
Reset Portc.1
'Flaga = 1
'Start Timer0
End If
'End If
If Wart > 60 And Wart < 90 Then
'If Flaga = 1 Then
Set Portc.2
Portc = Portc And &B00000100
'Flaga = 0
Elseif Wart > 90 Then
Reset Portc.2
'Flaga = 1
'Start Timer0
End If
'End If
If Wart > 90 And Wart < 120 Then
'If Flaga = 1 Then
Set Portc.3
Portc = Portc And &B00001000
'Flaga = 0
Elseif Wart > 120 Then
Reset Portc.3
'Flaga = 1
End If
'End If
Return
'********************* Przerwanie od Timer0 ******************
Przerwanie_timer:
Counter0 = Counter0 + 6 'ustawienie początkowej wartości timera0
Incr Licznik 'zwiększenie licznika
If Licznik = 1000 Then 'jeśli zmienna licznik równa 1000 (około 1sek.)
Toggle Led 'sygnalizacja czy upłynął czas
Licznik = 0 'wyzeruj zmienną licznik
Flaga = 1 'ustaw flagę
Stop Timer0 'wył. timer0
End If
Return 'powrót z przerwania
End 'end programSory za przejżystość kodu.
ROKO
