Ich bin neu bei Embedded und habe seit Tagen damit zu kämpfen. Ich verstehe einfach nicht, warum das nicht funktioniert.
Ich verwende einen ATxMega128A1. Ich möchte einen Timer-Überlauf-Interrupt verwenden, um ein Bit an einem Port zum nächsten Pin zu verschieben. Die Zeitschaltuhr funktioniert. Ich kann sehen, dass es im Simulator durch CNT klickt, und das Überlauf-Flag wird gesetzt, aber die ISR wird nie ausgeführt (und daher wird das Überlauf-Flag auch nie zurückgesetzt). Hat jemand eine Ahnung, wo ich falsch liege? Ich habe mehr oder weniger den Timer-/Interrupt-Code aus Atmels Trainingscode kopiert/eingefügt.
ISR(TCC0_OVF_vect)
{
LEDPORT = (LEDPORT << 1);
}
int main(void)
{
initLights();
// Set up Timer/Counter 0.
TCC0.PER = 0x10; //
TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV1_gc; //start timer with system clock
TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_LO_gc; // Enable overflow interrupt.
// enable global interrupts:
sei();
while(true)
{
//do nothing, the timer interrupt will handle it
}
}
Wie Sie wahrscheinlich wissen, hat der XMEGA einen mehrstufigen Interrupt-Controller. Sie müssen nicht nur den globalen Interrupt aktivieren, sondern auch den gewünschten Level-Interrupt (Low-Level, da Sie Ihre Timer-Priorität auf "Low" konfiguriert haben) im Steuerregister.
CTRL – Steuerregister
Bit 0 – LOLVLEN: Low-Level Interrupt Enable(1)
Wenn dieses Bit gesetzt ist, werden alle Low-Level-Interrupts aktiviert. Wenn dieses Bit gelöscht ist, werden Low-Level-Interrupt-Anforderungen ignoriert.
Der Code zum Aktivieren des spezifischen Interrupt-Levels ist unten.
//enable low level interrupts
PMIC.CTRL |= PMIC_LOLVLEN_bm; //0b00000001