So... nachdem ich bis heute nacht um 2 an dem Problem gesessen bin kam mir die Erleuchtung.
Ich hatte ständig wechselnde werte obwohl sich der Abstand nie geändert hatte.
Das lag daran, das der Timer0 nur bis 255 geht und ich aber das Vielfache an Ticks zu zählen hab.
Der war also ständig am Überlaufen.
Also hab ich versucht den Timerüberlauf abzufragen... das hat allerdings nicht funktioniert, da das programm wohl die routine im Interrupt
bevorzugt abarbeitet und der Überlauf nicht wirklich gerechnet wird.
Also hab ich mir einen "manuellen Timer-Überlauf" gemacht innerhalb der Interrupt-Routine.
Dieser wird einfach um 1 erhöht sobald der Timer bis 50000 gezählt hat. Danach wird der Timer wieder auf 0 gestellt und beginnt von vorne.
Dazu gleich den Timer1 verwendet, der eine viel höhere Zählkapazität hat.
Das Ergebnis liefert jetzt soweit ich das sehe recht genaue Werte proportional zum Abstand Sensor<>Gegenstand.
(Und ist dazu noch recht übersichtlich)
Was mir nun noch fehlt ist die genaue Umrechnung in einen Entfernungswert (cm) mit grrsstmöglicher Genauigkeit.
Leider musste ich dabei feststellen, das dividieren in Bascom (speziell noch mit 2 stellen nach dem Komma)
für meine bisherigen Kenntnisse sehr schwer scheint.
Vieleicht kann mir da noch jemand den passenden Anstoss geben.
Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Programmname: Sensorabfrage.bas
'Letzte Änderung: 11.11.2012
'Funktion: Abfrage des Ultraschallsensor hc-sr04
'Mikrocontroller: Mega8
'
'Input: D2 - Echosignal
'
'Output: C0 - Triggersignal
'
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Den Atmega mit den passenden Daten füttern.
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" 'eingesetzter Mikrocontroller
$crystal = 8000000 'eingestellte Taktfrequenz(externes Quarz)
$hwstack = 100 'Standardwert
$swstack = 100 'Standardwert
$framesize = 100 'Standardwert
'-------------------------------------------------------------------------------
'Ports/Pins konfigurieren.
'-------------------------------------------------------------------------------
Config Portc.0 = Output ' Trigger-Signal zum Sensor
Config Pind.2 = Input ' Echo-Signal vom Sensor
'-------------------------------------------------------------------------------
'Timer/OCR/PWM usw. setzen
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 1 'ergibt 8.000.000 ticks ??
Config Int0 = Rising ' Interrupt bei Steigender Flanke am Echosignal starten
On Int0 Pulsbeginn '
Enable Int0 'Wenn auf Echo gewartet wird wechselt Echo-Signal auf High
Enable Interrupts '
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Zeitecho As Long 'Gemessene dauer bis Echo ankommt
Zeitecho = 0
Dim Entfernungcm As Long
Entfernungcm = 0
Dim Ueberlaufsumme As Long ' Die überläufe und den einzelnen Timerwert addieren
Ueberlaufsumme = 0
Dim Ueberlauf As Long ' Manueller Ueberlauf
Ueberlaufsumme = 0
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
Ueberlaufsumme = Ueberlauf * 50000 ' Anzahl ticks der Zeitmessung zusammenrechnen
Zeitecho = Ueberlaufsumme + Timer1 '
Print Zeitecho 'Ausgabe des Wertes
Ueberlauf = 0 ' Vor Beginn der Neuen Messung alle
Ueberlaufsumme = 0 ' Variablen auf 0 setzen
Zeitecho = 0 '
Timer1 = 0 '
Portc.0 = 1 ' Triggerport für mind. 10us Highpegel um messung zu starten
Waitus 10 '
Portc.0 = 0 ' Bei wechsel des Triggersignals auf 0 beginnt der sensor die Messung
Waitms 20 ' Messintervall bzw Pause einstellen
Loop
End
'-------------------------------------------------------------------------------
'Interrupt
'-------------------------------------------------------------------------------
Pulsbeginn: ' Starten der Zeitmessung sobald echo auf High wechselt
Start Timer1 ' Zeitmessung, wielange Echosignal dauert
Do
If Timer1 = 50000 Then ' Manueller Timer-Überlauf
Ueberlauf = Ueberlauf + 1 ' Überläufe Zählen
Timer1 = 0 ' nach zählen des Überlaufs Timer wieder reseten
End If
Loop Until Pind.2 = 0 ' Zeit solange messen, bis Echo-Signal wieder zu LOW wechselt
Stop Timer0
Return
Soweit schonmal vielen dank für die Tips... hat mich letztendlich doch auf ne Lösung gebracht, mit der ich gut weiterarbeiten kann.
Lesezeichen