Forum: Mikrocontroller und Digitale Elektronik Int 0 und timer bitte um Hilfe


von Nette M. (nette-mann)


Lesenswert?

$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

: Verschoben durch User
von Stefan C. (jaecko)


Lesenswert?

Was ist das Problem?

von Nette M. (nette-mann)


Lesenswert?

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

von Stefan C. (jaecko)


Lesenswert?

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.

von Nette M. (nette-mann)


Lesenswert?

Also

If B > 1 Then

oder wie?

von Nette M. (nette-mann)


Lesenswert?

Dim A As Bit
Dim S As Bit

 Isr_von_int0:
Toggle A
 Return

  Isr_von_int1:
  Toggle S
 Return

von Stefan C. (jaecko)


Lesenswert?

Wäre eine Möglichkeit. Alternativ natürlich auch If B >= 2 Then.

Oder:

Isr_von_int0:
  If B < 2 Then Incr B
 Return

von Nette M. (nette-mann)


Lesenswert?

$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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.