-
Hallo radbruch,
Die Zählschleife habe ich einmal ausprobiert, nur irgentwie hat diese (ich nehme an wegen if schleifen und so) sehr langsam gezählt. Die zahlen waren nur bei großen Entferunen im dreiselligen bereich, und da ich ja eigentlich nicht vor hatte, diese Lösung zu verwenden, habe ich sie nicht besonders Perfektioniert.
Naja, tut leid aber ich habe mich so lange auf das Interface konzentriert, und dann, als es funktioniert hat, da hab ich dann irgentwie keine Lust mehr gehabt, noch großartig an der Software herumzubasteln. Das kennt ihr sicher...
Solle es für dich wirklich wichtig sein, könnte ich es schon noch mal ausprobieren.
Und: man sieht deinen Hai nicht mehr, der dem Smily nachjagt, ist das absicht?
Mfg Thegon
-
Die Zählschleife hätte zumindest den Vorteil, das man da keine Fehler bei einigen Werten bekommt (wenn gerade ein Interrupt dazwischenfunkt). So ganz langsam sollte es selbst mit BASCOM nicht werden, zumindest wenn man passende Variablen (WORD) nimmt. Als ein Nachteil ist die Zeit je Schleifendurchgang möglicherweise von der Compilerversion abhängig - lösen läßt sich das wohl nur mit ASM. Zumindest mit etwas ASM für die Schleife wäre das besser als die Lösung mit dem 8 Bit-Timer.
Bei der einfachen Hardware kann man ohnehin kaum mit einer Genauigkeit von besser als 1 Wellenlänge/Periode rechnen - wenn man besser werden wollte müsste man für ein konstante Amplitude des Echos sorgen oder breitbandigere Transducer nehmen. Das heißt man kommt eigentlich mit 25 µs Zeitauflösung aus. Mit passendem Vorteile könnte dann ggf. auch der 8 Bit timer mit dem Overflowbit (aber ohne Zählen !) auskommen. Das würde bis etwa 2 m reichen. Es gäbe für den 8 Bit Timer noch eine etwas komische Möglichkeit: man macht das Hochzähler (nur 8 Bit Byte!) der Overflows nicht im Interrupt, sonder in einer Schleife per Polling. Den Fall das Overflow und Interrupt dicht zusammen kommen muss man ohnehin extra berücksichtigen.
-
Hallo
Mein Hai-Smile wird bei roboterbastler.de gehostet und da ACU grad an seinem Server rumschraubt können wohl kurzzeitige Ausfälle auftreten:
https://www.roboternetz.de/community...(ohne-Werbung)
Eine so geringe Auflösung mit der Zählschleife hätte ich nicht erwartet. Hier mal ein ungetesteter Beispielcode:
Code:
'Ultraschall Entfernungsmessung messprogramm
'Test mit Zählschleife
$regfile "M48def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Struser As String * 10 ' die Eingabevariable des Users
Dim Countperiodes As Byte ' die Perioden des Us bursts werden gezählt
Dim Entfernung As Word
'portd.3 als ausgang definieren, das ist der Start in Pin
Config Portd.3 = Output
Portd.3 = 1
Print "Ultraschall Entfernungsmessung Online"
Print "(mit Zählschleife)"
Do
Input Struser ' warten bis Eingabe erkannt
If Struser = "" Then
Entfernung = 0
'################# den Sendebrust generieren ##########
Countperiodes = 0
Do
Portd.3 = 0 ' man kommt so genau auf 40khz
Countperiodes = Countperiodes + 2
Portd.3 = 1
Countperiodes = Countperiodes - 1
Loop Until Countperiodes > 20
Portd.3 = 1
'######################################################
Do ' Warten und zählen bis Echo empfangen wird
Entfernung = Entfernung + 1
Loop Until Pind.2 = 1
Print Entfernung ' Entfernung ausgeben (per UART)
While Pind.2 = 1
Wend
End If
Loop
End
Ganz schön schlank, oder? :)
Gruß
mic
-
Finde den thread auch toll und weil noch ein Programm zur Zeitnahme mit dem ICP fehlt, hab ich mich mal versucht. Ist zwar nicht ganz schlank geworden, enthält aber noch eine alternative Bursterzeugung.
Gruß
Searcher
Code:
'###################################################
'File: US-Meßprogramm_ICP.bas
'IDE: BASCOM-AVR DEMO Version 2.0.5.0
'Meßprogramm zum Messen von US-Laufzeit mit RN Wiki US-Interface
'Messung wird erst gestartet, wenn der Burst komplett gesendet wurde
'Messung wird gestoppt mit Eintreffen des 0 nach 1 Wechsel auf PA7 (ICP)
'
'ATtiny24
'PB2 : Mit Taster den Burst und Messen starten
'PA7 : (ICP) - Meßpulsempfang vom Interface
'PA3 : SW UART #2 , 40kHz Burst Ausgang zum Interface
'PB0 : SW UART #1 , für Ausgabe der Meßwerte an 4 fach 7-Segmentanzeige
'#######################################################
$regfile = "attiny24.dat"
$framesize = 32
$swstack = 32
$hwstack = 36
$crystal = 8000000 'interner Oszillator
'##### Definitionen und Initialisierung für 7segment ausgabe ######
Dim Num_to_disp As Word
Dim Y As Byte
Dim Helperbyte As Byte
Dim Index As Byte
Dim Disp_string As String * 6
Dim Digit_char As String * 1
Declare Sub Display_value(num_to_disp As Word)
Open "comb.0:115200,8,n,1" For Output As #1 'comb.0 -> TX ist Pin PB0
Helperbyte = Lookup(17 , Segmentpattern) 'segment g
For Y = 1 To 5 : Put #1 , Helperbyte : Next '7 segment initialisieren
'#### Ende Definitionen und Initialisierung für 7 Segmentausgabe #######
Dim Flag_ausgabe_fertig As Byte
Dim Flag_messung_fertig As Byte
Dim Inputcapture_wert As Word
Porta = Porta Or &B11110111 'alle Pullips auf porta einschalten, Ausnahme PA3
Portb = Portb Or &B11111110 'alle Pullups auf portb einschalten, Ausnahme PB0
Config Timer1 = Timer , Capture Edge = Rising , Prescale = 8 'Timer mit 1Mhz und ICP gestartet (8Mhz Systemclk)
On Capture1 Isr_zeitnahme 'Bei Input Capture Event zur ISR für Zeitnahme
Open "coma.3:80000,8,n,1" For Output As #2 'coma.3 -> 40kHz Burst auf PA3 mit SW-UART
Enable Interrupts
Do 'Beginn Hauptprogramm
Do 'Warten auf Tastendruck (PB2 nach GND Wechsel)
Debounce Pinb.2 , 0 , Start_mit_burst
Loop
Start_mit_burst:
Print #2 , "UUUU" ; 'Burst Erzeugung (Jedes U erzeugt 5 Pulse)
Flag_ausgabe_fertig = 0
Flag_messung_fertig = 0
Timer1 = 0 'Timerzähler (TCNT1) mit 0 initialisieren, Meßzeit beginnt
Set Tifr1.icf1 'Eventuell anstehendes Input Capture Flag löschen
Enable Capture1 'Input Capture Interrupt scharf machen
Do 'Schleife zum Warten auf Meßende/Ausgabeende
If Flag_messung_fertig = 1 Then
Call Display_value(inputcapture_wert)
Flag_ausgabe_fertig = 1
End If
Loop Until Flag_ausgabe_fertig = 1 'Ende Warterei wenn Anzeige des Meßwertes erfolgt ist
Loop 'Loop Hauptprogramm
Isr_zeitnahme: 'Ansprung bei Input Capture Event an PA7
Inputcapture_wert = Capture1 'Inputcapture Register sichern
Flag_messung_fertig = 1 'Indication für Anzeige kann erfolgen
Disable Capture1 'Input Capture Interrupts unterbinden
Return
'############ Folgende Zeilen bis zum Ende nur zur Datenausgabe über 7 Segmentanzeige #############
Sub Display_value(num_to_disp As Word) 'gibt Dezimalzahlen bis 9999 aus
Disp_string = Str(num_to_disp)
For Y = Len(disp_string) To 3
Helperbyte = Lookup(16 , Segmentpattern)
Put #1 , Helperbyte
Next
For Y = 1 To Len(disp_string)
Digit_char = Mid(disp_string , Y , 1 )
Index = Val(digit_char)
Helperbyte = Lookup(index , Segmentpattern)
Put #1 , Helperbyte
Next
End Sub
Segmentpattern: 'darzustellende Zeichen (hex 0..F...)
'Segmente abcdefg: ' ":" = Doppelpunkt in der Mitte
Data &B00000011 'Ziffer "0", 0 = segment ein, 1 = aus
Data &B10011111 'Ziffer "1"
Data &B00100101 'Ziffer "2"
Data &B00001101
Data &B10011001
Data &B01001001
Data &B01000001
Data &B00011111
Data &B00000001
Data &B00001001
Data &B00010001
Data &B11000001
Data &B01100011
Data &B10000101
Data &B01100001 'Ziffer "E"
Data &B01110001 'Ziffer "F"
Data &B11111111 'dunkel
Data &B11111101 'nur Segment g eingeschaltet (-)
'########### ENDE US-Meßprogramm_ICP.bas ##############################################