Gast
#823735
Hallo, bin zwar nicht ganz neu, aber ich hab meine Probleme mit den Timern. Ich verwende 3 Timer. Timer 0 wird fuer eine PWM benutzt. Timer 1 wird fuer Tastenabfrage und Uhrzeit benutzt. Und jetzt moechte ich gerne Timer 2 benutzen fuer eine Soft PWM. Hab mir hier auch einiges durchgelesen, auch die Tutorials, aber es entsteht immer das gleiche Problem. Und zwar blinkt die LED am Ausgang PB1 immer dann wenn mein Timer 1 eine Sekunde hochzaehlt. Ansonsten dimmt die LED so wie ich es will. Nur alle Sekunde geht sie aus und wieder an. Es kommt mir vor, als ob der Timeroverflow und der Timercompare sich ueberschneiden. Bitte helft mir, da ich echt nicht weiter weiss. Und bitte nicht nur auf die Tutorials verweisen, denn die hab ich schon durchgearbeitet;-). Ich hab sicherlich ein Verstaendnissproblem, dass ich leider nicht alleine loesen kann. Danke schon mal!!! Gruss Daniel ISR(TIMER1_COMPA_vect) { update_clock(); tick_display(); // tick every 0.5 sec exe_keypad(); } ISR(TIMER2_OVF_vect) { if (pwm_cnt < 20 ) PORTB &=~(1<<PB1); else PORTB |=(1<<PB1); if (pwm_cnt==127) pwm_cnt=0; else pwm_cnt++; } int main(void) { SPCR=(1<<MSTR); DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB5)|(1<<PB6); wdt_enable(WDTO_2S); TCCR0= (1<<WGM00)|(1<<COM01)| (1<<COM00)|(1<<CS01);//|(1<<CS00); TCCR1B = (1<<WGM12)|(1<<CS10); TCCR2= (1<<CS20); OCR1A=37314; TCNT2=0; OCR0= 0; SREG = 0b10000000; TIFR= (1<<OCF1A); TIMSK = (1<<OCIE1A)|(1<<TOIE2); //Interrupt enablen while(1) { if( get_key_press( 1<<PC0 )){servicekey0();pp=0;PORTD |= (1<<PD6);} if( get_key_press( 1<<PC1 )){servicekey1();pp=0;PORTD |= (1<<PD6);} if( get_key_press( 1<<PC2 )){servicekey2();pp=0;PORTD |= (1<<PD6);} if( get_key_press( 1<<PC3 )){servicekey3();pp=0;PORTD |= (1<<PD6);} wdt_reset(); } return 0; }