Hallo
Ich würde das weiterhin mit Soft-PWM lösen. Irgendein Timer läuft ja eh meist schon mit, da muss man dann nur noch seine eigene Funktion einklinken:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#define led1_init DDRD |= (1<<PD2) // LEDs an PD2 und PD3
#define led1_on PORTD |= (1<<PD2)
#define led1_off PORTD &= ~(1<<PD2)
#define led2_init DDRD |= (1<<PD3)
#define led2_on PORTD |= (1<<PD3)
#define led2_off PORTD &= ~(1<<PD3)
volatile unsigned char p=0;
volatile unsigned char led1_pwm=0, led2_pwm=0;
void pause_ms(unsigned int dauer)
{
while(dauer--)
{
p=36;
while(p); // p wird in der ISR runtergezählt
}
}
int main(void)
{
cli();
// Timer2: FastPWM, no prescaling, no OC2-Pin
TCCR2 = (1 << WGM20) | (1 << WGM21) | (0 << COM20) | (0 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2);
led1_init;
led2_init;
sei();
while(1)
{
led1_pwm+=15;
if(led2_pwm) led2_pwm /=2; else led2_pwm=255;
pause_ms(500);
}
return(0);
}
SIGNAL (SIG_OVERFLOW2)
{
static char led_pwm=0;
TCNT2 += 0x25; // Frequenzkorrektur 36kHz
if(led_pwm)
{
if(led_pwm>led1_pwm) led1_off;
if(led_pwm>led2_pwm) led2_off;
}
else
{
if(led1_pwm) led1_on;
if(led2_pwm) led2_on;
}
led_pwm++;
if(p) p--; // 1/36000 Sek.
}
Für einen 8MHz-Mega8 auf Basis der 36kHz des Timer2 (aus der asuro-Lib). Soll das nun ein Mega8 oder ein Mega32 werden? Oder gar der RP6?
Gruß
mic
Lesezeichen