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.
Soweit schonmal vielen dank für die Tips... hat mich letztendlich doch auf ne Lösung gebracht, mit der ich gut weiterarbeiten kann.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






Zitieren


Lesezeichen