Ok, anscheinend ist das nicht mein Tag, oder ich bin zu dumm um es zu verstehen. Aus irgend einem Grund Löst dieser Timer keinen Interrupt aus.
In der Lib steht nun folgendes:
Damit sollte 20ms nach dem Reset des Timers (TCNT1=0) ein Interrupt ausgelöst werden, und zwar das TIMER1_COMPA_vect wie ich aus der Tabelle von oben herausgefunden habe (ist für ATmega32, und löst bei Comparematsch A aus, wie der name schon zu vermuten lässt).Code://alle 20ms auslösen auf COMPA TCCR1A= (0 << COM1A1) | (0 << COM1A0) | (0 << COM1B1) | (0 << COM1B0) | (0 << FOC1A) | (0 << FOC1B) | (0 << WGM11) | (0 << WGM10); TCCR1B= (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (0 << WGM12) | (1 << CS12) //Prescaller = 256 | (0 << CS11) | (0 << CS10); OCR1A = 625; TCNT1 = 0; //Reset TIMSK = (0 << TICIE1) | (1 << OCIE1A) | (0 << OCIE1B) | (0 << TOIE1);
in meinem Mainfile steht folgendes:
Da ich die Servos noch nicht habe, habe ich mir gedacht ich gebe einfach mal etwas auf dem Display aus, und zwar "Interrupt TIMER1", das funktioniert allerdings nicht, da er anscheinend niemals in dieses unterprogramm wechselt.Code:ISR(TIMER1_COMPA_vect) { uint16_t Achse1; uint16_t Achse2; TCNT1 = 0; //reset DDRC |= IO_PC5; DDRC |= IO_PC3; Achse1=Greifer_Achse1*10+250; Achse2=Greifer_Achse2*10+250; PORTC |= IO_PC5; delay_us(Achse1); PORTC &= ~IO_PC5; PORTC |= IO_PC3; delay_us(Achse2); PORTC &= ~IO_PC3; setCursorPosLCD(1,0); writeStringLCD_P("Interrupt TIMER1"); }
Ich habe anschließend Zyklisch abgefragt wie der Wert des Timers ist, das war zwar sehr verwirrend, da sich das ziemlich schnell wechselt, doch ich kann sagen, das er läuft, und zwar von 0 - 65535.
Frage: Warum passiert nix?







Zitieren

Lesezeichen