Timer für Ultraschallsensor

beefeater

Neues Mitglied
28. Dez. 2012
1
0
0
Sprachen
Hallo
eigentlich arbeite ich nicht so viel mit µController im Zusammenhang mit Atmega Bascom aber ab und zu muss man über den Tellerrand schauen. Ich habe bereits hier gesucht aber auf anhieb nicht die richtige Antwort gefunden. Zu meinem Problem.

Die Aufgabenstellung ist einen Ultraschallsensor auslesen und den Wert auf ein Display auslesen. Einen Passenden Quellcode habe ich hier gefunden:

http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&t=4203&highlight=ultrasonic

Da dort mehr englisch gesprochen wird und der Beitrag recht alt ist stelle ich die Frage lieber hier.

Das ist der Quellcode aus dem Beitrag:

Code:
'(
Ping Program By Ex4(www.ex4.netfast.org)
Ping Input At Pinb.6
Lcd At Pinb.0 - Pinb.5
Uc = At90s2313
Xtal = 11059200 Hz
')

$crystal = 11059200
$regfile = "2313def.dat"

$hwstack = 32
$swstack = 16
$framesize = 16

'lcd setup
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

'timer setup
Config Timer1 = Timer , Prescale = 8                        'timer step = 8/11059200 = 0.72338 us, overflow = 47.407 ms
Stop Timer1

'some var and const
Dim Tmr_val As Word
Dim Distance As Single

Const T_per_cm = 29.034                                     '1cm=29.034us

Main_prog:
   Ddrb.6 = 1                                               'pinb.6 as output for ping
   Portb.6 = 0                                              'low first
   Start Timer1                                             'timer1 on

   Cls
   Cursor Off Noblink
   Lcd "Distance : (cm) "
   Locate 2 , 1
   Lcd "0"
Do

   Ddrb.6 = 1                                               'pinb.6 as output for ping
   Portb.6 = 1                                              'high

   Timer1 = 0                                               '5us  delay
   Do
   Loop Until Timer1 >= 7

   Portb.6 = 0                                              'make sure pinb.6=0

   Ddrb.6 = 0                                               'pinb.6 as input for ping
   Portb.6 = 1                                              'pull up on

   Bitwait Pinb.6 , Set                                     'wait until a high respon from ping (holf off time)

   Timer1 = 0                                               'reset timer1 value,ready to count timer elapsed

   Bitwait Pinb.6 , Reset                                   'wait until a low respon from ping (distance time)

   Tmr_val = Timer1                                         'copy timer1 value for distance measurement
   Distance = Tmr_val * 8
   Distance = Distance / 11.0592                            'distance time coverage in uS
   Distance = Distance / 2                                  'only 1 portion echo count

   Distance = Distance / T_per_cm                           'distance in cm

   Locate 2 , 1                                             'erase lcd
   Lcd Spc(16)
   Locate 2 , 1                                             'display the distance
   Lcd Distance

   Waitms 1000                                              'wait about 1s

Loop

Ich möchte den Quellcode auf einen Atmega8 möglichst intern getaktet umschreiben und habe folgende Fragen:

welche Taktrate würdet Ihr nehmen?
wie berechne ich den Timer damit ich korrekte Werte ausgegeben bekomme?

Eventuelle kennt ja wer einen Beitrag der diesen Beitrag überflüssig macht.

Ich danke für Eure Mühe

Wolfgang
 
Hallo Wolfgang,

welche Taktrate würdet Ihr nehmen?
In dem Projekt wurde ein Quarz mit einer krummen Frequenz eingesetzt. Das legt die Vermutung nahe, dass dies zum Erreichen des notwendigen Timings geschehen und für die Genauigkeit ein entsprechend stabiler Takt erforderlich ist. Der interne RC-Oszillator ist ein instabiler Genosse - exemplarabhägig und auch beeinflusst von Temperatur und Betriebsspannung. Könnte gut sein, dass der für diese Anwendung nicht ausreicht (mal ganz abgesehen von der Frage, ob man das Timing hinbekommt).

wie berechne ich den Timer damit ich korrekte Werte ausgegeben bekomme?
Am einfachsten geht' hiermit :
http://www.avr-praxis.de/forum/showthread.php?74-Tool-AVR-Timer-Calculator

Gruß
Pirx
 
Hallo Beefeater,

poste doch mal die Daten deines Ultraschall-Sensors.
Grundsätzlich solltest du, um messen zu können einen externen Quarz benutzen.
Wie mein Vorredner schon sagte, ist der eingebaute Oszillator relativ ungenau.

Der, im Beispiel verwendete Quarz mit 10,052xxx MHz ist ein spezieller, der sich gut teilen lässt, um die Geschwindigkeiten der seriellen Schnittstelle genau einhalten zu können. Wer 8051er Systeme noch kennt, kennt auch diese Quarze^^. Sind beim Atmega aber nicht ganz so wichtig, ausser man baut eine Anwendung auf, die speziell mit RS232 zu tun hat.

In dem Beispiel wird mit Prescaler = 8 der Takt so heruntergeteilt das er eben ca. 47uS erhält. Scheinbar ist das die Zykluszeit des verwendeten Modules.

Ultraschall-Module sind nicht ganz einfach zu handhaben, da solltest du in der Beschreibung gucken, welches Timing sie erfordern.
Diese Module brauchen eine gewisse Zeit, 1. um ordentlich einzuschwingen und 2. um zu Messen.
Daraus mußt du dir dann einen Messzyklus für dich generieren.

Noch einen Tip: mache mindestens 3 Messungen und mittle diese dann, um Fehler besser auszugleichen.
Am besten mit einer Interrupt-Routine messen und im Hauptprogramm das LCD pollen.
Damit wird die Messung genau, und wenn das LCD ein bischen verzögert aktualisiert merkt man das im Normalfall kaum.
Soviel zur groben Theorie ...

Ich hoffe, ich konnte dir ein bischen helfen
Bardo
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)