mikrocontroller.net

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


Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lama (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//Protection Mode im AIC Debug Control Register setzten (folgende Werte
//durchprobiert: 0x00, 0x01, 0x03)
  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.

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Kusch (Gast)
Datum:

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

Autor: Thomas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Kusch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.