Forum: Mikrocontroller und Digitale Elektronik Atmega328 Timer Mode 5 + 7


von Werner B. (cyrano1960)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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.

von Werner B. (cyrano1960)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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
}

von c-hater (Gast)


Lesenswert?

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).

von Veit D. (devil-elec)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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?

von Veit D. (devil-elec)


Lesenswert?

ja okay, hatte es falsch verstanden, alles gut

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.