mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zum timer interrupt


Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,

ich hab da mal ein paar Fragen zum genauen Timing. Bisher verwende ich 
in etwa sowas (ATmega8, 8MHz):

void timer2_init(){
  TCCR2 |= (1<<CS21)|(1<<WGM21);  // Prescale = 8, CTC Mode
  TIMSK |= (1<<OCIE2);            // enable output compare interrupt
  OCR2 = 100;                     // IRQ every 100us
}

Frage1: Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den 
Interrupt auszulösen?

Wenn ich jetzt mehrere Dinge mit einem Timer steuern möchte, schreibe 
ich meine ISR in etwa so:

ISR (TIMER2_COMP_vect){    
  
  static unsigned int countTWI = 0;
  static unsigned int countLED = 0;


  countTWI++;
  countLED++;

  if(countTWI >= 10000){
    TWIreceiveflag = TRUE;  // set flag for TWI data request 
    countTWI = 0;
  }

  if(countLED >= 5000){
    PORTC ^= (1<<PC5);      // toggle LED (1Hz blinking)
    countLED = 0;
  }
}

Evtl. werden noch mehr Flags gesetzt. Die Aufgaben werden dann in der 
Mainschleife ausgeführt. Dachte bisher eigentlich immer das wäre ein 
ordentlicher Ansatz, aber irgendwie scheint mein Timing ungenau zu sein.
Gibt es vielleicht Verbesserungsvorschläge?
Abweichungen der Quarzfrequenz sollte man doch eigentlich nicht bemerken 
können?
Woran könnte es sonst noch liegen?

Beste Grüße

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rumkugel schrieb:

> Frage1: Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den
> Interrupt auszulösen?

99

> aber irgendwie scheint mein Timing ungenau zu sein.

In welcher Größenordnung denn?

Autor: Jim G. (jimg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne das von anderen µC-typen so, dass die ein Register haben, was 
die voll zählen und wenn dieses voll ist, wird der interrup ausgelöst.

ein Reg hat 255bits... dem nach braucht der µC  max. 32µs um ein 
Interrup auszulösen (zählt von 0-255 bei 8Mio Zählschritten pro 
Sekunde)...

Wie gesagt... anderer µC-typ... (von Siemens... sau teure Teile)


Warum dein Timing ungenau ist... hat du ein Quarz am µC gebaut?
Ohne Quarz wird die Interne Frequenz benutz... und diese ist nicht genau 
8MHz.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den

99.

>Dachte bisher eigentlich immer das wäre ein
>ordentlicher Ansatz, aber irgendwie scheint mein Timing ungenau zu sein.

Woran merkst du das?

>Abweichungen der Quarzfrequenz sollte man doch eigentlich nicht bemerken

Wirklich Quartz? Oder Interner Oszillator.

MfG Spess

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab zweimal denselben Aufbau nebeneinander. Beide mit ATmega8 und 
beide mit 8MHz Quarz. Die Quarze laufen, die LEDs blinken auch mit ca. 
1Hz.
Wenn man allerdings eine Weile hinguckt, bemerkt man wie sich das 
Blinken verschiebt.
Einer groben Überprüfung mit der Stoppuhr konnte eine LED auch nicht 
standhalten. Das scheint mir doch sehr ungenau.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rumkugel (Gast)

>ich hab zweimal denselben Aufbau nebeneinander. Beide mit ATmega8 und
>beide mit 8MHz Quarz. Die Quarze laufen, die LEDs blinken auch mit ca.
>1Hz.

Das kann auch der interne 8MHz RC-Oszillator sein. AVR-Fuses prüfen!

>Wenn man allerdings eine Weile hinguckt, bemerkt man wie sich das
>Blinken verschiebt.

RC-Oszillator.

>Einer groben Überprüfung mit der Stoppuhr konnte eine LED auch nicht
>standhalten. Das scheint mir doch sehr ungenau.

Dito.

MFG
Falk

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich weiß steht der RC-Oszillator beim ATmega8 standardmäßig auf 
1MHz. Mit 1MHz laufen die beiden aber ganz offensichtlich sicher nicht. 
Hab die Fuses trotzdem nochmal überprüft, stehen beide auf Ext. Crystal.
Einer der Aufbauten ist auf einem Breadboard, wenn ich den Quarz dort 
rausziehe bleibt der MC stehen.
Eigentlich hatte ich auf einen Denkfehler im Programm getippt..

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab zwei Aufbauten:
Einer auf einem Development Board, der andere auf einem Breadboard.
Das Timing auf dem Development Board scheint zu stimmen.

Das Breadboard läuft definitiv mit 8MHz Quarz - rausziehen stoppt den 
MC.
OCR2 ist bei beiden auf 99.

Was gibts denn noch so für Gründe?

MfG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rumkugel schrieb:
> Ich hab zwei Aufbauten:
> Einer auf einem Development Board, der andere auf einem Breadboard.
> Das Timing auf dem Development Board scheint zu stimmen.
>
> Das Breadboard läuft definitiv mit 8MHz Quarz - rausziehen stoppt den
> MC.
> OCR2 ist bei beiden auf 99.
>
> Was gibts denn noch so für Gründe?
>
> MfG

Zunhächst mal sollten wir abklären, was für dich grob ungenau bedeutet.
Wenn du ein 1Sek Blinken hast, wieviele Blinker zählst du denn in 1 
Minute, 1 Stunde etc.

AUch Quarze sind nciht genau. Wenn auf deinem Quarz 8Mhz draufsteht, 
bedeutet das nicht, dass er mit exakt 8000000Hz läuft. Da gibt es 
durchaus Abweichungen, auch wenn diese klein sind.

Daher sollten man jetzt erst mal klären, ob deine gemessenen 
Abweichungen in der Größenordnung von typischen Quarzabweichungen liegen 
oder nicht, nachdem sich sonst nichts findet, was die Abweichung 
erklären könnte.

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der eine scheint jetzt, wo OCR2 auf 99 steht, in Ordnung zu sein, 
während der MC auf dem Breakboard pro Minute gut 2 Sekunden zu langsam 
ist.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rumkugel (Gast)

>während der MC auf dem Breakboard pro Minute gut 2 Sekunden zu langsam
>ist.

Das sind ~3%, so falsch kann ein Quarz nicht sein. Klingt nach 
Softwarefehler oder doch RC-Oszillator.

MFG
Falk

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie gesagt, wenn ich den Quarz rausziehe, bleibt der MC stehen.

Nur mal so zum Verständnis nebenbei:
Warum muss OCR2 auf 99?
Mal angenommen, ich wollte jede us einen Interrupt, müsste demnach doch 
OCR2 auf 0, oder nicht? Das ergibt irgendwie keinen Sinn für mich.

Gruß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rumkugel (Gast)

>Warum muss OCR2 auf 99?

Weil der Timer im CTC Modus von 0..99 zählt, macht 100 Takte. Poste mal 
den VOLLSTÄNDIGES Programm als Anhang.

MFG
Falk

Autor: Rumkugel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk

von 0 auf 99 klingt logisch, aber ich frag mich halt wie ich damit auf 
1us käme. 0 auf 0 wird wohl nicht funktionieren, oder?

Ok, ich hab mal meinen Code eingefügt. Das meiste wird für das Problem 
irrelevant sein. Ich habe 2 Dateien weggelassen in denen nur Code fürs 
TWI steht.
Die Zeitverschiebung habe ich anhand einer 7-Segment Anzeige bestimmt, 
weil es damit doch etwas leichter war als die Diode zu zählen.

MfG

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rumkugel schrieb:

> von 0 auf 99 klingt logisch, aber ich frag mich halt wie ich damit auf
> 1us käme. 0 auf 0 wird wohl nicht funktionieren, oder?

Doch, theoretisch schon. Praktisch scheitert es am Prescaler, denn 8 
Takte wären selbst für einen leeren Interrupt zu wenig. Aber mit einem 
Prescaler von 64 und einem OCR-Wert von 0 hättest du einen Interrupt 
alle 64 Takte.

Autor: Rumkugel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank für den Hinweis, Stefan, damit bin ich der Wahrheit schonmal 
ein kleines Stück näher gekommen..
Bleibt nur noch die Frage, wie mein Quarz oder was auch immer so weit 
daneben liegen kann.

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.