ricola
17.01.2008, 12:51
Hallo,
ich benutze an meinem ATmega169 alle 4 PWM Kanäle, daher
kann ich leider keinen weiteren timer nutzen. Ich möchte nun
aber zu einer festen Periode Aktionen durchführen, dazu wollte
ich die Periodendauer des PWM nutzen, die ja konstant sein sollte
und vom aktuellen Wert des PWM unabhängig ist. Leider ist es nun
so, dass meine dadurch gesteuerte LED immer in unterschiedlichen
Perioden blinkt, wenn ich den PWM-Wert verändere. Was mache ich
falsch???
Wie gesagt, ich möchte einen Interrupt zum Ende einer PWM Periode
und nicht dann, wenn die Flanke kommt.
SIGNAL (SIG_OUTPUT_COMPARE1A) {
// count for 100ms routine
ui_interruptCounter0++;
if (ui_interruptCounter0 > TIME_100_MS) {
timer100ms();
ui_interruptCounter0 = 0;
}
}
static void initPWM(void) {
// init pwm timer
// 8bit timer/counter 0
TCCR0A = (1<<WGM00)|(1<<COM0A1)|(1<<CS01);
// set initial pwm
OCR0A = 200;
// 16bit timer/counter 1
TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = (1<<CS10);
// set initial pwm
OCR1A = 200;
OCR1B = 200;
// 8bit timer/counter 2
TCCR2A = (1<<WGM20)|(1<<COM2A1)|(1<<CS21);
// set initial pwm
OCR2A = 200;
}
static void initInterrupt(void) {
// switch interrupt on
TIMSK1 |= (1<<OCIE1A);
// enable interrupts
sei();
}
timer100ms() {
// control LED
}
Danke und Gruß
RICOLA
ich benutze an meinem ATmega169 alle 4 PWM Kanäle, daher
kann ich leider keinen weiteren timer nutzen. Ich möchte nun
aber zu einer festen Periode Aktionen durchführen, dazu wollte
ich die Periodendauer des PWM nutzen, die ja konstant sein sollte
und vom aktuellen Wert des PWM unabhängig ist. Leider ist es nun
so, dass meine dadurch gesteuerte LED immer in unterschiedlichen
Perioden blinkt, wenn ich den PWM-Wert verändere. Was mache ich
falsch???
Wie gesagt, ich möchte einen Interrupt zum Ende einer PWM Periode
und nicht dann, wenn die Flanke kommt.
SIGNAL (SIG_OUTPUT_COMPARE1A) {
// count for 100ms routine
ui_interruptCounter0++;
if (ui_interruptCounter0 > TIME_100_MS) {
timer100ms();
ui_interruptCounter0 = 0;
}
}
static void initPWM(void) {
// init pwm timer
// 8bit timer/counter 0
TCCR0A = (1<<WGM00)|(1<<COM0A1)|(1<<CS01);
// set initial pwm
OCR0A = 200;
// 16bit timer/counter 1
TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = (1<<CS10);
// set initial pwm
OCR1A = 200;
OCR1B = 200;
// 8bit timer/counter 2
TCCR2A = (1<<WGM20)|(1<<COM2A1)|(1<<CS21);
// set initial pwm
OCR2A = 200;
}
static void initInterrupt(void) {
// switch interrupt on
TIMSK1 |= (1<<OCIE1A);
// enable interrupts
sei();
}
timer100ms() {
// control LED
}
Danke und Gruß
RICOLA