$regfile = "m8def.dat"
$crystal = 4000000
Config Timer1 = Timer, Prescale = 64
Config Portc = Output
Config Portd.4 = Output
Led Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portd.4
Dim A As Single
Dim B As Single
Dim C As Single
Config Portd.2 = Input
Config Portd.3 = Input
On Timer1 Timer_irq
Config Int0 = Rising
Config Int1 = Rising
Const Timervorgabe = 39886
Portd.2 = 1
Portd.3 = 1
Enable Timer1
Enable Interrupts
Enable Int0
Enable Int1
On Int0 Isr_von_int0
On Int1 Isr_von_int1
Do
If B = 1 Then
Gosub Sub1
End If
If B = 2 Then
B = 0
End If
Loop
Sub1:
If A = 2 Then
Toggle Led
Toggle Led2
Toggle Led3
Toggle Led4
Led7 = 0
A = 0
End If
If A = 0 Then
Led7 = 1
End If
Return
Timer_irq:
Timer1 = Timervorgabe
Incr A
Return
Isr_von_int0:
Incr B
Return
Isr_von_int1:
Incr C
Return
Irgendwie hab ich nen Brett vorm Kopf
Atmega 8 4 MHZ intern
Was ist das Problem?
ich drück auf den Taster der an INT0 hängt und nix passiert setz ich B von anfang an auf 1 geht alles andere
Liegt u.a. möglicherweise daran, dass in der ISR von INT0 B gewaltig schnell hochgezählt wird (Taster prellt). D.h. es kann durchaus bzw. ziemlich sicher passieren, dass B in der Do-Loop-Schleife grösser als 2 ist.
Also If B > 1 Then oder wie?
Dim A As Bit Dim S As Bit Isr_von_int0: Toggle A Return Isr_von_int1: Toggle S Return
Wäre eine Möglichkeit. Alternativ natürlich auch If B >= 2 Then. Oder: Isr_von_int0: If B < 2 Then Incr B Return
$regfile = "m8def.dat"
$crystal = 4000000
Config Timer1 = Timer, Prescale = 64
Config Portc = Output
Config Portd.4 = Output
Led Alias Portc.0
Led2 Alias Portc.1
Led3 Alias Portc.2
Led4 Alias Portc.3
Led5 Alias Portc.4
Led6 Alias Portc.5
Led7 Alias Portd.4
Dim A As Single
Dim B As Bit
Dim C As Single
Config Portd.2 = Input
Config Portd.3 = Input
On Timer1 Timer_irq
Config Int0 = Rising
Config Int1 = Rising
Const Timervorgabe = 39886
Portd.2 = 1
Portd.3 = 1
Enable Timer1
Enable Interrupts
Enable Int0
Enable Int1
On Int0 Isr_von_int0
On Int1 Isr_von_int1
Do
If B = 0 Then
Gosub Sub1
End If
If B = 1 Then
Gosub Sub2
End If
Loop
Sub1:
If A = 2 Then
Toggle Led
Toggle Led2
Toggle Led3
Toggle Led4
Led7 = 0
A = 0
End If
If A = 0 Then
Led7 = 1
End If
Return
Sub2:
Led = 0
Led7 = 0
Led3 = 0
Led2 = 0
Led4 = 0
Led5 = 0
Led6 = 0
Return
Timer_irq:
Timer1 = Timervorgabe
Incr A
Return
Isr_von_int0:
If B = 1 Then
Reset B
Else
Set B
End If
Return
Isr_von_int1:
If C = 1 Then
Reset C
Else
Set C
End If
Return
So funzt es un nu noch INT1
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.