mega32 interrupt problem timer0 bascom

Gast #947754
Lesenswert?

Hi,
ich habe ein Problem mit meinem Mega32: Ich benutze Timer0 um mir eine 
genaue Zeit zu erzeugen während der ein Pin auf 1 sein soll. Habe einen 
14.7456 MHz Quarz. Timer0 hat einen Prescaler von 64. Da der Timer alle 
256 Schritte überläuft, und ich in der ISR eine Variable bis 90 
hochzähle entspricht das genau 100ms. Während dieser 100ms sollen nun 
die Impulse einer Frequenz gezählt werden. Hierzu habe ich einen 
externen Zählerbaustein den ich nach diesen 100ms auslese. Über ein 
UND-Gatter wird dafür gesorgt, dass keine Impulse mehr in den Zähler 
laufen wenn der Pin nicht auf 1 ist.

Das Problem ist folgendes:

mit diesem Code (BASCOM):

Torzeit = 1
Waitms 100
Torzeit = 0

funktioniert das Ganze sehr gut (Zähler verzählt sich + - 1 ist aber 
normal)


Benutze ich Timer0 um mir die 100ms zu erzeugen verzählt sich mein 
Zähler teilweise um bis zu 50 Stellen. Benutze dabei folgenden Code:
...
 Torzeit = 1
 Start Timer0

 Do
  If Tor_over = 1 Then Exit Do
 Loop
...

und die Timer0 ISR:

Timer0_isr:
 Incr Tor_zaehler
 If Tor_zaehler = 90 Then
  Torzeit = 0
  Tor_zaehler = 0
  Tor_over = 1
  Stop Timer0
 End If
Return

Eigentlich müsste die Zeitberechnung über den Timer des Mega32 doch 
wesentlich genauer funktionieren als der Waitms-Befehl oder?

Weiß irgendjemand woran das liegen könnte?
Gast #947964
Lesenswert?

Hi

Wie hoch ist denn deine zu messende Frequenz?

Ich würde darauf tippen, das der Fehler durch die Laufzeit der Befehle 
zwischen 'Torzeit=1' und 'Torzeit=0' + Zeit für ISR-Ansprung resultiert.
Wer weiss, was BASCOM für Code daraus produziert.

MfG Spess
Gast #947967
Lesenswert?

>Eigentlich müsste die Zeitberechnung über den Timer des Mega32 doch
>wesentlich genauer funktionieren als der Waitms-Befehl oder?

Warum? Beide ermitteln im Endeffekt die Zeit durch Abzählen einer vorher 
festgelegten Anzahl Taktzyklen.

Zum Rest kann ich nichts sagen - ich spreche kein Bascom.

Oliver
Gast #947981
Lesenswert?

es ist egal ob meine frequenz 10kHz oder 10MHz beträgt. Es ist mit ISR 
immer ein Fehler teilweise bis +-50 und mit waitms nur ein fehler +-1

zum thema genauigkeit: der waitms befehl wird durch andere interrupts 
unterbrochen und wird so ungenauer.
Gast #948015
Lesenswert?

Hi

Weisst du, was 'Start Timer0' wirklich macht? Für ein genaues Timing ist 
es notwendig den Timer und den Vorteiler auf 0 zu setzen und den Timer 
zu Starten. Wenn das nicht so gemacht wird kann im Extremfall ein Fehler 
von fast 2 Timer-Overflows entstehen.
Abgesehen davon, halte ich BASCOM wegen seiner rudimentären Nutzung der 
Hardwareressourcen und dem nicht kalkulierbaren Laufzeitverhalten 
ungeeignet für zeitkritische Anwendungen.

MfG Spess
Gast #948075
Lesenswert?

danke spess53, wenn ich nicht start timer0 und config timer0 verwende 
sondern die register direkt beschreibe geht es jetzt.

wie sieht es denn mit dem laufzeitverhalten in c aus (also 
beispielsweise avr-studio) ist es da besser?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren