mega32 interrupt problem timer0 bascom

Gast #947754
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
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
>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
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.