Forum: Mikrocontroller und Digitale Elektronik Interrupt von Timer2 alle Millisekunden


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Ich muß den Timer2 benutzen, um einen Interrupt alle Millisekunden (oder 
so) aufzulösen.
Timer1 wird schon für PWM benutzt, und ich brauche unbedingt einen 
anderen Timer.

Leider klappt es nicht. Egal was ich schreibe, die Interrupt sind immer 
sehr unregelmäßig (das merke ich, weil ich, anhand diesen Timer ein LED 
blinken lasse).

Hat jemand ein Beispiel, wie ich es machen kann?

Grüße
Luca Bertoncello

von TestX .. (xaos)


Lesenswert?

poste dochmal deinen kompletten code (als anhang wenn länger als 20 
zeilen)
ohne controllertyp etc kann dir eh niemand helfen..

von Luca B. (lucabert)


Lesenswert?

Andi D. schrieb:
> poste dochmal deinen kompletten code (als anhang wenn länger als 20
> zeilen)
> ohne controllertyp etc kann dir eh niemand helfen..
1
#define IRQS_PER_SECOND   1000   /* 1 ms */
2
3
  // Timer2: keine PWM
4
  TCCR2 = 0;
5
6
  // Timer2 ist Zähler: Clear Timer on Compare Match (CTC, Mode #4)
7
  // Timer2 läuft mit vollem MCU-Takt: Prescale = 1
8
  TCCR2 = (1 << WGM21) | (0 << WGM20) | (0 << COM21) | (1 << COM20) | (1 << CS21);
9
10
  // OutputCompare für gewünschte Timer1 Frequenz
11
  // TCNT2 zählt immer 0...OCR2, 0...OCR2, ...
12
  // Beim überlauf OCR2 -> OCR2+1 wird TCNT2=0 gesetzt und im nächsten
13
  // MCU-Takt eine IRQ erzeugt.
14
  OCR2 = (unsigned short) ((unsigned long) (F_CPU / IRQS_PER_SECOND -1));

Danke
Luca Bertoncello

von Karl H. (kbuchegg)


Lesenswert?

Luca Bertoncello schrieb:

> Ich muß den Timer2 benutzen, um einen Interrupt alle Millisekunden (oder
> so) aufzulösen.
> Timer1 wird schon für PWM benutzt, und ich brauche unbedingt einen
> anderen Timer.

Macht ja nichts.
Niemand sagt, dass man einen Timer nur für eine Aufgabe benutzen kann.
Wenn es eine sinnvolle Möglichkeit gibt, aus der PWM Frequenz auf deine 
Blinkfrequenz mit einem Software-Teiler zu kommen, stellt das ja keinen 
Widerspruch dar.

> Leider klappt es nicht. Egal was ich schreibe, die Interrupt sind immer
> sehr unregelmäßig (das merke ich, weil ich, anhand diesen Timer ein LED
> blinken lasse).

Was heist 'sehr unregelmässig'
Ein paar µs Versatz wirst du haben, aber ich bezweifle, dass du das mit 
freiem Auge sehen kannst.

> Hat jemand ein Beispiel, wie ich es machen kann?

Zeig doch mal deines (aber komplett!)
Bei den von dir geschilderten Symptomen ist da höchst wahrscheinlich 
ganz was anderes faul. Ich denke da in irgendwelche _delays während 
deren die Interrupts abgeschaltet sind oder dergleichen.

von Karl H. (kbuchegg)


Lesenswert?

Hmm

 OCR2 = (unsigned short) ((unsigned long) (F_CPU / IRQS_PER_SECOND -1));

Welchen Prozessor benutzt du?

Bei allen Prozessoren die ich kenne (das sind allerdings nicht viele), 
ist der Timer 2 ein 8 Bit Timer

   1 Mhz / 1000 (Aufrufe pro Sekunde)   ->  einen OCR Wert von 1000

das passt nicht in ein 8 Bit Register.


Aber das erklärt noch nicht dein unregelmässiges Blinken.

von Luca B. (lucabert)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hmm
>
>  OCR2 = (unsigned short) ((unsigned long) (F_CPU / IRQS_PER_SECOND -1));
>
> Welchen Prozessor benutzt du?
>
> Bei allen Prozessoren die ich kenne (das sind allerdings nicht viele),
> ist der Timer 2 ein 8 Bit Timer
>
>    1 Mhz / 1000 (Aufrufe pro Sekunde)   ->  einen OCR Wert von 1000
>
> das passt nicht in ein 8 Bit Register.
>
>
> Aber das erklärt noch nicht dein unregelmässiges Blinken.

Ach! Ich nutze einen ATMega8 mit 16MHz Takt.

Was soll ich dann schreiben?

Danke
Luca Bertoncello

von spess53 (Gast)


Lesenswert?

Hi

Wenn es etwa eine ms sein kann: Prescaler auf 64. Ergibt alle 1,02ms 
einen Overflow.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Luca Bertoncello schrieb:

> Ach! Ich nutze einen ATMega8 mit 16MHz Takt.
>
> Was soll ich dann schreiben?

Du sollst vor allen Dingen ein wenig rechnen! Und zwar eigenständig!

Wenn dein Timer in 1 Sekunde 16 Millionen Zählvorgänge machen kann, wie 
weit muss er dann zählen bis 1 Millisekunde vorbei ist?

Passt dieses Ergebnis in ein 8 Bit Register (0 bis 255)
Nein.

Also ein Vorteiler von 8. Der Timer kann dann in 1 Sekunde nur noch bis 
16000000 / Vorteiler (also 8) = 2 Millionen zählen.
Wieder: Bis zu welcher Zahl x musst du ihn zählen lassen, damit er dazu 
genau 1 Millisekunde braucht?

Und so weiter. Du probierst alle Vorteiler, vom kleinsten bis zum 
größten durch, bis du ein Ergebnis erhälts, das mit 8 Bit möglich ist.


Aber nochmal.
Das erklärt NICHT dein unregelmässiges Blinken.
Die Ursache dafür kann man erst ergründen, wenn man den kompletten Code 
kennt.

von H.Joachim S. (crazyhorse)


Lesenswert?

wird wohl an einer anderen (unschönen) ISR liegen...

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.