Forum: Mikrocontroller und Digitale Elektronik xmega externer interrupt wird nicht ausgeführt


von Sebi (Gast)


Lesenswert?

Hallo,

ich versuche über einen I2C-Expander eine 10er Tastatur einzulesen. Die 
Leseroutine soll durch ein /INT vom PCF8574 an PORTA PIN6 aufgerufen 
werden. Die Leseroutine der Tastatur <Taste()> funktioniert wenn ich 
diese im Programm direkt aufrufe. Jetzt wollte ich diese Funktion mit 
dem PORTA PIN6 Interrupt aufrufen. Funktioniert jedoch nicht. Fehlt in 
meiner Konfiguration noch etwas? Ich bin zur Zeit ziemlich ratlos.

Für eure Hilfe an dieser Stelle schon mal herzlichen Dank.

Hier mein Code.
1
void main(void)
2
{
3
  OSC_INIT();
4
  io_init();
5
  PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
6
  // Interrupt für PortA auf high Level setzen
7
  PORTA_INTCTRL |= PORT_INT0LVL_HI_gc;
8
  PORTA.INT0MASK = 0b01000000;
9
  PORTA.PIN6CTRL |= PORT_OPC_WIREDANDPULL_gc | PORT_ISC_FALLING_gc;
10
  sei();
11
  // PORTA PIN 7 auf Augang setzen
12
  PORTA.DIR = 0b10000000;
13
  // PORTA Pin 6 auf Eingang schalten
14
  PORTA.DIR &= ~PIN6_bm;
15
  // Pullup Widerstand einschalten
16
  PORTA.OUT |= PIN6_bm;
17
  //  INT_Init();
18
  //  TWI Schnittstelle auf Port E setzen
19
  TWI_MasterInit(&TWIE);
20
  // Tasterwurzeln auf low und Schaltpin's auf high setzen, damit /INT von PCF8574 ein Interrupt auslösen kann
21
  PCF8574_send_byte(&TWIE,PCF8574,Spalte1_3);
22
    while(1)
23
    {
24
    PORTD.OUTTGL = PIN6_bm;
25
//    temp = Taste();
26
    _delay_ms(200);
27
    }
28
}
29
30
ISR(PORTA_INT0_vect)
31
{
32
  
33
  PORTD.OUTTGL = PIN6_bm;
34
  temp = Taste();
35
  //Code
36
}

Gruß
Sebi

von Johann (Gast)


Lesenswert?

Wenn ich das richtig sehe, dann ist Pin6 als Eingang und an diesem Pin 
soll der externe Interrupt anliegen.

Hier ist bereits ein Fehler:
1
// PORTA PIN 7 auf Augang setzen
2
PORTA.DIR = 0b10000000;
3
// PORTA Pin 6 auf Eingang schalten
4
PORTA.DIR &= ~PIN6_bm;
5
// Pullup Widerstand einschalten
6
PORTA.OUT |= PIN6_bm;
1
// PORTA PIN 7 auf Augang setzen
2
// PORTA Pin 6 auf Eingang schalten
3
PORTA.DIR = 0b10000000;

Hier schaltest Du Pin 6 der eigentlich der Eingang ist.
Du hast jedoch Pin 7 als Ausgang definiert
1
ISR(PORTA_INT0_vect)
2
{
3
  
4
  PORTD.OUTTGL = PIN6_bm;
5
  temp = Taste();
6
  //Code
7
}

Hier das gleich Pin 6 ist Eingang und kann daher nicht vom 
Mikrokontroller verändert werden.
Nur Pin 7 der als Ausgang definiert ist kann vom Mikrocontroller 
verändert werden
1
while(1)
2
    {
3
    PORTD.OUTTGL = PIN6_bm;
4
//    temp = Taste();
5
    _delay_ms(200);
6
    }

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.