Guten Tag
Ich benutze ein AVR Butterfly , und möchte 3 schnelle zähler haben , deswegen hab ich den pcint benutzt , ich benutze pinb.0 bis pinb.2 für das , mein problem ist wenn ich die eingänge parallel hänge jeder pin zählt was anderes , pinb.0 zum beispiel zählt das doppelte wie pinb.1 ,
der pcint unterprogramm heist isr_int kann jemand da reinschauen und mir ein tip geben was ich da machen kann ?
Code:
 $regfile = "M169DEF.DAT"
 $crystal = 8000000
 $baud = 19200

 Config Watchdog = 512
 Config Portb.5 = Output
 Config Portb.7 = Output
 Freq_slave_r Alias Portb.5
 Freq_slave_l Alias Portb.6
 Config Pinb.0 = Input
 Config Pinb.1 = Input
 Config Pinb.2 = Input
 Portb.1 = 1
 Portb.2 = 1
 Portb.3 = 1
 Master_bit Alias Pinb.0
 Slave_l Alias Pinb.1
 Slave_r Alias Pinb.2

 Config Timer0 = Timer , Prescale = 64
 Enable Timer0
 On Timer0 Isr_timer0

 Config Timer2 = Timer , Prescale = 64
 Enable Timer2
 On Timer2 Isr_timer2

 Enable Pcint1                                              'pcint einschalten
On Pcint1 Isr_int
Pcmsk1 = &B00000111                                         'maske zum einschalten von pcint für pinb 0,1,2
 Enable Interrupts

Dim Master As Word

Dim Slave_links As Word
Dim Slave_rechts As Word
Dim Frequenz_r As Byte
Dim Frequenz_l As Byte
Dim Zeit_re As Word
Dim Zeit_li As Word
Dim Nullen As Byte
Dim Abstuerze As Word

  Dim Wert As String * 5
  Dim Buchstabe As String * 3
  Dim Resultat As String * 1
  Dim A As Word
  Dim Wert1 As String * 5
  Dim Buchstabe1 As String * 3
  Dim Resultat1 As String * 1
  Dim B As Word
   Dim Wert2 As String * 5
  Dim Buchstabe2 As String * 3
  Dim Resultat2 As String * 1
  Dim C As Word
  Dim Wert3 As String * 5
  Dim Buchstabe3 As String * 3
  Dim Resultat3 As String * 1
  Dim D As Word
Const Zeit_mot_re = 100                                     'constante für wiederholungsrate motor rechts
Const Zeit_mot_li = 100                                     'constante für wiederholungsrate motor links
Incr Abstuerze                                              'anzahl abstürze zählen
 Wait 1
 Do
Start Watchdog

Wert = Str(abstuerze)
 Buchstabe = "A"
 Resultat = Buchstabe + Wert
 Print Resultat
 Waitms 100
  Stop Watchdog
  Start Watchdog
Wert1 = Str(master)
 Buchstabe1 = "B"
Resultat1 = Buchstabe1 + Wert1
 Print Resultat1
 Waitms 100
   Stop Watchdog
   Start Watchdog
 Wert2 = Str(slave_rechts)
 Buchstabe2 = "C"
 Resultat2 = Buchstabe2 + Wert2
 Print Resultat2
 Waitms 100
    Stop Watchdog
    Start Watchdog
Wert3 = Str(slave_links)
 Buchstabe3 = "D"
Resultat3 = Buchstabe3 + Wert3
 Print Resultat3
 Waitms 100
Stop Watchdog
 Start Watchdog
 If Master > 40000 Then
 Nullen.0 = 1
 End If
If Slave_rechts > 40000 Then
 Nullen.2 = 1
 End If
 If Slave_links > 40000 Then
 Nullen.3 = 1
 End If
 If Nullen = 7 Then                                         'wenn alle zählerstände grösser sind als 40000 dann wird auf alle zählerstände 40000 substraiert
 Nullen = 0
 Master = Master - 40000
Slave_rechts = Slave_rechts - 40000
 Slave_links = Slave_links - 40000
 End If
  Stop Watchdog


 Loop


 Isr_int:
   If Master_bit = 0 Then
Incr Master                                                 'zählen impulse motor master für motor slave links                                                         'zählen impulse motor master für motor slave recht
 End If
 If Slave_l = 0 Then
 Incr Slave_links
                                                'zählen impulse motor slave links
 End If
 If Slave_r = 0 Then
 Incr Slave_rechts
                                               'zählen impulse motor slave rechts
 End If


Return



 Isr_timer0:
                                                'timer 0 subroutine
 If Frequenz_r > 220 Then                                   'frequenz limits
 Frequenz_r = 220
 End If
 If Frequenz_r < 1 Then
 Frequenz_r = 1
 End If
Incr Zeit_re                                                'wiederholungsrate von konstante abhängig
If Zeit_re = Zeit_mot_re Then
Zeit_re = 0                                                 'regelung
If Master > Slave_rechts Then
 Incr Frequenz_r
 End If
If Master < Slave_rechts Then
 Decr Frequenz_r
 End If
 End If
 Timer0 = Frequenz_r
 Toggle Freq_slave_r
 Return
                                                            'timer 2 subroutine
 Isr_timer2:                                                'frequenz limits
 If Frequenz_l > 220 Then
 Frequenz_l = 220
 End If
 If Frequenz_l < 1 Then
 Frequenz_l = 1
 End If
Incr Zeit_li                                                'wiederholungsrate von konstante abhängig
If Zeit_li = Zeit_mot_li Then
Zeit_li = 0
If Master > Slave_links Then
 Incr Frequenz_l
 End If
If Master < Slave_links Then
 Decr Frequenz_l
 End If
 End If
 Timer2 = Frequenz_l
 Toggle Freq_slave_l
Return