Forum: Mikrocontroller und Digitale Elektronik mega32 interrupt problem timer0 bascom


von ali (Gast)


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?

von ali (Gast)


Lesenswert?

Nachtrag:

Habe jetzt anstatt den Timer0 den Timer2 verwendet und jetzt 
funktioniert es. Hat wohl irgendein-Problem mit UART oder so...

von ali (Gast)


Lesenswert?

Erneuter Nachtrag:
nachdem für ungefähr eine Stunde der Strom wegwar funktioniert es egal 
mit welchem Timer nicht.

Weiß irgendwer Rat?

von spess53 (Gast)


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

von Oliver (Gast)


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

von ali (Gast)


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.

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Korrektur: 'von fast 2 Timer-Overflows' -> 'von fast 1 Timer-Overflow'
War ein Denkfehler.

MfG Spess

von ali (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

Kann ich nicht sagen, da ich AVRs ausschließlich in Assembler 
programmiere.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.