Hallo,

das ganze ist ueberhaupt nicht schwer und tut auch nicht weh.
Die Erde ist naemlich eine grosse Gooogle. Und auf dieser befindet sich z.B. diese Seite: http://www.icplan.de/seite11.htm

Bei der Angelika gibt es dazu guenstig die Zutaten. Der Rest ist dann nur noch lesen, verstehen und das Ganze irgendwie umsetzen.

So, und wie haekelt man die Weichware unter Bascom zurecht? Ganz einfach. Man schaue sich die Schaltung an. Dort sieht man das der US-Sender einfach mittels eines Ports aktiviert wird. Dieser bruellt nun unhoerbar los und der Empfaenger empfaengt irgendwann mal was. Das Empfangene wird in dem LM393 aufbereitet und steht am Kollektor des BC547 als Schaltsignal zur Verfuegung.

In der Software wird zunaechst der US-Sender eingeschaltet und zugleich Timer0 gestartet. Hier inkrementiere ich mit jedem Timerdurchlauf eine Variable (voll total simpel). Sobald nun das Schaltsignal vom US-Empfaenger kommt, wird beim AVR ein Interrupt ausgeloest. In der Int0_isr wird dann sofort der Timer0 gestoppt und der US-Sender ausgeschaltet (noch simpler). Als naechstes wird der Wert der hochgezaehlten Variable entsprechend umgerechnet (man macht zuvor ein paar Probemessungen und berechnet den Faktor aufgrund einiger definierter Abstaende und der hochgezaehlten Variablenwerte).
Die dann ausgerechnete Laengenangabe in Zentimeter wird nun auf ein LC-Display zur Anzeige gebracht. Das Ganze geschieht zyklisch alle 500ms.

Funktioniert uebrigens wunderbar.

Das ganze war mit googlen, zusammenbruzzeln und Software stricken innerhalb von 4 Stunden erledigt. Und das ohne tagelange Fragerei im Forum. ;)

Ein paar Bilderchen:
http://www.elektronik-web.de/atmel/us/

Die Weichware:
Code:
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 16
$framesize = 40

Config Pinc.6 = Output
Config Pind.1 = Output
Config Pind.0 = Input
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 1
Config Graphlcd = 240 * 64 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6
On Timer0 Timer0_isr
On Int0 Int0_isr
Enable Timer0
Enable Int0
Enable Interrupts
Stop Timer0

Dim Us As Long
Dim Cm As Single
Dim Scm As String * 10
Us_tm Alias Portd.1
Us_tm = 1
Bl Alias Portc.6
Bl = 1
Us = 0

Cursor Off
Cls

Locate 1 , 1
Lcd "Abstandsmessung mit"
Locate 2 , 1
Lcd "Ultraschall"
Start Timer0
Us_tm = 0

Do
 Us_tm = 0                              'US-Transmitter An
 Start Timer0
 Waitms 500

 Cm = Us / 3.91
 If Cm > 500 Then Scm = "--"
 Scm = Fusing(cm , "#.#")

 Locate 5 , 10
 Lcd Scm ; " cm    "
 Locate 10 , 10
 Lcd Us ; "   "
 Us = 0

Loop

End

Timer0_isr:
 Incr Us
Return

Int0_isr:
 Stop Timer0
  Us_tm = 1                             'US-Transmitter Aus
Und btw: Wenn Du im Betreff dieses Fred's etwas gehaltvolleres wie z.B. "Problem mit Ultraschallabstandsmessung" geschrieben haettest, wuerde dieser Thread sicherlich mehr Beachtung finden. Somit erhoehen sich die Chancen auf Antworten.

Mit freundlichen Gruessen
Digitali