Hallo Leute, irgendwie steh ich hier wie ein Ochse vorm Berg und komme einfach nicht dahinter, wie der Timer Modus 5 + 7 beim Atmega328 ablaufen soll. Die anderen Modi sind mir absolut klar und einleuchtend. Aber laut Datenblatt ist im Mode 7 z. B. bei Timer2 OCR2A das Maximum. Jetzt zähle ich bis zu diesem Wert hoch, erhalte einen Compare Match, toggel den Pin und beginne von vorn. Dann erhalte ich doch immer nur ein Tastverhältnis von 50:50 mit unterschiedlicher Frequenz, denn die Zeiten 0 bis OCR2A sind ja immer gleich. Klar, ich kann sie ändern, aber das wäre ja extrem umständlich, bei jedem Zählertakt einen neuen Wert ins OCR2A zu schreiben. Im Mode 1 ist es logisch, da wird die Einschaltzeit (im nicht invertierenden Modus) ja durch 0 bis OCR2A bestimmt und die Ausschaltzeit durch OCR2A bis MAXIMUM (0xff). Ich hatte auch schon vermutet, dass OCR2B noch mit ins Spiel kommt, aber ich finde im Datenblatt nichts entsprechendes. Die Modi sind zwar prinzipiell erklärt, aber im Detail ja nur für die Nutzung von 0xFF als Maximum. Könnte mir hier mal jemand bitte auf die Sprünge helfen?
:
Bearbeitet durch User
OCR2A bestimmt die PWM Frequenz. Du hast vielleicht übersehen, dass Dir immer noch das OCR2B Register übrig bleibt, um die Pulsbreite festzulegen. Die Beschreibung der Modi sagt nur, dass die Pulsbreite vom OCR Register bestimmt wird. Damit sind prinzipiell beide gemeint, aber in den Modi 5 und 7 ist OCR2A schon für die Festlegung von TOP reserviert.
Hallo Stefanus, herzlichen Dank für die schnelle Antwort. Wie ich in meiner Frage schrieb, hatte ich das auch vermutet, aber ich habe nirgendwo einen konkreten Hinweis im Datenblatt darauf gefunden. Wenn ich OCRA als TOP Wert nutze und OCRB als Vergleichsregister, gehe ich dann recht in der Annahem, dass ich nur Pin OC2B nutzen kann und OC2A nicht verfügbar ist?
Werner B. schrieb: > Wenn ich OCRA als TOP Wert nutze und OCRB als Vergleichsregister, gehe > ich dann recht in der Annahem, dass ich nur Pin OC2B nutzen kann und > OC2A nicht verfügbar ist? Ja, so verstehe ich das Datenblatt jedenfalls. Ich habe diese Modi noch nicht ausprobiert.
Hallo, fast alle Timer Modi bieten für das TOP-Wert Register entweder ICRn oder OCRnA an. Timer 2 nun ausgerechnet nur OCR2A. Abgesehen von den anderen. Da TOP das Frequenz bestimmte Register ist, kann man damit weniger anstellen. Aber ganz unnütz ist es auch nicht. Man kann den Compare Match einschalten und irgendeinen Pin in dessen ISR zum Bsp. toggeln lassen. Damit hat dieser Pin die halbe Taktfrequenz vom eigentlichen PWM Takt der auf OCR2B abläuft. Bsp. auf Mega2560 getestet
1 | /*
|
2 | Arduino Mega2560 (16MHz)
|
3 |
|
4 | Timer 2: Phase Correct, Mode 5
|
5 | TOP: OCR2A (Takt-Frequenz)
|
6 | Pulsweite: OCR2B (<= TOP)
|
7 | */
|
8 | |
9 | |
10 | int main(void) { |
11 | |
12 | DDRB = (1<<4); |
13 | DDRH = (1<<6); |
14 | set_Timer2(); |
15 | |
16 | while(1) { |
17 | |
18 | }
|
19 | }
|
20 | |
21 | |
22 | // ****** Funktionen ******* //
|
23 | |
24 | void set_Timer2() // Phase Correct, Mode 5 |
25 | {
|
26 | cli(); |
27 | TIMSK2 = (1<<OCIE2A); // Compare Match A |
28 | TCNT2 = 0; // Reset Start-Counter |
29 | TCCR2A = (1<<COM2B1) | (1<<WGM20); // non invert, set Mode |
30 | TCCR2B = (1<<CS21) | (1<<WGM22); // Prescaler 8 |
31 | OCR2A = 128; // TOP, zusammen mit Prescaler 8 >> 7,8kHz |
32 | OCR2B = 32; // Pulsweite 25% |
33 | sei(); |
34 | }
|
35 | |
36 | |
37 | ISR(TIMER2_COMPA_vect) { // Timer 2 Interrupt |
38 | PINB = _BV(PB4); // 3,9kHz |
39 | }
|
Veit D. schrieb: > fast alle Timer Modi bieten für das TOP-Wert Register entweder ICRn oder > OCRnA an. Das ist natürlich nur bei bei Timern so, die überhaupt über ein ICR-Register verfügen. > Timer 2 nun ausgerechnet nur OCR2A. Der hat halt dieses Register typischerweise garnicht. Timer0 übrigens meist ebenfalls nicht. Der Normalfall ist: ICR gibt's nur bei den 16Bit-Timern. Bei einigen Tiny-Exoten gibts allerdings was ähnliches bei 8Bit-Timern: OCRnC. Bezüglich der Beschränkung des Zählumfangs zu verwenden wie ICR bei den 16Bit-Timern, aber eine Input Capture Funktionalität ist halt nicht vorhanden. Dafür kann bei unbeschränktem Zählumfang damit ein dritter PWM-Kanal bereitgestellt werden, was wiederum mit den ICP-Dingern nicht geht. Letztlich sind das alles aber Details, die man einfach dem DB entnehmen kann. > Da TOP das Frequenz bestimmte Register ist, kann man damit weniger > anstellen. Aber ganz unnütz ist es auch nicht. Man kann den Compare > Match einschalten Nicht wirklich ein nützliches Feature. Denn der OVF-Interrupt steht ja ebenfalls zur Verfügung und wird im gleichen Moment ausgelöst (oder maximal einen Timertakt früher oder später, das weiß ich jetzt nicht so genau und bin zu faul zum Nachschlagen).
Es steht jedem frei meinen Text im Gesamten zu betrachten. Wenn man ihn zerpflückt kann man natürlich alles zerreißen und umdrehen was man möchte. Ist nicht schön. Ergänzen und noch mehr Möglichkeiten aufzeigen wäre besser gewesen.
Veit D. schrieb: > Ergänzen und noch mehr Möglichkeiten aufzeigen > wäre besser gewesen. Mich deucht, genau das hätte ich getan... Kannst du nicht lesen?
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.