mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA externer Interrupt


Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interruptvektor?

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, ist mir auch gerade aufgefallen und hab ich geändert

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

Läuft aber leider trotzdem noch nicht

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe mal davon aus, dass die Initialisierung des Port-Interrupts 
noch nicht ganz stimmt. Für Tips wäre ich sehr dankbar.

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich PORTB als Eingang konfigurieren, damit ich an ihm einen 
externen Interrupt empfangen kann?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast noch vergessen, bei welcher Flanke der Interrupt triggern soll.

Register: PORTB_PIN0CTRL

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Muss ich PORTB als Eingang konfigurieren, damit ich an ihm einen
>externen Interrupt empfangen kann?

Ja. Sonst kannst Du nur Interrupts detektieren, die die Firmware selbst 
auf den Pin schreibt.

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Re To (toobatch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hatte gerade  ähnliches Problem ...

hatte nur die
#include<avr\interrupt.h> 

vergessen ... der compiler hat weiter nicht gemeckert ... aber die 
Sprungadresse hat nicht gepasst.

also mal überprüfen ob du die zeile drinne hast

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, die hab ich drinne und natürlich auch avr\io.h ;-)

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müssen die Initialisierungen vielleicht in einer bestimmten Reihenfolge 
vorgenommen werden?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interruptcontroller muß vor dem 'SEI' initialisiert sein.

Autor: Alex B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber auch die ISR die durch den Timer-Interrupt aktiviert werden soll 
läuft nicht. Scheinbar scheinen sich die beiden Interrupts irgendwie 
gegenseitig zu stören.

Autor: Re To (toobatch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bis auf die wenigen dokumentierten Errata macht der Controller alles 
richtig ;-). Zum Glück helfen Datenblatt und Manual. Man muß aber recht 
viel hin- und herblättern.

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.