Witam
Postanowiłem przetestować wszystkie przerwaniaw ATMEGA32. Program ma działać następująco: naciskam klawisz podpięty pod INT0 (podciągnięty rezystorem 1kom do Vcc) i licznik zlicza mi to naciśnięcie. Naciskam drugi klawisz podpięty pod INT1 (podciągnięty rezystorem 1kom do Vcc) i licznik zlicza mi to naciśnięcie. Teraz jeśli nacisnę klawisz podpięty pod INT2 to na podstawie kolejności wciśniętych klawiszy licznik_2 powinien być incrementowany bądź dekrementowany. Tak się jednak nie dzieje. Jeśli powinien być incementowany to dodaje do licznika_2 2 a jeśli dekrementowany to nic się nie dzieje. Pytanie, dlaczego tak się dzieje ? Program poniżej.
pozdrawiam,
cyberdar
Postanowiłem przetestować wszystkie przerwaniaw ATMEGA32. Program ma działać następująco: naciskam klawisz podpięty pod INT0 (podciągnięty rezystorem 1kom do Vcc) i licznik zlicza mi to naciśnięcie. Naciskam drugi klawisz podpięty pod INT1 (podciągnięty rezystorem 1kom do Vcc) i licznik zlicza mi to naciśnięcie. Teraz jeśli nacisnę klawisz podpięty pod INT2 to na podstawie kolejności wciśniętych klawiszy licznik_2 powinien być incrementowany bądź dekrementowany. Tak się jednak nie dzieje. Jeśli powinien być incementowany to dodaje do licznika_2 2 a jeśli dekrementowany to nic się nie dzieje. Pytanie, dlaczego tak się dzieje ? Program poniżej.
$regfile = "m32def.dat"
$crystal = 8000000
Config Int0 = Rising : On Int0 Przerwanie_int0
Config Int1 = Rising : On Int1 Przerwanie_int1
Config Int2 = Rising : On Int2 Przerwanie_int2
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
Config Pina.1 = Input : Res Alias Pina.1
Dim Licznik_1 As Byte
Dim Licznik_2 As Integer
Dim Kod_oper As Byte
Licznik_2 = 5 : Licznik_1 = 0 : Kod_oper = 0
Cursor Off : Cls
Enable Interrupts : Enable Int0 : Enable Int1 : Enable Int2
Do
Home Upper
Lcd " " ; Licznik_2 ; " m "
Waitms 100
Loop
Przerwanie_int0:
Disable Int0 : Incr Licznik_1 : If Licznik_1 = 2 Then Kod_oper = 2
Return
Przerwanie_int1:
Disable Int1 : Incr Licznik_1 : If Licznik_1 = 2 Then Kod_oper = 1
Return
Przerwanie_int2:
Disable Int2
Select Case Kod_oper
Case 0 : Licznik_1 = 0
Kod_oper = 0
Case 1 : Incr Licznik_2
Licznik_1 = 0
Kod_oper = 0
Case 2 : Decr Licznik_2
Licznik_1 = 0
Kod_oper = 0
Case 3 To 255:Licznik_1 = 0
Kod_oper = 0
End Select
Enable Int0
Enable Int1
Enable Int2
Return
pozdrawiam,
cyberdar