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
poste dochmal deinen kompletten code (als anhang wenn länger als 20 zeilen) ohne controllertyp etc kann dir eh niemand helfen..
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
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.
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.
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
Hi Wenn es etwa eine ms sein kann: Prescaler auf 64. Ergibt alle 1,02ms einen Overflow. MfG Spess
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.