Hi Leuts, ich habe hier einen Mega16 mit 8 MHz und versuche mich gerade
an PWM.
Nun habe ich folgenden Code:
int main()
{
DDRB = 0xff;
DDRD = 0xff;
TCCR0 = (1<<CS00) | (1<<WGM00) | (1<<WGM01) | (1<<COM01);
OCR0=50;
TCCR1A |=(1<<COM1A1) | // Clear OC1A on Compare Match
(1<<WGM10)|(1<<WGM11)| // 10bit, Fast PWM
(1<<WGM12) |
(1<<CS10); // No Prescaler
OCR1A=50;
for (;;)
{
;
}
}
PWM vom Timer0 funktioniert, an OC0 (PB3) habe ich ein PWM Signal.
PWM mit Timer1 funzt nicht, an OC1A (PD5) habe ich nichts.
Was mache ich falsch ?
Die Clock-Select Bits und Teile der WGM Bits sind nicht in Register TCCR1A, sondern in TCCR1B. TCCR1B wird im Code nicht gesetzt, der Timer ist also abgeschaltet. Grüße, Peter
Stimmt, danke dass Du mir das Brett weggenommen hast :-)
Anyway, jetzt krieg ich Timer2 nicht zum Laufen (PWM und ich soll wohl
nicht sein).
Ich möchte einfach nur, dass Timer2 alle 1ms einen CTC-Interrupt aufruft
(Timer0 funzt):
#include <avr/io.h>
#include <avr/interrupt.h>
int main()
{
DDRB = 0xff;
DDRD = 0xff;
// Timer 0 konfigurieren:
// Fast PWM
TCCR0=0;
TCCR0 |= ((1<<WGM01)|(1<<WGM00));
// Clear OC0 on compare
TCCR0 |= (1<<COM01);
// Systemtakt
TCCR0 |= (1<<CS00);
// CTC-Vergleichswert
OCR0 = 200-1;
/////////////////////////////////////////////////////////
// Timer 2 konfigurieren
// alle 1 ms wird ein CompareMatch-Interrupt ausgeloest
TCCR2 = 0;
// CTC-Modus einstellen
TCCR2 |= (1<<WGM21);
// Prescaler 64
TCCR2 |= (1<<CS22);
// CompareMatch-Interrupt aktivieren
TIMSK |= (1<<OCIE2);
// OCR-Register laden
OCR2 = 125;
//////////////////////////////////////////////////////
sei();
for (;;)
{
}
}
// CompareMatch-Interrupt Timer 2
// wird im 1 ms Takt aufgerufen
ISR(TIMER2_COMP_vect)
{
PORTB ^= (1<<PB1);
}
Der Timer2 sollte mit dieser Konfiguration eigentlich funktionieren. Ich würde das mal im Simulator ausprobieren (Breakpoint in den Interrupt setzen). Grüße, Peter
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.