So hier ist nun mein Programm:
Das Programm läuft erstmal so wie ich es möchte.Code:#include <avr/io.h> #include <util/delay.h> //Warteschleife für die Demo-Ausgabe. Für die eigentliche PWM nicht benötigt! int main() { // PWM-Beispiel für Mega168 mit dem Timer2 // 1. Den Prescaler einstellen, der die Frequenz festlegt TCCR2B |= (1<<CS22); //Prescaler 256 // 2. Den Timer in den Fast PWM Mode, 8 Bit schalten TCCR2A |= (1<<WGM20); TCCR2A |= (1<<WGM21); // 3. Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. Ergibt nichtinvertierte PWM. TCCR2A |= (1<<COM2B1); // In diesen Registern wird der gwünschte PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255. OCR2B = 255; // 4. Zuletzt den Pin als Ausgang konfigurieren. Erst jetzt liegt das PWM-Signal an dem Pin an! DDRD |= (1<<PD3); /*Nun ist der PWM-Modus aktiv! Der Ausgangswert kann nun über das Register OCR2B vorgegeben werden. Man könnte ihnen per define noch einen Zweitnamen verpassen, zb */ #define LED OCR2B LED = 0; /*PWM-Demo: Die PWM-Werte werden erst bis zum Maximalwert erhöht und dann wieder verringert. Eine angeschlossene LED wird langsam heller und wird dann wieder verdunkelt*/ uint8_t wert; while(1) { for (wert=0; wert<255; wert++) { OCR2B = wert; _delay_ms(20); } for (wert=255; wert>0; wert--) { OCR2B = wert; _delay_ms(20); } } }
EDIT: Kommentare aus dem Code überarbeitet







Zitieren

Lesezeichen