PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung via 16bit timer



Martinius11
15.09.2010, 21:11
Liebes Forum ich will für meinen Pro-Bot eien Stopwatch wie beim Rp6
programmieren, leider komme ich nicht sehr voran nicht das einfachste programm um Sekunden zu messen Funktioniert.hier mal das Programm es soll erst mal nur mit einer Stopwacht arbeiten. beim Terminal kommt immer nur null raus. Kann mir da jemand helfen ?





$regfile = "m128def.dat"
$framesize = 42
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 19200

Dim Sw1ys As Long
Dim Sw1ms As Long
Dim Sw1s As Word
Dim Sw1m As Byte

Config Timer3 = Timer , Prescale = 8
Timer3 = 63693
On Ovf3 On_ovf3
Enable Ovf3
Enable Interrupts

Sw1ms = Sw1ys / 10
Sw1s = Sw1ms / 100
Sw1m = Sw1s / 60





Do


Print Sw1s


Loop

End

On_ovf3:
Sw1ys = Sw1ys + 1
Return

Sauerbruch
15.09.2010, 22:59
Moin Martinius,

also ich sehe da auf den ersten Blick zwei Fehler:

Erstens musst Du den Befehl Timer3 = 63693 auch in der Timer3-ISR ausführen lassen. Sonst läuft Dir der Timer nur beim ersten mal nach 1 ms über, und ab dann alle ca. 35 ms, weil er nach dem Overflow bei 0 anfängt zu zählen.

Zweitens lässt Du die Variable Sw1s zwar permanent in der Do-Loop-Schleife ausdrucken - berechnet wird sie aber nur ein einziges mal, nämlich vor der Do-Loop-Schleife! Und da sind alle Deine Variablen noch Null. Folglich ändert sich zwar Sw1ys, aber alle anderen Variablen nicht! Die Divisionen müssten also schon in die Do-Loop-Schleife rein.

Gruß,

Daniel

Martinius11
16.09.2010, 14:51
vielen dank jetzt funks.

Besserwessi
16.09.2010, 17:20
Ein Prescaler von nur 8 ist schon recht klein um per Preload im Interrupt eine konstante Frequenz zu erzeugen. Zum einen kommt zu der Berechenten Zeit noch die bis zum neu setzen des Timers dazu, das sind bei BASCON durchauch schon mal rund 50 Zyklen. Dazu kommt noch eine mögliche Schwankung um +-2 Zyklen - wenn man Pech hat liegt man da gerade an der Grenze und es gibt einen Timertick mehr oder weniger.

Besser wäre es hier den CTC Modus des Timers zu nutzen, oder man ließt gleich den Timer aus rechnent dann bei Bedarf vor der Ausgabe um.