Carlos31
29.05.2010, 14:07
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 ?
$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
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 ?
$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