www.mikrocontroller.net

Forum: Compiler & IDEs Newlib und Interrupt


Autor: André Schimschar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
__int_handler *empf_int_handler(){

}
und anschließend initialisiert.
set_interrupts_base( (void *) AVR32_INTC_ADDRESS );
    register_interrupt( (__int_handler) (empf_int_handler), AVR32_PIOB_IRQ/32, AVR32_PIOB_IRQ % 32, INT0);
    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é

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: André Schimschar (Gast)
Datum:

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

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da möchte ich dich mal auf AVRFreaks verweisen.

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Autor: André Schimschar (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre unsportlich ;-)

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: André Schimschar (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

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.