Ich arbeite mit dem SRF08-Modul. Mit dem SRF04-Modul habe ich eine Routine geschrieben in Assembler die eben die gesamte C-Control lahmlegt während der Messung. Das SRF-08 Modul hat den Vorteil das es selbstständig arbeitet durch die integrierte Logik. Das Ganze kann man auch besser an den eigens programmierten I²C-Bus hängen. Ein alter Stand als Basis den ich aber nicht mehr nutze hab ich hier mal reinkopiert. Den hab ich mal geschrieben und hatte meines Wissens noch Fehler, aber die kann man ja selbst noch beheben


Code:
Port1Data .EQU 1 ;Adresse Byteport 1 (Daten) 
Port2Data .EQU 2 ;Adresse Byteport 2 (Daten) 
Port1Dir .EQU 5 ;Adresse Byteport 1 (Richtung) 
Port2Dir .EQU 6 ;Adresse Byteport 2 (Richtung) 

SCL .EQU 0 ;Port 1 - I2C-Bus 
SDA .EQU 1 ;Port 2 - I2C-Bus 
Trigger .EQU 2 ;Port 3 - Ultraschall-Sonar 
Echo .EQU 3 ;Port 4 - Ultraschall-Sonar 

DistanzL .EQU $A5 ;Byte[5] 
DistanzH .EQU $A6 ;Byte[6] 

Param0 .EQU $91 ;Übergabeparameter 0 (intern) 
Param1 .EQU $92 ;Übergabeparameter 1 an Routine 

D0 .EQU 0 ;Bit 0 
D7 .EQU 7 ;Bit 7 

CCB_Get .EQU $0CB5 ;CCBASIC Get 
CCB_PuWoSt .EQU $17B1 ;BeSy: Push Port auf Rechenstack 

;---------------------------------------------------------------------------------------------- 
.ORG $0101 
;---------------------------------------------------------------------------------------------- 

;-----------------------+---------------------------------------------------------------------- 
; Information zum Sonar | => @4MHz CPU-Takt : 1 Cycle = 0,5us 
;-----------------------+ => eine Einheit : 18 Cycles = 9,0us 
; => rechnerische Genauigkeit: 00,15cm = 1,5mm 
; 
; Distanz[Word] * 1716 
; Formel: Entfernung[cm] = -------------------- 
; 2889 * fCPU[MHz] 
; 
; Distanz(cm) | Echo(ms) | Distanz(Word) | Kommentar: 
; ------------+----------+---------------+------------------------------- 
; 577,5 cm | 35,00 ms | 3889 | Kein Objekt erkannt 
; 429,0 cm | 26,00 ms | 2889 | Maximale Entfernung (unsicher) 
; 400,0 cm | 24,24 ms | 2694 | Im Messbereich (unsicher) 
; 350,0 cm | 21,21 ms | 2357 | Im Messbereich (unsicher) 
; 300,0 cm | 18,18 ms | 2020 | Maximale Entfernung (sicher) 
; 250,0 cm | 15,15 ms | 1683 | Im Messbereich (sicher) 
; 200,0 cm | 12,12 ms | 1349 | Im Messbereich (sicher) 
; 165,0 cm | 10,00 ms | 1111 | Im Messbereich (sicher) 
; 150,0 cm | 9,09 ms | 1010 | Im Messbereich (sicher) 
; 100,0 cm | 6,06 ms | 673 | Im Messbereich (sicher) 
; 50,0 cm | 3,03 ms | 337 | Im Messbereich (sicher) 
; 16,5 cm | 1,00 ms | 111 | Im Messbereich (sicher) 
; 10,0 cm | 0,61 ms | 67 | Im Messbereich (sicher) 
; 3,0 cm | 0,18 ms | 20 | Im Messbereich (sicher) 
; 1,6 cm | 0,10 ms | 11 | Im Messbereich (unsicher) 
; 1,0 cm | 0,06 ms | 7 | Im Messbereich (unsicher) 
; 0,1 cm | 0,01 ms | 1 | Minimale Entfernung (unsicher) 
; 
; Eventuell muß noch eine Konstante zum Messergebniss addiert oder subtrahiert werden um die 
; Distanz abzugleichen. Dies erfolgt wiederum in 1,5mm-Schritten. Diese Daten sind Idealfall 
; 
;---------------------------------------------------------------------------------------------- 

Sonar: ; *** Auf eintreffendes Echo warten und messen *** 
JSR GoPosMotoren ;GoSub GoPosMotoren 
MesseEcho1: BRCLR Echo, Port1Data, MesseEcho1 ;If Not Echo Then GoTo Sonar 
MesseEcho2: LDA #1 ;Distanz = Distanz + 1 
ADD DistanzL 
BCS MesseEcho3 
NOP ;Zeitkorrektur um 1us 
BRA MesseEcho4 
MesseEcho3: INC DistanzH 
MesseEcho4: BRCLR Echo, Port1Data, MesseEcho2 ;If Echo Then GoTo MesseEcho2 
SonarEnde: RTS ;Zurück nach BASIC