mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FIQ Interrupt will nicht!


Autor: Tobias Eckhardt (doenges2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mal folgende FIQ-Interrupt Geschichte ausprobieren wollen und 
nichts passiert

Hardware: Olimex EK Board mit AT91SAm7S256

main.c:

#include "Board.h"
#include "delay.h"
#define __inline static inline
#include "lib_AT91SAM7S256.h"

void fiqisr (void);
extern  void LowLevelInit(void);
extern void AT91F_Fiq_Handler (void);
extern  unsigned enableIRQ(void);
extern  unsigned enableFIQ(void);
unsigned int  FiqCount = 0;    // global uninitialized variable
#define FIQ_INTERRUPT_LEVEL  0

int main (void)  {
volatile AT91PS_AIC  pAic = AT91C_BASE_AIC;
volatile AT91PS_PIO  pPIO = AT91C_BASE_PIOA;        // pointer to PIO 
data structure
  pPIO->PIO_PER = LED_MASK | Button1;          // PIO Enable Register - 
allow PIO to control pins P0 - P3 and pin 19
  pPIO->PIO_OER = LED_MASK;              // PIO Output Enable Register - 
sets pins P0 - P3 to outputs
  pPIO->PIO_SODR = LED_MASK;              // PIO Set Output Data 
Register - turns off the four LEDs


// Select PA19 (pushbutton) to be FIQ function (Peripheral B)
  pPIO->PIO_BSR = Button1;
//* open  FIQ interrupt
  AT91F_PIO_CfgPeriph (AT91C_BASE_PIOA,Button1,0);
  AT91F_AIC_DisableIt (pAic, AT91C_ID_FIQ);
  AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_FIQ, 
FIQ_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE, 
AT91F_Fiq_Handler);
  AT91F_AIC_ClearIt (pAic, AT91C_ID_FIQ);
  AT91F_AIC_EnableIt (pAic, AT91C_ID_FIQ);
  enableFIQ();

while (1) {
    Delay(1000);
    if  ((pPIO->PIO_ODSR & LED1) == LED1)  {    // read previous state 
of LED1
      pPIO->PIO_CODR = LED1;
    } else {
      pPIO->PIO_SODR = LED1;
    }
  }
}

die passende fiqisr.c mit der Funktion AT91F_Fiq_Handler:

// 
************************************************************************ 
*****
//               AT91F_Fiq_Handler
//
//     IRQ 0 Interrupt Service Routine
//
//
//
//
//  Author:
// 
************************************************************************ 
*****
#include "Board.h"
#define __inline static inline
#include "lib_AT91SAM7S256.h"
volatile AT91PS_AIC  pAic = AT91C_BASE_AIC;
void AT91F_Fiq_Handler(void)  {

    //* Read the output state
    if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & LED2 ) == LED2 )
    {
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2 );
    }
    else
    {
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2 );
    }
    AT91F_AIC_ClearIt (pAic, AT91C_ID_FIQ);
}


Enableirq tut folgendes:

unsigned enableIRQ(void)
{
  unsigned _cpsr;

  _cpsr = __get_cpsr();
  __set_cpsr(_cpsr & ~IRQ_MASK);
  return _cpsr;
}

------------------------------------------------------------------------ 
-


Da ich keinen Fehler find, frage ich mich inweiweit man de nFIQ noch 
woanders definieren muß?


In meiner lowlevelinit.c werden PLL, Watchdog und unter anderem auch die 
Interruptvetoren handler gesetzt

Hat jemand vielleicht eine Idee?

Gruß

Tobias

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Enableirq tut folgendes
und was tut EnableFIQ?

Sind FIQ-exceptions auf Core-Level freigegeben? (FIQ-Bit in Status des 
aktiven Modes gelöscht)?

Wie sieht der Assembler-Wrapper für FIQ aus? Wir der FIQ auf Core-Ebene 
ausgelöst? (z.B per Debugger nachsehen oder LED im FIQ-Wrapper blinken 
lassen)

Martin Thomas

Autor: Tobias Eckhardt (doenges2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,


na klar... die FIQenable() tut folgendes:

#define FIQ_MASK 0x00000040
unsigned enableFIQ(void)
{
  unsigned _cpsr;

  _cpsr = __get_cpsr();
  __set_cpsr(_cpsr & ~FIQ_MASK);
  return _cpsr;
}

Muß ich den nauch das AIC_FFER Bit setzen?
Das Thema "exceptions" habe ich mir noch nicht angenommen?
Aber das was du siehst ist alles was ich zum Thema FIQ ausprobiert habe!

Dein Beipsiel habe ich mit meinem verglichen und bis auf die startup 
unterschiede habe ich nichts gefunden?

Habe einfach mal das ganze Projekt angehängt, falls Interesse besteht.


Gruß

Tobias Eckhardt

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.