Forum: Mikrocontroller und Digitale Elektronik Probleme mit Interrupt AT91SAM7X


von Frederic (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle

Ich arbeite mich gerade in den At91san7x ein und versuche schon seit 
drei tagen einen Interrupt auszulösen doch es will einfach nicht 
gelingen.

als IDE Benutze ich Keil MDK mit dem Debuger ULINK ME im Anhang Sind 
noch ein par Bilder mit den Registerzustände.
1
//main.c
2
3
#include <AT91SAM7X256.H>
4
#include "AT91SAM7X-EK.h"
5
6
#define INTTAST = AT91B_SW1;
7
8
void ex_int_handler (void){
9
  volatile unsigned int dummy;
10
  dummy = AT91C_BASE_PIOA->PIO_ISR;
11
  AT91C_BASE_AIC->AIC_EOICR=AT91C_BASE_TC0->TC_SR;
12
  AT91C_BASE_AIC->AIC_ICCR=(1<<AT91C_ID_TC0);
13
  *AT91C_AIC_EOICR=0;
14
  AT91C_BASE_PIOB->PIO_CODR=AT91B_LED1;// LED1 hier zum Int.-Test anmachen
15
  AT91C_BASE_AIC->AIC_EOICR = 0;
16
}
17
18
int main(void){
19
  int io_status;
20
  // Enable the Clock of the PIO
21
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
22
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOB;
23
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_SYS;
24
25
  // Configure the PIO Lines corresponding to LED1..LED4 as Outputs
26
  AT91C_BASE_PIOB->PIO_PER  = AT91B_LED_MASK;
27
  AT91C_BASE_PIOB->PIO_OER  = AT91B_LED_MASK;
28
29
  // Clear the LED's. On the Board we must apply a "1" to turn off LEDs
30
  AT91C_BASE_PIOB->PIO_SODR = AT91B_LED_MASK;
31
32
  //Init Interrupt
33
  AT91C_BASE_PIOA->PIO_PER=AT91B_SW1;
34
  AT91C_BASE_PIOA->PIO_ODR =AT91B_SW1;
35
  AT91C_BASE_PIOA->PIO_CODR=AT91B_SW1;
36
  AT91C_BASE_PIOA->PIO_PPUER=AT91B_SW1;
37
  AT91C_BASE_PIOA->PIO_ASR=AT91B_SW1;
38
  AT91C_BASE_PIOA->PIO_OWDR=AT91B_SW1; 
39
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA]=AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 0; 
40
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA]=(unsigned int)ex_int_handler; 
41
  AT91C_BASE_PIOA->PIO_IFER=AT91B_SW1; 
42
  io_status = AT91C_BASE_PIOA->PIO_ISR; 
43
  AT91C_BASE_AIC->AIC_IECR=(1 << AT91C_ID_PIOA);
44
  AT91C_BASE_AIC->AIC_ISCR=(1 << AT91C_ID_PIOA); //Test
45
  AT91C_BASE_AIC->AIC_ICCR=0;
46
  AT91C_BASE_PIOA->PIO_IER=AT91B_SW1;
47
  
48
  for(;;){
49
    if ((AT91C_BASE_PIOA->PIO_PDSR & AT91B_SW3) == 0) {       /* Check if SW3 is pressed */
50
      AT91C_BASE_PIOB->PIO_CODR = AT91B_LED2;      /* Turn On LED2 */
51
    }
52
    if ((AT91C_BASE_PIOA->PIO_PDSR & AT91B_SW4) == 0) {             /* Check if SW4 is pressed */
53
      AT91C_BASE_PIOB->PIO_SODR = AT91B_LED2;      /* Turn Off LED2 */
54
    }  
55
  }
56
}

Danke für eure hilfe ich weis so langsam wirklich nicht mehr weiter.

von Stephan (Gast)


Lesenswert?

Hi

ich hab mal drüber geschaut konnte den Fehler aber nicht finden. :-(
Dein Code sieht etwas anders aus als in den Beispielen von Atmel.
Lade dir diese doch mal runter und lass das Beispiel
'getting-started-project-at91sam7x' auf deinen Board laufen und schau ob 
es läuft. (dort kann man auch die DEBUG Messages gut sehen)

Wenn nein dann melde dich noch mal.

mfg
Stephan

von Kristof K. (Firma: HS Bochum) (kosh)


Lesenswert?

Frederic schrieb:

>   AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA]=(unsigned int)ex_int_handler;

hier fehlen die Klammern beim Handler

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.