PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung atmega8



epos
30.05.2007, 14:12
Hallo! ich möchte mit einem atmega 8 und einer lichtschranke eine zeitmessung aufbauen.
leider hab ich nicht so viel erfahrung mit der programmierung in Bascom. (bin anfänger)
ich möchte, dass die zeitmessung in millisekunden läuft.
welchen timer, welche zählweite und welchen prescaler muss ich wählen, dass der zähler nach 1 ms einen Überlauf macht?
Und wie lasse ich eine variable hochzählen?
Danke für die hilfe!!! O:)

kalletronic
30.05.2007, 15:03
Hi, das mit dem Zähler fällt mir grad net ein, versuchs mal im datenblatt des Mega8.
hochzählen der Variable :
variable = variable + 1

Vitis
30.05.2007, 22:55
oder halt:

incr variable

für die Timereinstellungen schau mal unter
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

Sauerbruch
31.05.2007, 17:28
Die Frage, welcher Timer mit welchem Prescaler am geeignetsten ist, hängt auch ein Stück weit von der Quarzfrequenz ab. Prescaler/Quarzfrequenz ergibt das Zeitintervall (in Sekunden), das der Zähler für einen Zählschritt braucht. Wenn Du also die 1ms durch dieses Intervall (auch in ms!!) teilst, weißt Du, wie viele Schritte der Zähler in einer Millisekunde hochzählt.

Im Mega8 gibt es 2 Zähler mit 8 Bit, die bis 255 zählen können (Timer 0 und 2) sowei einen 16 Bit-Zähler, der folglich bis 65535 zählen kann (Timer 1). Wenn das Ergebnis aus 0,001s*Quarzfrequenz/Prescaler größer als 255 ist, musst Du den 16-Bit Timer nehmen.

Allens klar? ansonsten lohnt in der Tat die Auseinandersetzung mit den "Output compare"-Registern (Datenblatt!)

epos
31.05.2007, 18:18
Danke für die antworten!
wie komme ich auf den prescaler?
für die berechnungen brauche ich ja den prescaler. die quarzfrequenz beträgt 16 mhz!
Gruß epos!

Sauerbruch
31.05.2007, 18:36
Es gibt 5 verschiedene prescaler: 1, 8, 64, 256 und 1024. Die kannste auswählen, wenn Du im Bascom den Timer konfigurierst (Config timer1 = timer...). `Ne super Hilfefunktion gibt´s da bei Bascom im Programm, einfach das gelbe Fragezeichen anklicken und dann "BASCOM Language Reference" auswählen - da findest Du zu JEDEM Befehl echt ausführliche Infos.

Ich hab´s mal kurz angerechnet: Mit einem Prescaler von 1 würde der Timer in 1 ms bis 16000 zählen (wer hätte das gedacht?), das wär´also ein klarer Fall für Timer 1.
Willst Du einen der beiden 8-Bit Zähler nehmen, bräuchtest Du ein Prescale von 64 - dann zählt er in 1ms bis 250 hoch (schön, weil er somit fast die ganze Breite des Zählers nutzt).

Und wie gesagt - die BASCOM-Hilfe ist gar nicht hoch genug zu schätzen!!

epos
31.05.2007, 20:09
Danke für deine Antwort Sauerbruch!
Gut, dann nehm ich einen 8-bit zähler mit einem prescale von 64!
Aber weiß noch wer, wie ich jetzt eine variable (eben die zeit in ms) hochzählen lassen kann, sodass ich dann mit der variablen weiterrechnen kann?
Danke für eure schnelle hilfe!

Sauerbruch
01.06.2007, 09:27
Zuerst definierst Du die Variable, die zählen soll, z.B. "Zeit"

Dim Zeit as Byte

Da nimmst Du am besten Timer 2, denn der hat (im Gegensatz zu Timer 0) ein "Output Compare Register). Da bschreibst Du den Wert 250 rein, dann gibts beim Zählerstand von 250 einen Interrupt:

OCR2 = 250

Als nächstes sagst Du dem Programm, zu welchem Label es im Compare-Fall springen soll:

On COMPARE2 Zählen

Die Interrut-Routine sollte dann etwa so anfangen:

Zählen:
Timer2 = 0 (wichtig - gleich am Anfang!!)
Zeit = Zeit + 1
return

Alles klar?[/code]

epos
01.06.2007, 12:42
Danke! ich glaub ich habs!
mit der variable "Zeit kann ich dann wieterrechnen, richtig?
stellst du mit timer2=0 den timer auf 0?
gruß epos

Sauerbruch
01.06.2007, 18:52
...exakt!

Du kannst Variablen auch belöiebei "weiterverrechnen", also z.B. nacheinander

Zeit = Zeit+1
Zeit = Zeit/1000 (dann wären´s Sekunden)
Zeit = Zeit / 60 (oder Minuten)

etc., etc.

Und Timer2=0 solltest Du halt gleich als erstes im Compare-Interrupt machen, dass er halt präzise und ohne Zeitverzögerung weiterzählt.

Veil Spaß beim Experimentieren!!

epos
01.06.2007, 19:16
Vielen Dank!!! probiers gleich aus !