Ja, da hast natürlich recht... das mit dem Pin hab ich vermurkst beim hin und hertesten.
Hab das angepasst und auch den Prescale mal auf 1 gesetzt.
Das Programm soll ja erstmal ausser sichtbare Werte abzugeben garnix können.
Ich würde mir wünschen, das zumindest im Controllcenter (also über den Print-Befehl) brauchbare werte
angezeigt werden, über die man dann die Entfernung berechnen kann.
Ich muss mir ausserdem noch recht überlegen, wie ich den Wert umgerechnet bekomm auf ein anständiges ergebniss.
Ich hab den eindruck, das das abarbeiten des Programms irgendwie die werte verfälscht.
ich bekomm zwar werte im bereich von grob 0 bis 200... aber die sind so extrem ungenau bzw wechseln in riesigen schritten(stellenweise 30-40).
Edit: Ich hab noch die Zeitmessung im Interrupt umgestellt vom ms auf us... das sollte sicher auch die Messgenauigkeit erhöhen.
Bin mir nur nicht ganz sicher, wielange das abarbeiten der befehle dauert. Das nehm ich aber erstmal als "Tolleranz" hin.
Hier das Ausgebesserte und dokumentierte Programm:
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 = 3686400 'eingestellte Taktfrequenz(externes Quarz)
$hwstack = 40 'Standardwert
$swstack = 32 'Standardwert
$framesize = 60 '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 Timer0 = Timer , Prescale = 1
Config Int0 = Rising
Enable Int0
Enable Interrupts
On Int0 Pulsbeginn ' Wenn auf echo gewartet wird wechselt Echo-Signal auf High für max 200ms
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Entfernungcm As Long
Dim Zeitecho As Long ' Gemessene dauer bis Echo ankommt
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
Timer0 = 0 ' Timer und Triggerport kurz auf 0 setzen
Portc.0 = 0
Delay
Portc.0 = 1 ' Triggerport für 10us Highpegel um messung zu starten
Waitus 15
Portc.0 = 0
Print Zeitecho ' Ausgabe der gemessenen Dauer
Zeitecho = 0
Waitms 50 'Messintervall bzw Pause einstellen
Loop
End
Pulsbeginn:
'Timer0 = 0 ' bei Pulsebeginn Timer auf 0 setzen und starten
Start Timer0
Do
Waitus 10
Loop Until Pind.2 = 0 ' warten bis Echo signal ankommt, dann wechselt der Pegel auf Low
'If Timer0 < 200 Then ' wenn kein echo gemessen wird bleibt der pegel 200ms auf High
Zeitecho = Timer0 ' Gemessene Dauer an Variable übergeben
'Else
'Zeitecho = 0 ' wenn kein echosignal gemessen wird Variable auf 0 setzen bzw. lassen
'End If
Stop Timer0
Return
Lesezeichen