Forum: Mikrocontroller und Digitale Elektronik Fragen zum timer interrupt


von Rumkugel (Gast)


Lesenswert?

Hallo Freunde,

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

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

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:

1
ISR (TIMER2_COMP_vect){    
2
  
3
  static unsigned int countTWI = 0;
4
  static unsigned int countLED = 0;
5
6
7
  countTWI++;
8
  countLED++;
9
10
  if(countTWI >= 10000){
11
    TWIreceiveflag = TRUE;  // set flag for TWI data request 
12
    countTWI = 0;
13
  }
14
15
  if(countLED >= 5000){
16
    PORTC ^= (1<<PC5);      // toggle LED (1Hz blinking)
17
    countLED = 0;
18
  }
19
}

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

von Stefan E. (sternst)


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?

von Jim G. (jimg)


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.

von spess53 (Gast)


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

von Rumkugel (Gast)


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.

von Falk B. (falk)


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

von Rumkugel (Gast)


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..

von Rumkugel (Gast)


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

von Karl H. (kbuchegg)


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.

von Rumkugel (Gast)


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.

von Falk B. (falk)


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

von Rumkugel (Gast)


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ß

von Falk B. (falk)


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

von Rumkugel (Gast)


Angehängte Dateien:

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

von Stefan E. (sternst)


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.

von Rumkugel (Gast)


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.

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.