Hallo allerseits,
Ich werkle schon seit längerem an einer Ultraschall Enfernunsmessung und bin im Roboterwissen auf die Schaltung des Ultraschall - Interfaces von Manf gestoßen, bzw. hat mich besserwessi darauf aufmerksam gemacht. Diese Schaltung hat mir gleich zugesagt und ich habe es einmal ausprobiert, nur leider funktioniert es nicht so richtig.
Das stoppen der Zeit übernimmt ein ATmega48, der zuerst in einer Schleife 16 Perioden des US - Bursts erzeugt, die dann in den Start in Eingang der Ultraschall - Interface Schaltung gehen. Warum kein Timer? Das habe ich schon einmal in einen Thread gepostet, der Timer schafft in Bascom keine 40 kHz.
Dann beginnt das Stoppen der zeit, die dann in der isr des interruptpins umgerechnet und ausgegeben wird.
Das ganze soll starten, wenn per UART ein "go" eintrifft.
So weit so gut.
Nun kommt zwar etwas per UART herein, nur das ist ziemlich unbrauchbar.
Die Erste zahl ist total verrückt, die ist manchmal riesengroß, dann im minus und ich habe bemerkt, dass es einen unterschied macht, wie lange ich mir zwischen dem Go - Schreiben zeit lasse.
Darauf folgen konstant (fast immer, um genau zu sein) 16 Zahlen, die alle fast gleich groß sind, etwa um die 20 - 30, manchmal aber auch größer als 100.
Der Witz an der sache ist, dass dies per UART hereinkommt, egal, ob der Sendewandler angeschlossen ist oder nicht.
Ich habe lange herumprobiert, aber leider ohne erfolg.
Der Code des Atmels hier:
Code:
$regfile "M48def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Endtime As Long
Dim Countperoverflow As Integer
Dim Stringuser As String * 10
Dim Countperiodes As Byte
Config Timer0 = Timer , Prescale = 1
On Timer0 Isrtimer
Enable Interrupts
Config Int0 = Rising
Enable Int0
Enable Interrupts
On Int0 Isr_interrupt
Config Portd.3 = Output
Portd.3 = 1
Do
Input Stringuser
If Stringuser = "go" Then
'################# den Sendebrust generieren +++++++++
Countperiodes = 0
Do
Portd.3 = 0
Waitus 8
Portd.3 = 1
Waitus 8
Countperiodes = Countperiodes + 1
Loop Until Countperiodes > 16
Countperiodes = 0
Portd.3 = 1
'######################################################
'Warum nur acht us warten? Ich habe das einfach ausprobiert und so kommt man ungefähr auf 42 kHz
Enable Timer0
Stringuser = ""
End If
Loop
'###############TimerIsR##################
Isrtimer:
Countperoverflow = Countperoverflow + 1
Return
'#########################################
'#########Interrupt################
Isr_interrupt:
Disable Timer0
Endtime = Countperoverflow * 256
Endtime = Endtime + Timer0
Print Endtime
Endtime = 0
Countperoverflow = 0
Return
Wäre sehr dankbar, könnte mir jemand sagen, was ich anders machen sollte bzw. wo der Fehler liegt.
Dass die Schaltung des US - Interfaces fehler aufweist, glaube ich eher nicht, ich habe sie durchgeprüft und gemessen, wo es etwas zu messen gibt. Ich kann mich aber natürlich auch täuschen.
Lesezeichen