Witam.
Mam pewien problem z programem. Generalnie układ posiada 3 przyciski.
Kontaktron - generuje przerwania (nie sugerować się nazwą, testuję to na zwykłym switchu)
P_zeruj - Przycisk od zerowania wyniku
P_mierz - Jeśli jest w stanie 1 to przerwania są włączone jeśli nie to wyłączone.
I tu pojawia się problem. Jeśli P_mierz ustawię w stan 0, to przy przerwaniach licznik nie liczy (i tak ma być), ale jeśli przestanę generować przerwania i ustawię P_mierz w stan 1 (włącze przerwania) to licznik dolicza wartość jednego przerwania.
Oto program:
Oprócz tego mam problem z przyciskiem zerującym. Teraz jest tak zrobione, że jeśli ustawie go w stan 0 i nastąpi przerwanie to wyzeruje, ale chcę zrobic, żeby zerowało się bez przerwania. Zrobiłem coś takiego:
Tylko w tym przypadku nie działa ten przycisk zerowania, a podczas generowania przerwań, po kilku przerwaniach wynik się zeruje.
Mógłby ktoś coś poradzić ?
Z góry dzięki.
Mam pewien problem z programem. Generalnie układ posiada 3 przyciski.
Kontaktron - generuje przerwania (nie sugerować się nazwą, testuję to na zwykłym switchu)
P_zeruj - Przycisk od zerowania wyniku
P_mierz - Jeśli jest w stanie 1 to przerwania są włączone jeśli nie to wyłączone.
I tu pojawia się problem. Jeśli P_mierz ustawię w stan 0, to przy przerwaniach licznik nie liczy (i tak ma być), ale jeśli przestanę generować przerwania i ustawię P_mierz w stan 1 (włącze przerwania) to licznik dolicza wartość jednego przerwania.
Oto program:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb = &B11111111
Portb = &B11111111
Config Portd = &B00000000
Portd = &B11111111
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
On Int0 Prz_zew0 Nosave
Config Int0 = Falling
Enable Int0
'stale parametry
Const L = 50
Const Szerokosc = 2.80
Kontaktron Alias Pind.2 'kontaktron, przerwania
P_mierz Alias Pind.0 'właczenie mierzenia
P_zeruj Alias Pind.1 'zerowanie
Dim Licz As Long
Dim Dystans As Single
'***********************************************
Lcd "Pomiar pola v.1"
Lowerline
Lcd "by Krzywy"
Wait 5
Enable Interrupts
Gosub Wyswietl
'***********************************************
Do
If P_mierz = 1 Then
Enable Int0
Else
Disable Int0
End If
Loop
End
Wyswietl:
Cls
Dystans = Licz * L '[cm]
Dystans = Dystans / 100 '[m]
Dystans = Dystans * Szerokosc
Locate 1 , 1
Lcd "Dl:" ; Spc(1) ; Dystans ; "[m]"
Return
Prz_zew0:
Incr Licz 'zwiekszenie licz
Gosub Przyciski
Return
Przyciski:
If P_zeruj = 0 Then
Licz = 0
End If
Gosub Wyswietl
Return
Oprócz tego mam problem z przyciskiem zerującym. Teraz jest tak zrobione, że jeśli ustawie go w stan 0 i nastąpi przerwanie to wyzeruje, ale chcę zrobic, żeby zerowało się bez przerwania. Zrobiłem coś takiego:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb = &B11111111
Portb = &B11111111
Config Portd = &B00000000
Portd = &B11111111
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
On Int0 Prz_zew0 Nosave
Config Int0 = Falling
Enable Int0
'stale parametry
Const L = 50
Const Szerokosc = 2.80
Kontaktron Alias Pind.2 'kontaktron, przerwania
P_mierz Alias Pind.0 'właczenie mierzenia
P_zeruj Alias Pind.1 'zerowanie
Dim Licz As Long
Dim Dystans As Single
'***********************************************
Lcd "Pomiar pola v.1"
Lowerline
Lcd "by Krzywy"
Wait 5
Enable Interrupts
Gosub Wyswietl
'***********************************************
Do
If P_mierz = 1 Then
Enable Int0
Else
Disable Int0
End If
If P_zeruj = 0 Then
Licz = 0
End If
Loop
End
Wyswietl:
Cls
Dystans = Licz * L '[cm]
Dystans = Dystans / 100 '[m]
Dystans = Dystans * Szerokosc
Locate 1 , 1
Lcd "Dl:" ; Spc(1) ; Dystans ; "[m]"
Return
Prz_zew0:
Incr Licz 'zwiekszenie licz
Gosub Wyswietl
Return
Tylko w tym przypadku nie działa ten przycisk zerowania, a podczas generowania przerwań, po kilku przerwaniach wynik się zeruje.
Mógłby ktoś coś poradzić ?
Z góry dzięki.