Hi Leute.
Ich habe die Schaltung mal nachgebaut, da sie doch recht klar strukturiert ist.
Das C Programm habe ich nach Bascom adaptiert (siehe Listing.)
Aber irgendwie habe ich nur Erkennung, wenn ich die beiden US Kapseln zueinanderhalte, dann kann ich auf dem Display eine Entfernung in Abhängigkeit vom Kapselabstand lesen. Wenn ich versuche eine Reflexion zu erhalten (Kapseln parallel), kommt nichts bei raus, obwohl der Untergrund Schall reflektieren müsste.
Evtl. kann mir ja jemand auf die Sprünge helfen. Könnte ein doofer Fehler sein, habe nur gerade ein Brett vorm Kopf.
Danke,
Jango
Code:
$regfile = "m32def.dat"
$crystal = 8000000
' ... Zeug fürs LCD weggelassen
Declare Sub Us_burst
Declare Sub Clear_burst
Declare Sub Enable_ain
Const Soundspeed_per_tick = 4 ' 4.3mm Both Ways Per Tick
Const Timercount = 100 ' $crystal / 80000 Preload For Timer
Const Bursts = 16 ' Number Of Half Periods To "ping"
'Toggle The Ports When Reached 8 000 000 / 80 000 = 100 !!!
Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Isr_timer0
Timer0 = 256 - Timercount
Config Aci = On , Compare = Off , Trigger = Rising
On Aci Isr_aci
''' register unsigned char timer_ticks asm("r10"); /* ticks since start of ping */
Dim Echo_ticks As Word ' /* ticks when the echo was received */
Echo_ticks = 0
Dim Distance As Word
Distance = 0
Dim Timer_ticks As Word
Timer_ticks = 0
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.2 = Input ' AIN bei MEga32
Config Pinb.3 = Input ' AIN bei MEga32
Enable Interrupts
Do
Echo_ticks = 0
Timer_ticks = 0
Call Us_burst
Enable Aci
While Timer_ticks < 500
$asm
nop
$end Asm
Wend
Call Clear_burst
Distance = Echo_ticks * Soundspeed_per_tick 'in mm
Locate 2 , 1
Lcd Distance ; " mm "
Waitms 10
Loop
End
' Interrupt Handler for Timer/Counter 0
Isr_timer0:
Incr Timer_ticks
If Timer_ticks <= Bursts Then
Toggle Portd.6
Toggle Portd.7
End If
Timer0 = 256 - Timercount
Return
Sub Us_burst
Portd.6 = 0 'on
Portd.7 = 1 'off
Timer0 = 256 - Timercount
Start Timer0
End Sub
Sub Clear_burst
'Stop it
Stop Timer0
Portd.6 = 0 'off
Portd.7 = 0 'off
End Sub
Isr_aci:
Echo_ticks = Timer_ticks
Disable Aci
Return
Lesezeichen