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:
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?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. }
Gruß
mic






Zitieren

Lesezeichen