Hallo Roboter-Freunde,
Ich möchte für Ultraschall-Entfernungsmessung* eine Zeit möglichst genau messen. Das Problem ist, dass ich zur Aufzeichnung der Zeit eine Variable hochzähle. Das dauert aber bei meinem ATTiny26 zu lange. Deswegen zählt er die Zeit nicht richtig.
Beispiel:Nun dauert das increase(zeit) so lange, dass es für 0.0029s*, 147 zählt. Das würde bedeuten, dass er für jedes increase 19,8µs braucht. Für meinen Geschmack viel zu viel, denn dadurch wird die Messung ungenau.Code:Schleife(bis Signal eintrifft) increase(zeit) next
Nun habe ich mir gedacht, dass das Problem irgendwie lösbar sein muss. Ich hatte da an so etwas wie ON INTERRUPT gedacht, habe es aber noch nie benutzt, weiß auch nicht wie das funktioniert...
Habt Ihr ne Idee?
Ich benutze einen ATTiny26 und programmiere mit Bascom AVR. Meine Zeit-Variable habe ich als byte deklariert, da diese schneller bearbeitet wird. Da ich aber schon bei 1,5m 214 zähle, und bei 255 Schluss ist, werde ich bei größeren Distanzen auch Probleme haben.
Hier mein Quellcode:*= Ich sende ein Ultraschall-Signal und messe die Zeit bis es eintrifft. Die 29ms ergeben sich durch meine Messung.Code:'------------------------------------------------------------ ' ATTINY26 Ultrasonic file D.H. 2006-01 '------------------------------------------------------------ $regfile = "at26def.dat" ' default the internal osc runs at 1 MHz $crystal = 1000000 ' Led connected to portb.4 via 1 kOhm to + 5V ' LCD connected to port A Dim Zeitus As Byte Dim S As Long Dim S2 As Long 'Dim Msg As String * 20 Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , Rs = Porta.4 , E = Porta.5 Config Lcd = 16 * 2 Config Pina.7 = Input Config Pina.6 = Input Zeitus = 0 S = 0 Do Cls Locate 1 , 1 Lcd "Warte... t=" ; Zeitus Locate 2 , 1 S2 = S / 10000 Lcd "s=" ; S ; " mm" Zeitus = 0 S = 0 'Zuerst auf Startsignal warten While Pina.6 = 0 'nichts Wend 'Nun zählen '---> HIER IST DER KRITISCHE TEIL: While Pina.7 = 0 ' Das hab ich rausgenommen, da er für das Zeitus++ eh lange braucht 'Waitus 1 'wartet 1 µS Zeitus = Zeitus + 1 'Zählt 1 mehr Wend 'ENDE DES KRITISCHEN TEILS <--- 'Nun Ausgabe Cls Locate 1 , 1 'Msg = "t=" ; Zeitus ; "µs" Lcd "t=" ; Zeitus ; "µs" Locate 2 , 1 S = Zeitus - 5 S = S * 10000 S = S / 1403 'Msg = "t*v=" ; S ; "µm" Lcd "t*v=" ; S ; "µm" ' Zeitus = Zeitus * 100 'µs * µm/µs = µm ' S = S / 1000 While Pina.6 = 1 'warte bis signal weg 'nichts Wend Loop End
PS: Die Entfernungsmessung mit Ultraschall ist Thema meiner Facharbeit.







Zitieren

Lesezeichen