Forum: Mikrocontroller und Digitale Elektronik SAM9260. Interrupts werden nicht ausgelöst


von Thomas Kusch (Gast)


Lesenswert?

Hallo!

Ich kriege mit einem SAM9260 (Board von Olimex an ARM-USB-OCS und Rowley 
1.7) die Interrupts nicht zum Laufen. Habe mittlerweile lange gesucht 
und diverse Tipps befolg, jedoch ohne Erfolg. Vielleicht findet einer 
von Euch etwas.

Das Szenario:

es ist ein einfaches Programm, das nichts macht, ausser einen Timer 
starten der beim Overflow einen Interrupt auslöst. Es wird zwar 
Interrupt Pending im AIC gesetzt und es sieht IMHO alles sehr gut aus, 
aber der Interrupt kommt nicht!

Hier die Details:
-beim Programdownload wird zusätzlich ein externer Reset ausgelöst und 
vorsorglich alle Interrupts durch Schreiben des Interrupt Clear Command 
Register (ICCR) quittiert sowie alle Interrupts gesperrt:

RSTCT_CR=0xA500000004;
AIC_ICCR=0xFFFFFFFF;
AIC_IDCR=0xFFFFFFFF;

Alle Caches und die MMU ist deaktiviert.

-im main geht folgendes vor:
main()
{
//Handler für spurious Register setzten (wird aber NIE aufgerufen)
  AT91C_BASE_AIC->AIC_SPU = (unsigned int) Spurious;
//Protection Mode im AIC Debug Control Register setzten (folgende Werte
//durchprobiert: 0x00, 0x01, 0x03)
  AT91C_BASE_AIC->AIC_DCR = 0x01;

//Setup des Power Management Controllert für TC0
//System Clock (Programmable Clock 0) einschalten
  AT91C_BASE_PMC->PMC_SCER|=AT91C_PMC_PCK0;
//Peripheral Clock für TC0 einschalten
  AT91C_BASE_PMC->PMC_PCER|=(1<<AT91C_ID_TC0);

//Timer0 erzeugt Wave
  AT91C_BASE_TC0->TC_CMR = AT91C_TC_WAVE;
//Beim Overflow Interrupt
  AT91C_BASE_TC0->TC_IER=AT91C_TC_COVFS;

//Handler an AIC übergeben (wird nie angesprungen)
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) TC0_handler;

//Priorität
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_HIGHEST;

//Evtl. Int quittieren
  AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);

//TC0-Interrupt zulassen
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);

//Timer starten
  AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;

  for(;;);
}

Wie oben geschrieben, der Timer läuft auch korrekt!
Die Werte der Register im AIC sehen auch gut aus:
Alle AIC_SMRs und AIC_SVRs sind 0x00, ausser dem AIC_SMR17 und 
AIC_SVR17.
AIC_IVR, AIC_FVR und AIC_CPU zeigen korrekt auf den Spurious-Handler.
AIC_IMR ist 0x00020000, also NUR auf TC0 scharfgestellt.
Und jetzt das eigenartige: der AIC_IPR (Interrupt Pending Register) hat 
den Flag für den TC0 gesetzt.

Nun verstehe ich nicht, wieso dieser nicht angesprungen wird!! Das 
Programm werkelt fleissig im for(;;) vor sich hin :(

Achso... das I-Flag der CPU ist natürlich gelöscht und die CPU läuft im 
Supervisor-Mode (System Mode habe ich auch schon versucht).

Ich bin mit meinem Latein ziemlich am Ende und freue mich über jeden 
Hinweis!

Gruss
Thomas

von Thomas Kusch (Gast)


Lesenswert?

Hallo nochmal,

das gleiche Verhalten habe ich auf anderen Interrupts. z.B. PIT oder 
PIOx. Ich kann bei einem Button z.B. den Flag im Interrupt Pending 
Register durch Drücken setzten und von Hand mit dem ICCR wieder löschen. 
Obwohl die Maske auf den entsprechenden PIO scharfgestellt ist passiert 
nix :(

Gruss
Th

von lama (Gast)


Lesenswert?

1
//Protection Mode im AIC Debug Control Register setzten (folgende Werte
2
//durchprobiert: 0x00, 0x01, 0x03)
3
  AT91C_BASE_AIC->AIC_DCR = 0x01;

Bei 0x03 sind Interrupts immer aus.

Ich würde das I-Flag nochmal überprüfen. Evtl ist nur das F-Flag 
gelöscht, verwechselt man gerne.

Ansonsten wärs gut zu wissen, wie der Interrupt Handler aussieht, bzw ob 
die Interrupt-Vektoren an der richtigen Stelle stehen.

von Thomas Kusch (Gast)


Lesenswert?

Hallo Lama!

Danke fuer die Antwort! Da ich bisher schon gut 15-20Stunden an dem 
Problem sitze, bin ich mir sicher, dass der I gelöscht ist :) Die 
Einsprungadressen an die Handler stimmen auch. Habe es sowohl im 
Debugger (im mixwd mode) wie auch im .map-File überprüft.

Gruss
Th

von Thomas Kusch (Gast)


Lesenswert?

Das Problem scheint u.U bei Rowley zu liegen! Mit IAR funktionieren die 
Interrupts wie sie sollen.

von Thomas K. (Gast)


Lesenswert?

Es ist gelöst. Nachdem ich festgestellt habe, dass das Testprogramm mit 
IAR und Rowley auf einem anderen Rechner korrekt arbeiten, habe ich den 
Entwicklungsrecher neu aufgesetzt. Jetzt funktioniert es. Eine Erklärung 
habe ich aber nicht dafür (LPCs liefen anstandslos).

Gruss
Th

von Thomas Kusch (Gast)


Lesenswert?

Jetzt kann ich die Erklärung nachliefern.
Sobald im Register-Fenster des Debuggers die AIC-Register ausgewählt 
sind, funktionieren keine Interrupts  mehr. Seltsamerweise darf es nicht 
mal beim Download des Codes aktiv sein!

Und das hat mich eine knappe Woche gekostet....

Th

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
Noch kein Account? Hier anmelden.