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