Gast
#1645958
Hallo zusammen, wollte endlich mal ein bisschen mit dem Timer-Interrupt arbeiten und wie das Schicksal es will kommt nichts aus dem AVR. Es soll eine PWM über 9 invetierte Kanäle erreicht werden mit 16 verschiedenen Helligkeitstufen für LEDs. Hab schon heraus gefunden, dass der Mega48 einen komplexeren Aufbau für die Timer hat als der 8 oder 16er und trotz vieler Veränderungen funktioniert es nicht! #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #include <avr/interrupt.h> uint8_t red1,green1,blue1; uint8_t red2,green2,blue2; uint8_t red3,green3,blue3; volatile uint8_t i_pwm; int main(void) { DDRD = 0xFF; // Port D Ausgänge DDRB = 0xFF; //PB0 Ausgang PORTD = 0xFF; // auf EINS PORTB |= (1<<PB0); //Timer0 einstellen TCCR0A=0x00; TCCR0B =(1<<CS01)|(1<<CS00); //Vorteiler 64 -> 1225Hz TCNT0=0x00; TIMSK0|=(1<<TOIE0); //Timer0-Interrupt freischalten sei(); while(1) { //PWM Test for (uint8_t i=0;i<17;i++) { red1=i; green2=i; blue3=i; _delay_ms(50); } for (uint8_t i=17;i>0;i--) { red1=i-1; green2=i-1; blue3=i-1; _delay_ms(50); } } } ISR(TIMER0_OVF_vect) { i_pwm++; if(i_pwm>15) i_pwm=0; if(red1>i_pwm) PORTD &= ~(1<<PD2); else PORTD |= (1<<PD2); if(green1>i_pwm) PORTD &= ~(1<<PD1); else PORTD |= (1<<PD1); if(blue1>i_pwm) PORTD &= ~(1<<PD0); else PORTD |= (1<<PD0); if(red2>i_pwm) PORTD &= ~(1<<PD5); else PORTD |= (1<<PD5); if(green2>i_pwm) PORTD &= ~(1<<PD4); else PORTD |= (1<<PD4); if(blue2>i_pwm) PORTD &= ~(1<<PD3); else PORTD |= (1<<PD3); if(red3>i_pwm) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0); if(green3>i_pwm) PORTD &= ~(1<<PD7); else PORTD |= (1<<PD7); if(blue3>i_pwm) PORTD &= ~(1<<PD6); else PORTD |= (1<<PD6); } Weiß nicht mehr was daran falsch ist und bin über jede Hilfe Dankbar. Gruß Winni