Der Versuch, den schnellen PWM-Modus zu haben, wenn TOP == ORCA
.
Funktioniert gut mit OCA
Umschalten (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
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 ;-)
Anindo Ghosh
Pablo
Pablo