So hier ist nun mein Programm:
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);
}
}
}
Das Programm läuft erstmal so wie ich es möchte.
EDIT: Kommentare aus dem Code überarbeitet
Lesezeichen