Kann nicht auf schnellen PWM-OCRA-Modus eingestellt werden

Der Versuch, den schnellen PWM-Modus zu haben, wenn TOP == ORCA.

Funktioniert gut mit OCAUmschalten (Messen der korrekten Frequenz), funktioniert jedoch nicht im nicht invertierenden Modus.

cli();

// Fast PWM Mode 
TCCR2A = 0;
TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1); // Inverting mode fails
//TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A1); // Non-Inverting mode fails
//TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A0); // Toggle mode OK

// Prescaler set to 1024 (p.162)
TCCR2B = 0;
TCCR2B |= _BV(CS20) | _BV(CS21) | _BV(CS22) | _BV(WGM22);

// Enable interrupt on counter match
TIMSK2 |= _BV(OCIE2A);

OCR2A = 127;

sei();

Update mit weiteren Informationen:

MCU=Atmega328. Im nicht invertierenden Modus habe ich gerade eine konstante 1 am Ausgang erhalten und der invertierende Modus ergibt eine logische 0. Ich hatte erwartet, die Frequenz zu sehen

F = 16 10 6 / ( 1024 127 ) = 123 H z

Was genau passiert, wenn es „nicht geht“? Welche MCU ist das? Und was war das von Ihnen erwartete Verhalten? Die Frage braucht bitte etwas Klarheit.
Entschuldigung, aktualisiert mit Klarstellungen.
Erwähnenswert ist, dass der schnelle PWM-Modus (0xFF) gut funktioniert (WGM22 = 0).

Antworten (2)

Ich werde mir selbst antworten. OC2A-Pin erzeugt keine Frequenz, da OCR2A damit beschäftigt ist, den TOP-Wert zu halten. Es kann entweder den TOP-Wert enthalten oder den Vergleichswert ausgeben. Also sollte ich OCR2B verwenden.

Versuchen Sie Folgendes, um Ihr Controller-Problem zu lösen:

Ich habe gerade das Quellcodebeispiel von verwendet

http://www.electronicsplanet.ch/mikrocontroller/avrcodesammlung/atmega16timer0fastpwm.htm

und es hat funktioniert. Aber dank deiner Erklärungen verstehe ich, warum es funktioniert ;-)