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:
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);
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).
in meinem Mainfile steht folgendes:
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");
}
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.
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?
Lesezeichen