Gast
#351657
Hallo zusammen! Ich moechte eine LED mittels SW-PWM (habe nicht genug Timer fuer nur HW-PWMs dimmen. Mittels Tastern kann man den Vergleichswert vergroessern oder verkleinern, was bedeutet, dass die LED heller oder dunkler wird. Das ganze funktioniert auch recht schoen, nur ist das Problem, dass die LED auch vollkommen ausgeschaltet werden soll. Wenn der Vergleichswert Null wird setze ich SREG auf Null, (damit die globalen Interrupts nicht aktiviert sind) und gleichzeitig den Pin auch auf Null. Bei Erhoehen des Vergleichswertes mit Tastendruck aktivierte ich die Interrupts wieder und die LED leuchtet schwach. Allerdings kommt jedesmal erst ein kurzer heller Flash, als ob kurzzeitig das Tastverhaeltinis bei 255 liegt. Kann mir das vielleicht irgendjemand erklaeren? Bitte! Zur Info: ich verwende einen ATMega128 mit einem externen 8MHz Oszillor, Timer3 ist ein 16-Bit-Timer Das Programm ist wie folgt: /* SW-PWM mit Timer3: Ausgang C.4 */ #include<mega128.h> #include<stdio.h> #include<delay.h> //---------------------------------------------------------------------- ------------------------------------ interrupt [30] void t3_overflow(void) //bei Überlauf von T3 Ausgang C.4 = high { PORTC.4=1; } //---------------------------------------------------------------------- ------------------------------------ interrupt [27] void t3_compareA(void) //wenn Vergleichswert erreicht, Ausgang, C.4 = low { PORTC.4=0; } /*** HAUPTPROGRAMM ******************************************************************/ void main(void) { unsigned char a=10; // Vergleichswerte zu Beginn DDRC=0x10; //C.4 als Ausgang definiert, Rest ist Eingang PORTF=0xFF; //PORTF als Eingang, Pull-up aktiviert TCCR3B=0x01; //Timer3 clk/1 ETIMSK=0x14; //Overflow und VergleichswertA T3 SREG=0x80; //globaler Interrupt enable while(1) { if ((PINF.5==0)&&(a<255)) // Vergleichswert +/- { a++; delay_ms(50); } if ((PINF.4==0)&&(a>=1)) { a--; delay_ms(50); } OCR3AH=a; // Übergabe Vergleichswert an Vergleichsregister OCR3AL=a; else { PORTC.4=0; SREG=0x00; if(PINF.5==0) { a++; delay_ms(50); SREG=0x80; } } } } Vielen herzlichen Dank! LARA