Abfrage Ultraschallsensor HC-SR04 unter BASCOM
Hey... ich habe ein MyAVR board und möchte die Werte vom Ultraschallsensor erstmal testweise abfragen.
Bin im Bereich microcontroller eher noch Blutiger Anfänger und versuch durch "Probieren" mir das
eine oder andere Beizubringen.
Dazu hab ich ein kurzes Programm aufgesetzt.
Leider hat sich irgendwo ein Fehler eingeschlichen und ich find den nicht.
Generell ist es so gedacht, das bei steigender Flanke vom Echo in einem Interrupt der Timer gestartet wird
und mir die Länge des Echos als Zeitwert ans Programm übergibt.
Könnt ihr bitte mal durchschauen, was ich da falsch hab.
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
Config Pind.2 = Input
'-------------------------------------------------------------------------------
'Timer/OCR/PWM usw. setzen
'-------------------------------------------------------------------------------
Config Timer0 = Timer , Prescale = 1024
Config Int1 = Rising
Enable Int1
Enable Interrupts
On Int1 Pulsbeginn
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Entfernungcm As Long
Dim Zeitecho As Byte
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
Timer0 = 0
Portc.0 = 0
Delay
Portc.0 = 1
Waitus 15
Portc.0 = 0
Print Zeitecho
Waitms 150
Loop
End
Pulsbeginn:
Timer0 = 0
Start Timer0
Do
Waitms 1
Loop Until Pind.2 = 0
If Timer0 < 200 Then
Zeitecho = Timer0
Else
Zeitecho = 0
End If
Stop Timer0
Return
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
JoeM1978
Das ist ziemlich egal, die sind vom Aufbau und Verwendung praktisch identisch.
Zitat:
Zitat von
JoeM1978
Was mir dabei etwas sorgen macht ist, das er auf dem Echo pin erstmal ein 40khz Signal sendet, bevor er dauernd auf High bleibt bis zum empfang des Echo.
Tut er nicht, siehe folgende Grafik ;)
Anhang 23723
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo JoeM1978,
auch in Deinem letzten Ablauf muß das Hauptprogramm bzw Subroutine warten. Dort gibt es zB "loop until echopin = 0". Ein Taktzyklus ist bei 8Mhz Systemtakt 125ns lang. In der Zeit, in der der Prozessor zB 1ms wartet (und es kann ja auch noch viel länger sein), könnte er mehr als 4000 Maschinenbefehle ausführen (bei ca 2 Zyklen für einen Maschinenbefehl). Wenn das Programm mit anderen Funktionen erweitert wird, wird es also vermutlich hakeln, vor allem wenn da noch andere zeitkritische Aufgaben zu erledigen sind.
Hab mir das Datenblatt angesehen. Chypsylon hat schon geschrieben, daß Du da keine Sorgen haben brauchst. Außerdem kannst Du ja beides ausprobieren.
Der Sensor ist ja im Prinzip recht einfach. Man schickt auf der Triggerleitung ein Signal hin und erwartet auf der Echoleitung einen Impuls, dessen Länge man dann mißt.
Das sind getrennte Leitungen. Auf dieser Echo-Leitung ist immer nur das Echo Signal vom HC-SR04 zu sehen. Das soll man nicht verwechseln mit dem Ultraschallecho, das zurückkommt, wenn der Sensor den 40kHz Ton gesendet hat. Das Ultraschallecho vearbeitet der Sensor und gibt daraufhin auf der Echoleitung den Gleichspannungsimpuls raus. Im Oszillogramm im Datenblatt unter "Single Shot Modus" gut zu sehen. Mit 40kHz hat man nichts zu tun. Das bearbeitet der HC-SR04 allein.
Meinen Pseudocode kannst Du also trotzdem verwenden, gilt auch für den HC-SR04.
Edit: Hab Dir Code angehangen, wie ich es mir bisher gedacht hatte. Nur probekompiliert, nicht getestet. Das "waitms 20" versuchen wir im nächsten Schritt wegzukriegen, wenn Du Dich für diese Variante entscheidest. Kann man auch über Timer machen.
Mit welchem Takt läuft der Mega8 tatsächlich?
In Deinem ersten Posting ist $crystal = 3686400 . Im zweiten ist $crystal = 8000000
Gruß
Searcher
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein Auschnitt aus einer Arbeit von mir, wo die Pegel der Pins beschrieben werden:
Anhang 23728
Oben siehst du auch die Formel zur Berechnung der tatsächlichen Entfernung.