mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Crossworks Arm LPC2478 Interrupt


Autor: Crossworksstarter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich bin Arm-Neuling und verwende Crossworks 1.7 mit einen LPC2478-Board

Ich möchte mich in die Materie einarbeiten, bisher habe ich mich in die 
I/O Geschichte eingelesen. Und nun möchte ich die Interrupt-Geschichte 
verstehen lernen. Ich habe schon Stunden gesucht, habe natürlich viele 
Beispiele gefunden, doch es klappt nicht so richtig. Viele Beispiele 
sind für den LPC2148 und da wird das Register VICVectCntl0 geproggt. Das 
gibt es wohl nicht beim LPC2478??

Teilerfolge:
Es wird ein Interrupt ausgelöst, doch der Sprung in die ISR endet im 
Nirgendwo. Ich habe Probleme, die ISR richtig zu programmieren.


So habe ich bisher rumgedoktert:

#include <targets/LPC2478.h>

void fiq_handler(void) __attribute__((naked));


//  LED (yellow  pin 66 P1[18]
//
//  button with BUT1 pin 67  P2[19]


#define LED   (1<<18) // Port 1
#define Taste (1<<19) // Port 2
#define GPIOM 0       // Diese Bit schaltet im Register SCS die FIOPORTs frei
#define EINT3  (1<<17)

int main (void)
{
  SCS = (1<<GPIOM);  
  FIO1DIR= LED;
 
  IO2IntEnF = Taste;

  VICIntEnable = EINT3;
  VICVectAddr1 = (unsigned long) fiq_handler;
  VICVectPriority1 = 5;
 
  __ARMLIB_enableIRQ();

  for(;;)
  {
      FIO1SET= LED;
      FIO1CLR= LED;
  }
}

void fiq_handler(void)
{
  double counter;
  ++counter;
}




Wäre nett, wenn mir da jemand helfen könnte, oder ein Beispiel für 
Crossworks und LPC2478 hat.

Vielen Dank im Voraus!

Autor: Michael G. (let)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem fertigen Beispiel für Crossworks kann ich nicht dienen,
da ich es nicht benutze (dieser Makro-Vodoo macht mich krank).

Du solltest zunächst zwischen IRQ und FIQ unterscheiden. Im Code
wird ein fiq_handler() definiert, der als IRQ handler fungiert.
Dürfte in diesem Fall zwar egal sein, stiftet aber zumindest
Verwirrung.
Desweiteren sind Beispiele für den LPC21xx/LPC22xx nicht sehr
hilfreich da die LPC23xx/24xx einen anderen VIC verwenden.

Ich sehe drei Fehler:
1. Der EINT3 wird aktiviert aber der Handler wird bei VICVectAddr1
eingetragen. Das sollte VICVectAddr17 sein.
Die VICVectCntl Register heißen jetzt VICVectPriority. Auch hier
ist es bei VICVectPriority17 zu tun.

2. Der Handler wird als "naked" deklariert, enthält aber keinerlei
Interrupt spezifischen Code. Ich nehme mal an das Crossworks
einen Haufen Makros bereitstellt die da rein müssen.
Eine Alternative wäre es den Handler mit "__attribute__ 
((interrupt("IRQ")))"
zu deklarieren. Allerdings gibt es da zumindest bei älteren GCCs
Probleme in Verbindung mit Thumb-Code. Module die solche Handler 
enthalten
müssen daher für den ARM-Mode compiliert werden. Das mag sich
inzwischen geändert haben. Thumb-Code bringt auf dem LPC2000 aber
ohnehin nicht viel, außer das er langsamer ist und ein paar Prozent
Code einspart.

3. Das Ende des Interrupts wird dem VIC nicht mitgeteilt. Das
macht man durch "VICVectAddr=0;" am Ende des Handlers. Andernfalls
wird der Handler gleich wieder aufgerufen.

 - Michael

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Crossworksstarter schrieb:

> Das gibt es wohl nicht beim LPC2478??

LPC2148 und LPC2478 verwenden verschiedene Interrupt-Controller. 
Vielleicht findest du ein Beispiel für einen LPC23xx, die haben den 
gleichen Interrupt-Controller.

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.