www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt von Timer2 alle Millisekunden


Autor: Luca Bertoncello (lucabert)
Datum:

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

Autor: Andi ... (xaos)
Datum:

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

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht 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..
#define IRQS_PER_SECOND   1000   /* 1 ms */

  // Timer2: keine PWM
  TCCR2 = 0;

  // Timer2 ist Zähler: Clear Timer on Compare Match (CTC, Mode #4)
  // Timer2 läuft mit vollem MCU-Takt: Prescale = 1
  TCCR2 = (1 << WGM21) | (0 << WGM20) | (0 << COM21) | (1 << COM20) | (1 << CS21);

  // OutputCompare für gewünschte Timer1 Frequenz
  // TCNT2 zählt immer 0...OCR2, 0...OCR2, ...
  // Beim überlauf OCR2 -> OCR2+1 wird TCNT2=0 gesetzt und im nächsten
  // MCU-Takt eine IRQ erzeugt.
  OCR2 = (unsigned short) ((unsigned long) (F_CPU / IRQS_PER_SECOND -1));

Danke
Luca Bertoncello

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

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

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

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

Autor: Luca Bertoncello (lucabert)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

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

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird wohl an einer anderen (unschönen) ISR liegen...

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.