Hallo ich habe ein Problem und bin schon seit Stunden auf der Suche nach einer Lösung, doch leider ohne Erfolg! Vieleicht kann mir hier jemand auf die Sprünge helfen? Der Timer2 soll im Overflow Interrupt die Led blinken lassen, das funktioniert auch, aber egal auf welchen Wert ich den TCNT2 stelle die LED blinkt immer mit der selben Frequenz. Aber warum??? Probiert hab ich es nur in der Init ohne TCNT2 im Interrupt zu ändern aber auch in der ISR geht nix. Später soll noch eine PWM dazu und noch ein paar sachen aber erst muss die LED wie gewünscht blinken! Hier der Programmcode: int main() //Hauptprogramm { init(); // Init UP aufruf ADC_Init(); // ADC initialisieren while(1) { if (PINB & (1<<PINB0)) //Wenn Schlüsselschalter EIN ist (Schluessel == 1) { lcd_linit(); //LCD Initialisieren lcd_clear(); //Display löschen PORTD |= (1<<PD3); // Summer an _delay_ms(80); // 80mSec warten PORTD &= ~(1<<PD3); // Summer aus sei(); // Interrupts freigegeben _delay_ms(500); // halbe Sec warten while ( PINB & (1<<PINB0) ) { //hier erstmal nix machen nur in der ISR } else { cli(); _delay_ms(2000); // 2sec warten PORTB |= (1 << PB3); // LED Einschalten Rot Error PORTD |= (1<<PD3); // Summer an lcd_clear(); } } } ISR(TIMER2_OVF_vect) //Timer 0 Überlauf Interruptroutine { TCNT2 = 0xB2; // Timer2 value 0xB2 (dez178) !!! /* Interrupt Aktion (bei TCNT2=0xB2) alle (8000000/1024)/178 Hz = 43,89 Hz bzw. 1/43,89 s = 22,78 ms 0x52 =etwa 10ms */ cli(); flag++; if (flag == 88) // alle x sec. trifft das zu! { flag = 0; PORTD ^= (1 << PD2); // LED toggeln Gelb } sei(); } void init() { PORTA=0b00000000; DDRA =0b11000000; //1=als Ausgang konfiguriert 0=Eingang PORTB=0b00000000; DDRB =0b11111000; PORTC=0b00000000; DDRC =0b11111111; PORTD=0b00000000; DDRD =0b11111111; //alle als Ausgänge // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 7,813 kHz // MODUS: Normal top=FFh // OC0 output: Disconnected OCR0A=0x00; // Output Compare Register – OCR0A einfach OCR0B=0x00; // Output Compare Register – OCR0B einfach TCCR0B |= ( 1<<CS02 )|( 1<<CS00 ); // Vorteiler 1024 TCNT0=0x00; // Timer auf Null //TIMSK0 |= ( 1<<TOIE0 );//timer AUS!!! // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // MODUS: Ph. correct PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Inverted // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xB1; //COM1A1=1 COM1A0=0 (10= nicht invertiert) COM1B1=1 COM1B0=1 0001==PWM, Phase Correct, 8-bit TCCR1B=0x01; //0000 0001 1=cs10 bedeutet im cpu Takt clkIO/1 (From prescaler) TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0xff; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 8Mhz // MODUS: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2B|= ( 1<<CS02 )|( 1<<CS00 );// Vorteiler 1024 Timer/Counter //Control Register (größte Vorteiler) TCNT2=0xB2; // Timer auf 1011 0010 (178 dezimal) B2 OCR2A=0x00; OCR2B=0x00; TIMSK2 |= (1<<TOIE2); // Timer Overflow Interrupt freischalten //Ber.: Frequenz/Vorteiler= 8Mhz/1024= 7812,5 durchläufe pro sek. //Jedesmal wenn der Timer seinen höchsten Wert erreicht //hat, erfolgt ein //Overflow und der Timer beginnt wieder bei 0 zu zählen. /* Interrupt Aktion (bei TCNT2=256) alle (8000000/1024)/256 Hz = 30,52 Hz bzw. 1/30,52 s = 32,77 ms (8000000/1024)/178 Hz = 43,89 Hz bzw. 1/43,89 s = 22,78 ms */ // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUSR=0x00; } Danke schon mal! Grüße Daniel
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.