PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : formel für timr0 berechnung gesucht



m_herr
12.01.2006, 20:00
Hallo Leute,

habe das forum schon durchsucht, aber scheinbar finde ich den wald vor lauter bäumen nicht.


habe bei einem mega8 und neuester bascom full-version das problem,
daß irgendwie die zeit nicht stimmt.
jetzt bin ich schon so verzweifwelt,daß ich an meiner formel (aus schlauem buch) für die korrekte zeit zweifle

Const Ticks0 = 63

Config Timer0 = Timer , Prescale = 64

If H_flag = 1 Then
Incr H
End If


Timer0_isr:
Load Timer0 , Ticks0 '0,001sek
H_flag = 1
return

erhöht doch variable H alle 0,001sek, oder?
weil bei
if H=500 then display paar sachen

nicht alle 500ms, sondern so alle 666ms was angezeigt wird (jeweils eine minute gemessen, also kein rechenfehler)

timer und adc sind die einzigen interrupts, kein rs232 und keine versteckten waits oder so rekursion etc....einer ne idee?
ist ein 4mhr extern quarz am mega8 in einem professionellen board.
fuses etc stimmen...

besten dank

PicNick
13.01.2006, 07:45
Die Zahl sollte 62 sein für 1000 HZ. das reset für H_FLAG ?

If H_flag = 1 Then
H_flag = 0 ' fehlt das ?
Incr H
End If

coder_x
13.01.2006, 08:25
Beim Testen von m_herr's Timer-Problem bekam ich folgende Fehlermeldung:
Error: 61 Label not found [Timer_Jump
Der Label erscheint auch nicht im IDE-Fenster
------------------------------------------------------------------------
version 1.11.8.1 / xp
kann das bitte mal einer testen - Danke :-)
------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
Dim H_flag as byte
Dim H as word
Const Ticks0 = 62

Config Timer0 = Timer, Prescale = 64

On Timer0 = Timer_Jump
Enable Timer0
Enable Interrupts
H = 0
H_flag = 1

Do
If H_flag = 1 Then
Incr H
Print H
End If
loop until H = 500
end

Timer_Jump:
Load Timer0 , Ticks0 '0,001sek
H_flag = 1
return

m_herr
13.01.2006, 08:53
If H_flag = 1 Then
Incr H ^
h_flag=0
End If

so die if-anweisung. habe es aus versehen gelöscht...
ich habe 63 genommen, weil meiner formel nach 62.5 rauskommt. hab da einfach aufgerundet....oder ist das schlimm?


habe den quelltext getestet, er findet da das label auch nicht, auch wenn ich den namen ändere...komisch.

PicNick
13.01.2006, 09:58
Was soll das "=" ?
On Timer0 = Timer_Jump
Ich würde schreiben
On Timer0 Timer_Jump

m_herr
13.01.2006, 10:17
wir haben einen gewinner *gg

bleibt nur noch die frage, warum bei mir die tatsächliche zeit zwischen 30% -60% höhe ist als die gewünschte zeit.
warum bei i alle 500ms was auf dem display ausgeben fast 700ms werden...einer ne idee?

PicNick
13.01.2006, 10:52
In dieser Routine brauchst du länger als eine mS, d.h. du verlierst Ticks

If H_flag = 1 Then
H_flag = 0
Incr H
Print H ' bei 9600 braucht 1 Byte ~1 mS
End If
Loop Until H = 500 ' welchen zweck hat das ?

coder_x
13.01.2006, 12:38
@ PicNick
Habe den Timer0 nur einfach so getestet,ohne irgendwelche Zeitmessung.Das mit "Print H" war nur eine Kontrolle, ob Schleife das "H" hoch zählt.
Mein Problem war eigentlich das mit dem "Label-Error"

Trotzdem Danke an Euch!

m_herr
13.01.2006, 17:51
dann wäre das auch geklärt. *g

bei mir gibts kein print oder andere rs232 dinge. also was könnte noch dafür verantworlich sein, daß die gewünschte zeit von der realen abweicht?