Hallo, ich habe mal ne Verständnis-Frage zu Interrupts (XMega) welche von Timern ausgelöst werden. Ist es möglich von einem Timer mehrere Interrupts auslösen zu lassen. Also z.B. folgendes Szenario: Timer1 soll immer bis 1000 zählen. Dann soll eine ISR beim Timer1-Wert 200 ausgelöst werden, dann nochmal bei 400 und dann nochmal bei Überlauf. Ist das möglich, oder kann ein Timer immer nur einen Interrupt auslösen? mfg Bernd
Und warum läuft das hier dann nicht? #include <avr/io.h> #include <avr/interrupt.h> int main(void) { // internen Oszillator auf 32MHZ einstellen OSC.CTRL = 3; while(OSC.STATUS != 3) { } CCP = 0xD8; CLK.CTRL = 1; // Interrupts aktivieren und alle Level freigeben sei(); PMIC.CTRL=0x07; // Timer 0 initialisieren TCC0.CTRLA = 0x00; TCC0.INTCTRLA = 0x03; //Overflow-Interrupt aktivieren als high-Level TCC0.INTCTRLB = 0x3F; //Compare-Interrupts A,B,C aktivieren als high-Level TCC0.CCA = 100; //Vergleichswert A = 100 TCC0.PER = 250; //Maximalwert = 250 TCC0.CTRLA = 0x04; //Prescaler auf 8 --> 4MHz, T=250ns PORTB.DIR = 0xFF; PORTB.OUT = 0xFF; while(1) { PORTB.OUT = 0x66; PORTB.OUT = 0x55; } } ISR (TCC0_OVF_vect) { PORTB.OUT = 0x33; PORTB.OUT = 0x44; } ISR (TCC0_CCA_vect) { PORTB.OUT = 0xAA; PORTB.OUT = 0xBB; }
Wenn die Timer-Periode bei 250 liegt, wie soll der Timer dann bis 1000 zählen? Und ich meine mich erinnern zu können, daß der Interrupt-Controller vor dem 'sei' initialisiert werden muß.
Hat sich schon erledigt, läuft also. Problem war, das ich den Compare Interrupt A, B & C aktiviert habe, aber nur den Schwellwert für A festgelegt hab. Das mag der xmega wohl nicht.
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.