XMEGA externer Interrupt

Gast #996190
Lesenswert?

Hallo,

ich möchte bei meinem XMEGA128A1 (AVR Studio 4, GNU C, STK600) einen 
externen Interrupt über PORTB Pin0 auslösen.
Hier mein Code

uint8_t temp;
int main(void)
{

  // internen Oszillator auf 32MHZ einstellen
  OSC.CTRL = 3;
  while(OSC.STATUS != 3)
  {
  }
  CCP = 0xD8;
  CLK.CTRL = 1;

  temp = 255;

  // Interrupts aktivieren und alle Level freigeben
  sei();
  PMIC.CTRL=0x07;

  //LEDS initialisieren
  PORTA.DIR = 0xFF;
  PORTA.OUT = 0xFF;

  //TASTER initialisieren
  PORTB.DIR = 0x00;
  //Interrupt Level an PORTB festlegen
  PORTB.INTCTRL = 0x03;
  //Interrupt an PORTB PIN0 freigeben
  PORTB.INT0MASK = 0x01;

  while(1)
  {
  }

}

ISR (PORTB_INTFLAGS_INT0IF)
{
  if (temp > 0)
  {
    temp--;
    PORTA.OUT = temp;
  }
  else
  {
    temp = 255;
  }
}

Das Interrupt Flag INT0IF wird auch gesetzt, aber die ISR wird nicht 
gestartet.
Gast #996303
Lesenswert?

OK, jetzt sieht die Initialisierung folgendermaßen aus:

//TASTER initialisieren
PORTB.DIR = 0x00;
//Interrupt Level an PORTB festlegen
PORTB.INTCTRL = 0x03;
//Interrupt an PORTB PIN0 freigeben
PORTB.INT0MASK = 0x01;
//Interrupt auf fallende Flanke einstellen
PORTB.PIN0CTRL = 0x02;

Aber leider gehts immer noch nicht und ich glaub auch nicht, dass das 
der Grund gewesen sein könnte, da das Register ja standardmäßig auf 0x00 
steht und damit sowohl auf fallende als auch auf steigende Flanke 
reagiert werden sollte.
Gast #996430
Lesenswert?

Ok, danke, das ist gut zu wissen. Da kommt dann wohl auch mal wieder 
durch, dass ich blutiger Anfänger bin.

Jetzt hab ich aber noch in meinem Programm nen Timer am laufen. Und 
eigenartigerweise funktioniert der externe Interrupt nur, wenn ich den 
Timer rauslasse. Sobald ich den Timer initialisiere funktioniert der 
externe Interrupt nicht mehr.
Angehängte Dateien:
#996461
Lesenswert?

guck doch mal im  avr simulator (disassembler) deines Programms nach wo 
die sprünge von der IRQ-Tabelle aus hingehen ...  ob das ungefähr was er 
an der sprungadresse tut - mit deinem dort auszuführenden aufgaben in 
der ISR zusammenhängen kann ... oder ob er sonstwo hinspringt.
Gast #996466
Lesenswert?

Fehler gefunden: Ich hatte in der ISR des Timers das _vect bei ISR 
(TCC0_OVF_vect) vergessen. Daher konnte natürlich die Timer ISR nicht 
laufen. Warum dadurch aber auch die ISR des externen Interrupts nicht 
lief ist mir trotzdem ein Rätsel. Aber jetzt läufts.
Gast #996620
Lesenswert?

Das viele hin- und herblättern ist auch das, was einem Anfänger wie mir 
zu schaffen macht. Es ist halt gar nicht so einfach, zu selektieren 
welche Infos gerade wichtig sind und welche nicht. Und an was man alles 
gerade denken muss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren