PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt abhängig von PWM statt PWM-Periode



ricola
17.01.2008, 11: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

oberallgeier
17.01.2008, 12:06
Meinen mega168 hatte ich bei der Initialisierung der PWM mit


TIMSK1 |= (1<<TOIE1);
programmiert. Dabei kam, unabhängig von der PWM, ein Interrupt - den ich allerdings nicht wollte. Ich musste ihn daher bei der PWM-Initialisierung explizit verbieten:
TIMSK1 &= ~(1<<TOIE1);
Vielleicht ist das auch DEIN Weg?

Gock
17.01.2008, 13:54
Du hast den "OutputCompareInterrupt1A" aktiviert anstelle des auch schon von Joe erwähnten TimerOverflowInterruptEnable".
Daher gibts einen IRQ immer dann, wenn der Zähler den von Dir in OCR1A angegebenen Wert erreicht, anstatt dann, wenn der Zähler überläuft.
Gruß