So... da ich dann gestern abend in der Wanne den kopf nicht frei bekommen hab
bin ich noch dazu gekommen den Programmansatz von Searcher umzuwandeln in ein Laufendes Programm.
Sieht jetzt so aus:
Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Programmname: Sensorabfrage.bas
'Letzte Änderung: 13.11.2012
'Funktion: Abfrage des Ultraschallsensor hc-sr04
' und Ausgabe über "Print"
'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 (8MHz)
$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/INT usw. setzen
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 8 ' ergibt 1.000.000 ticks/sekunde
Config Int0 = Change ' Interrupt bei wechselnder Flanke am Echosignal starten
On Int0 Echowechsel '
Enable Int0 ' Wenn auf Echo gewartet wird wechselt Echo-Signal auf High
Enable Interrupts '
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Messungstarten As Bit ' Zeigt an, ob Messung gestartet werden soll
Messungstarten = 1
Dim Messergebniss As Long ' Ergebniss der Messung in us
Messergebniss = 0
Dim Messungbeendet As Bit ' Zeigt an, ob Messung beendet ist
Messungbeendet = 0
Dim Entfernung As Long ' Entfernung in mm
Entfernung = 0
Dim Kalibrierwert As Integer ' Zum genauen einstellen
Kalibrierwert = 0
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
If Messungstarten = 1 Then ' Abfrage, ob Messung gestartet werden soll
Waitms 20
Portc.0 = 1 ' Impuls von 10us an Triggerport senden
Waitus 10
Portc.0 = 0
Messungbeendet = 0
Messungstarten = 0
End If
If Messungbeendet = 1 Then ' Berechnung des Ergebniss, wenn Messung beendet ist
Entfernung = Messergebniss + Kalibrierwert
Entfernung = Entfernung * 172
Entfernung = Entfernung / 1000 ' Ergebniss in mm
Print Entfernung ' Ausgabe des Ergebniss
Waitms 300 ' Pause zwischen Messungen (bessere lesbarkeit)
Messungstarten = 1 ' neue Messung starten
End If
Loop
End
'-------------------------------------------------------------------------------
'Interrupt
'-------------------------------------------------------------------------------
Echowechsel: ' Interrupt startet bei Signalwechsel am Echopin
If Pind.2 = 1 Then ' Wenn Pin zu High wechselt soll Timer1 Zeit zu messen
Timer1 = 0
Start Timer1
Else ' wenn Pin zu LOW wechselt, messung beendet und Wert in Variable speichern
Messergebniss = Timer1 ' Wert in Variable speichern
Messungbeendet = 1 ' Anzeigen, das Messung beendet ist
End If
Return
Direkt zum Ergebniss des Timers hab ich noch einen Kalibrierwert gesetzt und der scheint soweit auch schon zu passen.
Ich hab 2 identische Sensoren hier und beide liefern mir exakt die selben werte.
Wie es sich bei entfernungen grösser als 1m verhält muss ich noch testen.
Und ja... der Atmega8 läuft jetzt mit 8MHz... und ich hab auch die fusebits so gestellt.
Späther soll das ganze mal mit 2-3 Sensoren auf ein Fahr-Chassis kommen.
Da werd ich vermutlich (um Pins zu sparen) die Sensoren abwechselnd messen lassen.
Das sollte von der Geschwindigkeit gut ausreichen. Soll ja kein Rennwagen sein.
Was mir in deinem Code aufgefallen ist:
Der Timer wird nur auf 0 gesetzt... Startet der automatisch wieder ?
und die Flags hab ich als normale Variablen gemacht... so kann ich sie schnell ändern und
im Zweifelsfall mehrere verschiedene Zustände übergeben.
Vielen Dank für eure Tips und Hilfestellung.
Gruss,... JoeM
Lesezeichen