Also diese For-Next Schleife ist drinn, da der Sensor auf einem Servo sitzt und bei jeder angefahrenen Position x eine Messung durchführen soll.
Vorbereitet bzw Restbestände aus dem Test mit dem Servo sozusagen.
Das mit dem Taschenrechner... mhm... du sagst ja selber "... ähnliche Werte"
bei : t=5241 _T=1327530 _M1327777 ==022837mm
rechne ich aber _T=5241*255 = 1336455
was eine Differenz zum tatsächlich angezeigten ergibt von 8925 ... also 35 Timerüberläufe.
eben mit ...
Messergebniss = Timer2
Temp_long = Timerueberlauf * 255
Messung_beendet = 1
...wollte ich erreichen, das die Werte gesichert sind, und nicht während des abarbeitens verändert werden.
Ja... mit Word-Variablen ,oder sogar kleiner, rechnen wäre tatsächlich besser... allerdings wollte ich zum testen erstmal ausschliessen, das nicht hier irgendwo was hängen bleibt am Wertebereich.
Das ändern des Prescaler hab ich bereits versucht...
Wenn ich den auf 64 habe... und extra noch direkt beim senden des Triggersignals den Timerueberlauf auf 0 stelle...
Bekomme ich bei einem Test-Abstand von 5cm rund 33 Timerüberläufe.
Abstand mit rund 2m ergibt etwa 40 Timerüberläufe.
Das ist deutlich zu viel... nun ist die Frage woher nimmt er diese "überschüssigen" 15-20 Timerüberläufe?
NACHTRAG:
Könnte es sein, das er während der Sub "Echowechsel" mehrmals in die ISR des Timers springt ?
Dann müsste ich den Timer sofort als erstes stoppen wenn der Pin zu Low wechselt.... das teste ich gleich mal.
- - - Aktualisiert - - -
Aktueller Versuch...
Code:
$regfile = "m328pdef.dat" 'eingesetzter Mikrocontroller
$crystal = 8000000 'eingestellte Taktfrequenz (8MHz)
$hwstack = 100 'Standardwert
$swstack = 100 'Standardwert
$framesize = 100 'Standardwert
$baud = 9600
'-------------------------------------------------------------------------------
'Ports/Pins/Configs
'-------------------------------------------------------------------------------
Config Portb.0 = Output 'Funkmodul ENABLE
Funk_enable Alias Portb.0
Config Portb.1 = Output 'Motor2 Geschwindigkeit (PWM)
Motor2speed Alias Portb.1
Config Portb.2 = Output 'Motor1 Geschwindigkeit (PWM)
Motor1speed Alias Portb.2
Config Portb.3 = Output 'Servo1 (PWM)
Servo1 Alias Portb.3
Config Portb.4 = Output 'Motor2a
Motor2b Alias Portb.4
Config Portb.5 = Output 'Motor2b
Motor2a Alias Portb.5
Config Portc.0 = Output 'Motor1b
Motor1b Alias Portc.0
Config Portc.1 = Output 'Motor1a
Motor1a Alias Portc.1
'Config Portc.2 = Output
'Xx Alias Portc.2
'Config Portc.3 = Output
'Xx Alias Portc.3
'Config Portc.4 = Output
'Xx Alias Portc.4
'Config Portc.5 = Output
'Xx Alias Portc.5
'Config Portd.2 = Output
'Xx Alias Pind.2
'Config Portd.3 = Output
'Xx Alias Portd.3
'Config Portd.4 = Output
'Xx Alias Portd.4
'Config Portd.5 = Output
'Xx Alias Portd.5
Config Pind.6 = Input 'Ultraschall Echo
Us_echo Alias Pind.6
Config Portd.7 = Output 'Ultraschall Trigger
Us_trigger Alias Portd.7
'-------------------------------------------------------------------------------
'Timer/OCR/PWM/ISR usw. setzen
'-------------------------------------------------------------------------------
Pcicr = &B100
Pcmsk2 = &B01000000
On Pcint2 Echowechsel
Enable Pcint2
Config Timer2 = Timer , Prescale = 64 ' Echo vom Ultraschallsensor zählen
On Timer2 Isr_timer2
Enable Timer2
Enable Interrupts 'Interrupts global aktivieren
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Temp_string As String * 10
Dim Temp_long As Long
Dim Timerueberlauf As Long
Timerueberlauf = 0
Dim Messung_starten As Bit ' Zeigt an, ob Messung gestartet werden soll
Messung_starten = 1
Dim Messung_beendet As Bit ' Zeigt an, ob Messung beendet ist
Messung_beendet = 0
Dim Messergebniss As Long ' Ergebniss der Messung in us
Messergebniss = 0
Dim Entfernung As Long ' Entfernung in mm
Entfernung = 0
Dim Position_x_soll As Word
Dim Start_pause As Single
Start_pause = 1000
Dim Triggersignal_laenge As Single
Triggersignal_laenge = 10
Dim Timer_ueberlauf As Word
Timer_ueberlauf = 0
Declare Sub Triggersignal_senden(byval Start_pause As Single , Byval Triggersignal_laenge As Single)
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Hauptprogramm:
Do
For Position_x_soll = 8 To 22 Step 2
Timerueberlauf = 0
Messergebniss = 0
Temp_long = 0
Entfernung = 0
Messung_beendet = 0
Call Triggersignal_senden(start_pause , Triggersignal_laenge)
Do
Waitus 1
Loop Until Messung_beendet = 1
Print "'t=" ; Timerueberlauf
Print "_T=" ; Temp_long
Messergebniss = Messergebniss + Temp_long
Print "_M=" ; Messergebniss
Entfernung = Messergebniss * 172
Entfernung = Entfernung / 10000 ' Ergebniss in mm ?
Temp_string = Str(entfernung)
Temp_string = Format(temp_string , "000000")
Waitms 500
Print "==" ; Temp_string ; "mm" ' Ausgabe des Ergebniss
Next
Loop
End
'-------------------------------------------------------------------------------
'Subs
'-------------------------------------------------------------------------------
Sub Triggersignal_senden(byval Start_pause As Single , Byval Triggersignal_laenge As Single)
Messung_beendet = 0
Timerueberlauf = 0
Enable Interrupts
Waitms Start_pause ' minimale Wartezeit um "Fehlechos" auszuschliessen
Portd.7 = 1 ' Impuls an Triggerport senden
Waitus Triggersignal_laenge ' Impulsdauer 10us
Portd.7 = 0
End Sub
'-------------------------------------------------------------------------------
'Interrupt
'-------------------------------------------------------------------------------
Isr_timer2:
Timerueberlauf = Timerueberlauf + 1 'Timerüberläufe zählen
Return
Echowechsel: ' Interrupt startet bei Signalwechsel am Echopin
If Pind.6 = 1 Then ' Wenn Pin zu High wechselt ...
Timer2 = 0
Else ' wenn Pin zu LOW wechselt....
Disable Interrupts
Messergebniss = Timer2 ' Messergebniss in Variable speichern
Temp_long = Timerueberlauf * 255 ' aktuelle Timerüberläufe übernehmen
Messung_beendet = 1 ' Anzeigen, das Messung beendet is
End If
Return ' Zurück zum Hauptprogramm
Werte bei 5cm:
't=33 _T=8415 _M=8456 ==000145mm
't=33 _T=8415 _M=8456 ==000145mm
't=33 _T=8415 _M=8456 ==000145mm
Werte bei ca. 2m:
't=33 _T=8415 _M=8492 ==000146mm
't=33 _T=8415 _M=8489 ==000146mm
't=33 _T=8415 _M=8491 ==000146mm
NACHTRAG:
Nachdem ich nun so einiges vergeblich versucht habe bin ich zumindest soweit, das ich sagen kann:
Es muss mit dem PCINT22 / PCMSK / PCICR zu tun haben
Sogar bei abgestecktem sensor springt der PCINT22 an.
Also hab ich mal den Triggerport "nicht triggern lassen" ... dann springt der PCINT22 nicht an.
... nun ist zumindest der fehler eingegrenzt.
Das der Trigerport auch am PCINT2 liegt ist mir bewusst... aber ich war/bin der Meinung, das man ihn
durch die PCMSK2 auf eben diesen einen Pin beschränken kann. ?
Kann mir da wer verraten was an der Einstellung für den PCINT22 falsch sein kann ?
Lesezeichen