mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega32 interrupt problem timer0 bascom


Autor: ali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ali (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

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

Autor: ali (Gast)
Datum:

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

Weiß irgendwer Rat?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: ali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.