Forum: Compiler & IDEs Newlib und Interrupt


von André Schimschar (Gast)


Lesenswert?

Ich habe ein Problem mit Interrupts und dem AP7000. Und zwar habe ich 
eine Signalleitung auf den 25.Pin des Port B gelegt und nur diesen für 
Inerrupts enabled. Anschließend habe ich mit Newlib den Interrupthandler 
programmiert:
1
__int_handler *empf_int_handler(){
2
3
}
und anschließend initialisiert.
1
set_interrupts_base( (void *) AVR32_INTC_ADDRESS );
2
    register_interrupt( (__int_handler) (empf_int_handler), AVR32_PIOB_IRQ/32, AVR32_PIOB_IRQ % 32, INT0);
3
    init_interrupts();

Wenn das Signal nun kommt, wird auch die ISR abgearbeitet.
Das Problem ist jetzt, dass diese nicht wieder verlassen wird obwohl das 
Signal wieder auf low ist. Was soll ich tun.
Kann ich eigentlich auch den externen Interruptcontroller nutzen?

Bitte antwortet
André

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die leere Interruptroutine empf_int_handler kommt mir spanisch vor.

Steht was in der Doku zum AP7000 zu dem Thema, ob du was in der 
Interruptroutine machen musst?  Z.B. das auslösende Interruptflag 
löschen (clearen)... Manche µC machen das automatisch beim Verlassen der 
ISR (z.B. AVR) und andere nicht.

Kannst du schon unterscheiden, ob du in dem ersten Aufruf der 
Interruptroutine verharrst oder ob nachfolgende Interrupts der gleichen 
Sorte dich immer wieder in die Routine zwingen?

von André Schimschar (Gast)


Lesenswert?

Nein, der Interrupthandler enthält schon etwas. Er liest einen Fifo vom 
CC2420 aus und gibt diesen dann mit printf aus. Er tut dies aber nicht 
nur einmal, sondern immer wieder. In meinem richtigen Programm habe ich 
auch alle sek. einen printf. Wird die ISR einmal gestartet, werden diese 
printf-Befehle nicht mehr ausgeführt. Muss also in der ISR verbleiben. 
Einen Clear-Befehl konnte ich im AppNote bei Atmel nicht entdecken...

von Werner B. (werner-b)


Lesenswert?

Da möchte ich dich mal auf AVRFreaks verweisen.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=64522

von André Schimschar (Gast)


Lesenswert?

Das ist ja gut und schön, aber ich habe ein ngw100. Und da gibt es kein 
Softwareframework...
Muss doch auch mit newlib gehen...
Hab das ganze für nen Empfang eines Usart-Zeichens schon hinbekommen, 
nur nicht für den GPIO, was mach ich falsch? Kann ich den Externen 
Interruptcontroller irgendwie programmieren?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn keine zweite Ausgabe per printf seitens der ISR kommt, kann das 
auch daran liegen, dass die ISR nicht noch mal aufgerufen wird, d.h. 
einfach kein weiterer Interrupt kommt. Es muss nicht heissen, dass der 
1. Aufruf feststeckt.

Mit printf in einer ISR hätte ich sowieso Bauchweh. Zeit- oder 
resourcenfressende Funktionen (printf ist beides) arbeitet man besser 
nicht im Interrupt ab, sondern in der Endlosschleife des Hauptprogramms.

Ich würde in der ISR nur Daten in volatile Variablen packen (z.B. 
einen Zähler für jeden ISR Aufruf) und dann diese Daten ausserhalb des 
ISR ausgeben.

Edit: Wenn es ganz hart kommt, würde ich den Zähler auch mal auf einen 
Port z.B. auf Leds oder einen Logikanalyzer ausgeben. Bei Interrupts 
muss man mit Überraschungen rechnen. Die kommen manchmal anders als man 
denkt.

von Peter D. (peda)


Lesenswert?

Gibts denn zu diesem Chip kein Datenblatt oder Usermanual, wo drinsteht, 
was beim Behandeln eines Interrutps passiert und wann wie welche Bits zu 
setzen sind?


Peter

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das wäre unsportlich ;-)

Nee, sicher doch gibt es das:
http://www.atmel.com/dyn/Products/product_card.asp?part_id=3903

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Puh, das ist ziemlich "Preliminary" im Datenblatt.

Es gibt aber ein Beispiel "AVR32101: Configuring the AVR32 interrupt 
controller", das ziemlich genau deine Anwendung abdeckt. Bis auf die 
Verwendung eines anderen Ports. Und in dessen Erklärung und Source ist 
in der ISR keine Notwendigkeit für Zurücksetzen von Flags erwähnt oder 
entsprechendes programmiert.

von André Schimschar (Gast)


Lesenswert?

Bei der ISR für den USART habe ich auch ein Zeichen empfangen und mit 
printf ausgegeben. War absolut kein Problem. Er ist auch ohne Probleme 
ins Hauptprogramm zurückgesprungen. Nur beim GPIO habe ich das Problem, 
dass die ISR nicht wieder verlassen wird. Bin genau nach dieser 
Application Note vorgegangen, die du erwähnt hast. Komisch finde ich den 
Satz im manual unter 13.3.3:

Clearing of the interrupt request is done by writing to registers in the 
corresponding peripheral
module, which then clears the corresponding NMIREQ/IREQ signal.
The recommended way of clearing an interrupt request is a store 
operation to the controlling
peripheral register, followed by a dummy load operation from the same 
register. This causes a pipeline stall, which prevents the interrupt 
from accidentally re-triggering in case the handler is
exited and the interrupt mask is cleared before the interrupt request is 
cleared.

Was soll mir das sagen???

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Da habe ich auch gestutzt.

Ich denke (!), dass Clearing meint, dass du keine Interrupts mehr von 
diesem Gerät haben willst, wenn du sie vorher dort angefordert hast.

Es heisst IMHO nicht, dass du den empfangenen Interrupt bestätigen oder 
weglöschen musst.

Das schliesse ich aus dem Beispielcode, wo nix derartiges gemacht wird.

Ich würde es trotzdem ohne printf probieren. Läuft das Beispiel (mit 
Anpassung auf den Port) bei dir?

von Werner B. (Gast)


Lesenswert?

Da steht aber
... Clearing of the interrupt request ...
und nichts von einer Freigabe.


Und der Teil vor
...which prevents the interrupt
from accidentally re-triggering in case the handler is
exited and the interrupt mask is cleared before the interrupt request is
cleared.
ist ein Hinweis darauf wie man das tun soll (und warum so kompliziert).

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.