www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 + uVsion3 IR-Handling


Autor: Tom W. (nericoh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

wie immer gilt: ich hab das Forum gründlich nach passenden Threads 
durchsucht und keinen finden können, der sich genau mit meiner 
Problematik befasst. Falls ich was übersehen habe, bitte ich um kurzen 
Hinweis !

Problemstellung:
ich möchte mit dem PIT des AT91SAM7 unter uVision3 zyklische Interrupts 
auslösen und verarbeiten. Folgendermaßen bin ich vorgegangen:
//init of Advanced Interrupt Controller
*AT91C_AIC_IECR  = 0x00000002;    //enable PIT IR
AT91C_AIC_SMR[1] = 0x00000007;    //set priority of PIT IR
AT91C_AIC_SVR[1] = (AT91_REG) ISR_periph; //set adress to branch to if peripheral IR occurs

//init of  Periodic Internal Timer
*AT91C_PITC_PIMR   = ( 0x000FFFFF & ( TIMER_PARA_MicroCycle * (TIMER_PARA_SysClock / (16 * 1000) ) ) ) ;  //set cycle of timer
*AT91C_PITC_PIMR   |= 0x03000000;  //enable the timer and the corresponding IR

__irq void ISR_periph (void)   //executed every time a peripheral IR occurs
{       
  if ( *AT91C_PITC_PISR )          //IR caused by Periodic Interval Timer ?  
  {           
    count++;

    if (count >= 2)    
    {  
      SET_PWR_LED(ON);            
    }   

    *AT91C_AIC_ICCR    = 0x00000002;  //clear the IR-Bit
    tempvar   = *AT91C_PITC_PIVR;    //reading PIVR resets the timer ir

  }

  *AT91C_AIC_EOICR   = 0xFFFFFFFF;   //end of IR
}

Soweit funktioniert das auch: die Power-LED geht an, deshalb weiß ich, 
dass die ISR mehr als nur einmal angesprungen wird.
Jetzt kommt das eigentliche Problem: laut Datasheet des Controllers soll 
in der ISR als erstes das "Interrupt Vector Register" (AIC_IVR) gelesen 
werden: "The read of AIC_IVR is the entry point of the interrupt 
handling which allows the AIC to consider that the interrupt has been 
taken into account by the software." Zwar funktioniert mein IR-Managment 
auch ohne diesen Lesezugriff. Allerdings möchte ich IRs auch 
verschachteln können (s. Beitrag "AT91SAM7 -> Interrupts verschachteln (nested IRs)"), 
was mir bisher nicht gelingt, vermutlich u.a. weil ich das IVR nicht 
lese. Daher nun die ISR mit IVR-Zugriff:
__irq void ISR_periph (void)   //executed every time a peripheral IR occurs
{       
  tempvar = *AT91C_AIC_IVR;    //reading IVR as entry point of ISR

  if ( *AT91C_PITC_PISR )          //IR caused by Periodic Interval Timer ?  
  {           
    count++;

    if (count >= 2)    
    {  
      SET_PWR_LED(ON);            
    }   

    *AT91C_AIC_ICCR    = 0x00000002;  //clear the IR-Bit
    tempvar   = *AT91C_PITC_PIVR;    //reading PIVR resets the timer ir

  }

  *AT91C_AIC_EOICR   = 0xFFFFFFFF;   //end of IR
}

Ergebnis: die ISR wird nur noch ein einziges Mal angesprungen. Das 
stelle ich dadurch fest, dass da die LED nun nur noch angeht, wenn ich 
"SET_PWR_LED(ON);" vor der if-Bedingung ausführe.

Hat irgendjemand einen Tip für mich, wodran es hapert? Spielt das 
"__irq" möglicherweise eine Rolle? Habe das in anderen Beispielen so 
bisher nie gesehen. Lasse ich das weg, gelingt mir aber auch ohne den 
IVR-Zugriff kein zyklisches Aufrufen der ISR.

Gruß,
Tom

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.