mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts auf AT91RM9200


Autor: _student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich versuche gerade die serielle Debug-Schnittstelle 
interrupt-gesteuert auszulesen. Jedoch habe ich folgendes Problem: die 
ISR wird nicht verlassen, sprich der normale Progrgammcode (jede Sekunde 
wird eine Zahl auf ausgegeben, die per manuellem Interrupt alle 3 Sek. 
inkrementiert wird) wird nicht ausgefuehrt.

Vielleicht kennt sich jemand aus, hier mal der Code

DIe Funktion boot ist die "main"
#include <sc/sc_config.h>
#define IRQ1 0x1 << AT91C_ID_IRQ1
#define SYS 0x1 << AT91C_ID_SYS


// Print dimi converts a HEX-Variable to ASCII
unsigned char * Print_dimi(AT91_REG *arg);
unsigned int mytestvalue;
volatile unsigned int StatusDBGU;
int myBool = 0;
int myBool2 = 0;
void vTimerIncrementTick( void );



// Interrupt handler fuer manuellen Interrupt
void ext_IRQ1_handler(void)
{  
  AT91C_BASE_AIC->AIC_IDCR = IRQ1;

  AT91C_BASE_AIC->AIC_ICCR = IRQ1;

  // Increment the variable
  mytestvalue++;
  
  // This clears the I bit in the CPSR re-enabling the Interrupts
  asm("mrs r7,CPSR");

  // MRS is status reg to reg
  asm("bic r7,r7,#0x80");

  // BIC instruction = bit clear
  asm("msr CPSR,r7");

  // MSR is reg to status reg
  AT91C_BASE_AIC->AIC_IECR = IRQ1; // Interrupt enable command register

  // Writing anything to IVR will unstack and clear in debug mode
  AT91C_BASE_AIC->AIC_IVR = 0x0;

  // Here acknowledge the end of interrupt
  //AT91C_BASE_AIC->AIC_EOICR = 0x0;
  AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}

// DBGU-Interrupt Handler
void myInterruptHandler(void)
{
  unsigned int StatusDBGU;
  static char myBuffer;

  StatusDBGU= AT91C_BASE_DBGU->DBGU_CSR;

  //Disabe & Clear AIC 
  AT91C_BASE_AIC->AIC_IDCR = SYS;
  AT91C_BASE_AIC->AIC_ICCR = SYS;

  StatusDBGU = AT91C_BASE_DBGU->DBGU_CSR;

  if (StatusDBGU & AT91C_US_RXRDY)
  {

    myBuffer = AT91C_BASE_DBGU->DBGU_RHR;
    // Echo
    AT91C_BASE_DBGU->DBGU_THR = myBuffer;

    // Switch LED's
    (myBool2) ? (myBool2 = 0) : (myBool2 = 1);
    (myBool2) ? (AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA18)) : (AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA18));

//     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA;
  }

//   AT91C_BASE_DBGU->DBGU_THR = 'x';

  // This clears the I bit in the CPSR re-enabling the Interrupts
   asm("mrs r7,CPSR");
  // MRS is status reg to reg
   asm("bic r7,r7,#0x80");
  // BIC instruction = bit clear
   asm("msr CPSR,r7");

  // Interrupt enable command register
  AT91C_BASE_AIC->AIC_IECR = SYS;
  // Here acknowledge the end of interrupt
  AT91C_BASE_AIC->AIC_EOICR = 0x0;

}

//Main
void boot(void)
{
  unsigned int tick;
  unsigned int timeout = 0;


  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA18);
  
  AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;

  // Setup Debug Port
  sc_setupDebugPort();

  AT91C_BASE_AIC->AIC_SVR[0x1A]= (unsigned int)&ext_IRQ1_handler;
  AT91C_BASE_AIC->AIC_SMR[0x1A]= 0x00000067;
  AT91C_BASE_AIC->AIC_IMR = IRQ1;
  AT91C_BASE_AIC->AIC_IECR = IRQ1;

  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS]= (unsigned int)&myInterruptHandler;
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS]= AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 0x6;
  AT91C_BASE_AIC->AIC_IMR = SYS;

  //Enable Interrupt
  AT91C_BASE_AIC->AIC_IECR = SYS;

    AT91C_BASE_DBGU->DBGU_IER = AT91C_US_RXRDY;
//    AT91C_BASE_DBGU->DBGU_IDR = AT91C_US_TXRDY;
//   AT91C_BASE_DBGU->DBGU_IDR = AT91C_US_ENDRX;
//    AT91C_BASE_DBGU->DBGU_IDR = AT91C_US_ENDTX;


  // Debug control reg
  mytestvalue = 0x19;

  // We use tick as a timer
  tick = *(AT91C_ST_CRTR);

  while (1)
  {
    // mytestvalue = AT91C_BASE_DBGU->DBGU_CSR;
    // Print the testvalue every second
    scDbg(Print_dimi(&mytestvalue));
    timeout++;

    if(timeout>2)
    { 
      //Generate a test-interrupt every 3 seconds
      scDbg("\r\n");
      AT91C_BASE_AIC->AIC_ISCR = IRQ1; //set PA26=IRQ1
      timeout=0;
    }

    while (tick == *(AT91C_ST_CRTR));
    tick = *(AT91C_ST_CRTR);
  }
}



Autor: _student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand der mir erklaeren kann was ich falsch gemacht oder vergessen 
habe?

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.