Forum: Mikrocontroller und Digitale Elektronik ARM-Interrupts/PIT laufen nicht


von Christophe T. (chrisjt)


Angehängte Dateien:

Lesenswert?

Servus,

ich versuche gerade den PIT meines at91sam7x zum Laufen zu überreden.
Anbei der Code meiner main-Routine. Jedoch wird nie die Service-Routine 
aufgerufen.

Ist der Code soweit in Ordnung, und falls ja, wo könnte ich weiter 
suchen?

Gruß,
Christophe

von A.K. (Gast)


Lesenswert?

Kann es sein, dass man in main() der CPU sagen muss, dass sie Interupts 
berücksichtigen soll? Oder macht das schon der Startup-Code?

von Christophe T. (chrisjt)


Angehängte Dateien:

Lesenswert?

Ich verwende die beiden Startup-Skripte, die ich mit einer anderen Demo 
erhalten habe. Zur Sicherheit sind sie hier noch angehängt.

Christophe

von A.K. (Gast)


Lesenswert?

Kurz quergelesen sehe ich dort nichts, was die Interrupt-Bits im CPSR 
steuert.

Wäre auch eher unüblich. Gängig ist, in main() bei abgeschalteten 
Interrupts loszulegen, um die erst nach der kompletten Initialisierung 
freizugeben.

von Steffen H. (Firma: www.shotech.de) (mc_sho) Benutzerseite


Lesenswert?

du hast einiges beim init des PIT vergessen. Dieser Code funktioniert 
bei mir.

void configure_pit(void)
{
  volatile unsigned long pimr = 0;

  /* Configure a resolution of 10 ms */
  //- Grundfrequenz 36,864000 MHz
  //- mck /16 /100Hz = 10ms

  //AT91C_BASE_PITC->PITC_PIMR = (MCK / (16 * 100)) - 1; //- 10ms - 
100Hz

  /* Enable interrupts */
  /* Disable the interrupt on the interrupt controller */
  AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_SYS);

  /* Save the interrupt handler routine pointer and the interrupt 
priority */
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) cmx_irq;
  /* Store the Source Mode Register */
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = 
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
  /* Clear the interrupt on the interrupt controller */
  AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SYS);

  /* Enable the interrupt on the interrupt controller */
  AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_SYS);

  /* Enable the interrupt on the pit */
  pimr = AT91C_BASE_PITC->PITC_PIMR;
  AT91C_BASE_PITC->PITC_PIMR = pimr | AT91C_PITC_PITIEN;

  /* Enable the pit */
  pimr = AT91C_BASE_PITC->PITC_PIMR;
  AT91C_BASE_PITC->PITC_PIMR = pimr | AT91C_PITC_PITEN;
}

Gruss

Steffen

von Christophe T. (chrisjt)


Lesenswert?

@Steffen: Genau das machen doch die ganzen AT91C/F-Kommandos.

@A.K.: Das wars. Ich dachte, dass durch das Setzen des AIC_IECR die 
Interrupts auch aktiviert würden. Dem ist wohl nicht der Fall, eine 
kleine Assemblerroutine macht das jetzt.

Merci!
Christophe

von A.K. (Gast)


Lesenswert?

Der Interrupt-Controller ist ein Periphieriebaustein, die beiden 
Interrupt-Flags sind hingegen Bestandteil des ARM7-Cores. Sind zwei 
völlig verschiedene Dinge.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.