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:
Direkt zum Ergebniss des Timers hab ich noch einen Kalibrierwert gesetzt und der scheint soweit auch schon zu passen.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
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







Zitieren

Lesezeichen