Hallo, ich habe ein Problem mit den Timern des Atmega48. Und zwar benötige ich noch einen Timer um mir z.B. ein eigenes Delay_MS zu bauen. Mein Timer 0 wertet ein Empfangssignal einer RC-Fernsteuerung aus. Dafür wird vom Timer 1 der Input Capture Interrupt genutzt indem bei steigender Flanke TCNT0 = 0 gesetzt wird und bei fallender Flanke der Wert von TCNT0 abgefragt wird. Der Timer 1 läuft im CTC Mode. Den COMPA Interrupt von Timer 1 benutzte ich um für mein BLDC ein korrektes Timing einhalten zu können. Und Timer 2 erzeugt mir eine PWM. Wie kann ich das Delay_MS jetzt realisieren? Vielen Dank. MfG
BLDC schrieb: > können. Und Timer 2 erzeugt mir eine PWM. Wie kann ich das Delay_MS > jetzt realisieren? Welche Überlegungen hast du denn schon dazu angestellt?
BLDC schrieb: > Und Timer 2 erzeugt mir eine PWM. Da hast du es doch schon. Bau in diesen Timer noch ne ISR ein und du hast einen Herzschlag, den du für deine delay Funktion benutzen kannst.
BLDC schrieb: > Dafür wird vom > Timer 1 der Input Capture Interrupt genutzt indem bei steigender Flanke > TCNT0 = 0 gesetzt wird und bei fallender Flanke der Wert von TCNT0 > abgefragt wird. Und warum nutzt du dafuer nicht das Input Capture Register von Timer 1 selber? Kommt der Caputre Interrupt liest du das Register aus und hast einen Wert. Dann schaltest du in der Interruptroutine die Flanke um und wartest auf die andere Flanke. Dann liest du wiederum das Captureregister aus und hast einen 2. Wert. Jetzt schaltets du wieder auf die andere Flanke um. Jetzt hast du 2 Werte. Ziehe die voneinander ab und du hast deine High oder Lowdauer des Signales. Timer 2 kann die neben dem PWM auch noch einen Overflowinterrupt generieren. In dessen Interrupt Handler kannst du deine Delayfunktion realisieren in dem du eine Varaible decrementierst bis auf 0.
Hallo, danke für die Vorschläge. Wie würde sich denn die ISR vom Timer 2 (Overflow Interrupt) verhalten? Nach welcher Zeit wird er aufgerufen? Was passiert mit TCNT2? Mir ist irgendwie unklar bis wohin TCNT2 zählt und wodurch er wieder von vorne anfängt zu zählen. Meine Code für die PWM für Timer 2:
1 | void Timer2_init(void) |
2 | {
|
3 | DDRD |= (1 << PD3); //Timer 2: OC2B |
4 | TCCR2A |= (1 << COM2B1); //Timer 2: Clear on compare Match, set at BOTTOM |
5 | TCCR2A |=(1 << WGM21) | (1 << WGM20); //Timer 2: Fast PWM |
6 | TCCR2B |= (1 << WGM22); //Timer 2: Fast PWM |
7 | TCCR2B |= (1 << CS21); //Timer 2: Prescaler Clock/8 |
8 | OCR2A = 100; //PWM 10kHz da Prescaler Clock/8/100 oder 20kHz da Prescaler Clock/8/50 |
9 | TIFR2 = TIFR2; |
10 | TIMSK2 = (0 << TOIE2); |
11 | }
|
MfG
Du kannst auch zu t1 den timer lesen und zu einem Zeitpunkt t2 die Differenz dt bilden, dt = t2 - t1. Wenn dt grösser ist als deine erwünschte Wartezeit, machst du in deinem Programm weiter. Das setzt natürlich eine erlaubte Ungenauigkeit voraus, z.B. Bedienoberfläche, da kommt es auf ein paar milli Sekunden nicht so an. Thema timer überlauf: siehe Zweierkomplement. Gruß, Bernd
Wie hängen denn OCR2A und OCR2B von TCNT2 ab? Wann beginnt TCNT2 wieder von vorne zu zählen bezogen auf meinen Fall? MfG
BLDC schrieb: > Wie hängen denn OCR2A und OCR2B von TCNT2 ab? Bei TCNT2 = OCR2x schaltet deine PWM. Je nach Einstellung der COM2XX-Bits. > Wann beginnt TCNT2 wieder von vorne zu zählen bezogen auf meinen Fall? Eigentlich gar nicht. Der zählt einfach nur vorwärts. Wenn er bei 255 angekommen ist, ist der nächste Wert 0. Weil 256 nicht ins 8-Bit-Register passt. Es gibt auch PMW-Modes, in denen der TCNT wie im CTC-Mode zurückgesetzt wird. Im Phase-Correct-PWM zählt er sogar vorwärts und rückwärts. Das ist bei dir aber nicht der Fall. mfg.
Also würden bei mir OCR2A und OCR2B keinen Einfluss auf TCNT2 haben. Mein Atmega 48 läuft mit 8MHz / 8 Prescaler = 1MHz => 1us pro Timer zählen d.h. wenn er bis 255 zählt wären 256us um? MfG
BLDC schrieb: > Also würden bei mir OCR2A und OCR2B keinen Einfluss auf TCNT2 > haben. Ja. > Mein Atmega 48 läuft mit 8MHz / 8 Prescaler = 1MHz => 1us pro Timer > zählen d.h. wenn er bis 255 zählt wären 256us um? Nicht ganz. Der Überlauf von 255 auf 0 ist 256. mfg.
Thomas Eckmann schrieb: > Nicht ganz. Der Überlauf von 255 auf 0 ist 256. Allerdings fährt der TE in diesem Fall Timer2 im 'Fast PWM' Mode 7, indem TOP durch OCR2A bestimmt wird. Tabelle 18-8 im Datenblatt zeigt, das TOV2 bei TOP gesetzt wird, indem Fall also bei einem TCNT2 von 100. Ein freigegebener Interrupt für TOV2 würde also mit (F_CPU/8/100) Hz aufgerufen und wäre ein brauchbarer Ticker.
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.