Witam wszystkich.
Oto mój problem .W ramach podstawowej nauki programowania postanowiłem trochę przerobić program zawarty w książce"Mikrokontrolery dla początkujących". Chodzi o program C012a --stoper. Program z książki steruje stoperem przy pomocy dwóch przycisków :S1- start , S2- stop. Ja próbuję tak go zmienić by przycisk S1 na zmianę załączał i wyłączł stoper. W pewnym sęsie mi się to udało , ale nie każde naciśnięcie S1 powoduję prawidłowe zadziałanie stopera. Czasami trzeba likakrotnie nacisnąć przycisk żeby wystartował lub się zatrzymał.
Moim zdaniem coś jest nie tak z poleceniem "toggle pomoc", chyba przyciśnięcie S1 nie zawsze trafia w odpowiedni stan zmiennej "pomoc" . Proszę o pomoc jak to poprawić.
Oto mój problem .W ramach podstawowej nauki programowania postanowiłem trochę przerobić program zawarty w książce"Mikrokontrolery dla początkujących". Chodzi o program C012a --stoper. Program z książki steruje stoperem przy pomocy dwóch przycisków :S1- start , S2- stop. Ja próbuję tak go zmienić by przycisk S1 na zmianę załączał i wyłączł stoper. W pewnym sęsie mi się to udało , ale nie każde naciśnięcie S1 powoduję prawidłowe zadziałanie stopera. Czasami trzeba likakrotnie nacisnąć przycisk żeby wystartował lub się zatrzymał.
Moim zdaniem coś jest nie tak z poleceniem "toggle pomoc", chyba przyciśnięcie S1 nie zawsze trafia w odpowiedni stan zmiennej "pomoc" . Proszę o pomoc jak to poprawić.
'C012a Bardzo prosty stoper 0,1-sekundowy , załącz -wyłącz S1
'w trakcie odliczania czasu załączony T2
$regfile = "attiny2313.dat"
$crystal = 4000000
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit , Pomoc As Bit , Flaga As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
Pomoc = 1
On Timer0 Co4ms
Do : Loop : End 'to jest główny program - pusta nieskończona pętla
Co4ms: 'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
Timer0 = 6 'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
Toggle Pomoc
If Pind.0 = 0 And Pomoc = 1 Then Licz = 1 'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
If Pind.0 = 0 And Pomoc = 0 Then Licz = 0 'sprawdź stan S1 i ewentualnie zakończ zliczanie czasu
If Licz = 1 Then 'tylko wtedy, gdy stoper ma liczyć czas
Incr 100ms 'co 4ms zwiększ wartość licznika o nazwie 100ms
If 100ms = 25 Then 'skróc cykl licznika 100ms właśnie do 100ms
100ms = 0 'czyli 0,1 sekundy
Incr Dziesek 'co 0,1s zwiększ stan licznika dziesiatych części sekundy
If Dziesek = 10 Then 'ten licznik liczy do dziesieciu
Dziesek = 0 'czyli cykl trwa 1 sekundę
Incr Sekjed 'co 1 sekundę zwiększ licznik jednostek sekund
If Sekjed = 10 Then
Sekjed = 0 'co 10 sekund
Incr Sekdzies 'zwiększ stan licznika dziesiatek sekund
If Sekdzies = 6 Then 'liczy do 6 bo minuta ma 60 sekund
Sekdzies = 0
Incr Minjed 'co 60 sekund zwiększ stan licznika minut
If Minjed = 10 Then Minjed = 0 '0...9 minut
End If 'więc maksymalny stan licznika to:
End If '9 minut, 59 sekund i 9 dziesiatych sekundy
End If
End If
End If
Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0 'skróć cykl: 0...3
'Portd = &B1111111 ' wygaś wyświetlacze
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Select Case Ktorywysw ' obsługa wyświetlacza
Case 0: 'wyświetl zawartość licznika jednostek
Portb = Lookup(dziesek , Tabela) 'najpierw przepisz do PortB kody
Portd.3 = 0 'potem włącz T3 - wyświetlacz jednostek
Case 1: 'wyświetl zawartość licznika dziesiątek
Portb = Lookup(sekjed , Tabela) 'najpierw przepisz do PortB kody
Portb.7 = 0 'włącz punkt dziesiętny
Portd.4 = 0 'potem włącz T4 - wyświetlacz dziesiątek
Case 2: 'wyświetl zawartość licznika setek
Portb = Lookup(sekdzies , Tabela) 'przepisz do PortB kody
Portd.5 = 0 'włącz T5 - wyświetlacz setek
Case 3: 'wyświetl zawartość licznika tysięcy
Portb = Lookup(minjed , Tabela) 'przepisz do PortB kody
Portb.7 = 0 'włącz punkt dziesiętny
Portd.6 = 0 'włącz T6 - wyświetlacz tysięcy
End Select
Return 'koniec procedury obsługi przerwania
Tabela: 'potrzebna do wyświetlenia cyfr 0...9
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144