Moin,
ich versuche gerade meinen AT91-Sam7EX256 dazu zu bringen eine bestimmte
Funktion auszuführen, wenn an einem Pin (PA29) vom PioB ein
Flankenwechsel von Low auf High bzw. umgekehrt eintritt.
Da der Flankenwechsel evtl. sehr schnell auftritt würde ich das gerne
mit dem FIQ machen, versuche mich aber erstmal am normalen IRQ. Nur
leider klappts net. Der Prozi bleibt in der ISR hängen und kommt nicht
wieder raus. Habe schon den ganzen Vormittag nach HowTo's oder
Code-Exampeln gesucht, welche aber alle nur über den Timer Counter reden
- bring mir aber nix. Ich brauch ja den Externen Interrupt. Mein Code
sieht gerade so aus:
1 | void initISR(void){
|
2 | *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA) | /* Enable Clock for PIO */
|
3 | (1 << AT91C_ID_IRQ0); /* Enable Clock for IRQ */
|
4 |
|
5 | //First disable IRQ for PIOA
|
6 | AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_PIOA;
|
7 | //Save interrupt handler routine vector
|
8 | AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int)ISR_Test;
|
9 |
|
10 |
|
11 | //Store in Source Mode Register, set priority
|
12 | AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST;
|
13 |
|
14 | //Enable den Interrupt für Pin29
|
15 | AT91C_BASE_PIOA->PIO_IER = (AT91C_PIO_PA29);
|
16 |
|
17 | //Re-enable the interrupt
|
18 | AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_PIOA);
|
19 |
|
20 | }
|
Die Aufgerufene Funktion ISR_Test() enthält lediglich eine Debug ausgabe
für ein FTDI Kabel (bisher). Die Funktion wird aufgerufen sobald die
initISR(); Funktion aufgerufen wird - allerdings nur einmal. Also nicht
wiederholt.
Fehlt mir in der ISR sowas wie eine Rücksprungadresse? Register Sichern?
Macht der ARM das nicht selbst? Ich übernehm jetzt mal keine Garantie
das alles was da oben steht auch wichtig ist - eigentlich bin ich ja
mehr HighLevel...
Vielleicht hat ja jemand von euch ein Codebeispiel für eine ISR mit
externem Interrupt (also ein von einem PIN)
Regards,
Kalle