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







Zitieren

Lesezeichen