Forum: Mikrocontroller und Digitale Elektronik Xmega Interrupts


von Tho S. (thoso805)


Lesenswert?

Hallo,

ist jemand da der mir erklären kann was es mit den Interrupt Vektoren 
auf sich hat?

Ich habe 4 Taster an PORT A angeschlossen, merke aber grade dass es wohl 
nur 2 Interrupt Vektoren gibt. Also 2 Taster bekomme ich ohne Probleme 
zum laufen.

Gibt es einen Trick ?

von XMeganer (Gast)


Lesenswert?

Es reicht auch nur einer der Interrupt, einfach in der Interruptroutine
die 4 Taster (Ports) abfragen um den/die richtigen Taster zu 
detektieren.

von Tho S. (thoso805)


Lesenswert?

// Initialisierung der Interrupts
void int_init(void)
{
  cli();

  //Externe Interrupts
  PORTA.DIRCLR = PIN2_bm;              // PA2 as Input
  PORTA.DIRCLR = PIN3_bm;              // PA3 as Input
  PORTA.DIRCLR = PIN4_bp;              // PA3 as Input
  PORTA.DIRCLR = PIN5_bm;              // PA3 as Input
  PORTA.PIN2CTRL  = PORT_OPC_WIREDANDPULL_gc;    // Pull-up Widerstand 
aktiviert
  PORTA.PIN3CTRL  = PORT_OPC_WIREDANDPULL_gc;    // Pull-up Widerstand 
aktiviert
  PORTA.PIN4CTRL  = PORT_OPC_WIREDANDPULL_gc;    // Pull-up Widerstand 
aktiviert
  PORTA.PIN5CTRL  = PORT_OPC_WIREDANDPULL_gc;    // Pull-up Widerstand 
aktiviert
  PORTA.PIN2CTRL |= PORT_ISC_FALLING_gc;      // interrupt bei fallender 
Flanke
  PORTA.PIN3CTRL |= PORT_ISC_FALLING_gc;      // interrupt bei fallender 
Flanke
  PORTA.PIN4CTRL |= PORT_ISC_FALLING_gc;      // interrupt bei fallender 
Flanke
  PORTA.PIN5CTRL |= PORT_ISC_FALLING_gc;      // interrupt bei fallender 
Flanke
  PORTA.INTCTRL  |= PORT_INT0LVL_LO_gc;      // Interrupt LoLevel für 
PORTA und INT0MASK freigeben
  PMIC.CTRL      |= PMIC_LOLVLEN_bm;
  PORTA.INT0MASK  = PIN2_bm;            // PA2 interrupt 0
  PORTA.INT0MASK  = PIN3_bm;            // PA3 interrupt 0
  PORTA.INT0MASK  = PIN4_bm;            // PA4 interrupt 0
  PORTA.INT0MASK  = PIN5_bm;            // PA5 interrupt 0


  sei();

}


// Interrupt 0 Taster 1,
ISR(PORTA_INT0_vect){

  if (!(PORTA.IN & PIN2_bm))
  {
    lcd_clear_char(10, 50);



  }


  if (!(PORTA.IN & PIN3_bm))
  {
    lcd_clear_char(10, 50);



  }
}

so passiert noch nicht viel.
Meintest du es so?

von Tho S. (thoso805)


Lesenswert?

Ok funktioniert.

Es lag an der Initialisierung

PORTA.DIRCLR = PIN2_bm | PIN3_bm;

PORTA.INT0MASK  = PIN2_bm | PIN3_bm;



vorher war:

PORTA.DIRCLR = PIN2_bm;
PORTA.DIRCLR = PIN3_bm;

PORTA.INT0MASK  = PIN2_bm;
PORTA.INT0MASK  = PIN3_bm;

ich dachte durch das beschreiben des Registers PORTA.DIRCLR werden 
andere Bits nicht berührt?

Stimmt das nicht?

von P. M. (mikro23)


Lesenswert?

Bei DIRCLR hast Du richtig gedacht, bei INT0MASK nicht.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Aber Taster abfragen über Interrupts...? Ich weiß nicht so recht...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Knut B. schrieb:
> Ich weiß nicht so recht...

Naja, für die Wissenschaft und um sich mit den Interruptquellen zu 
beschäftigen, kann man das mal machen. Die richtige Methode mit Timer 
sollte man später trotzdem implementieren.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Knut B. schrieb:
> Aber Taster abfragen über Interrupts...? Ich weiß nicht so recht...

Genau ... pollen wäre da viiieeel besser !!!1elf1

Wenn Dir die Abfrage per Interrupt ungelegen kommt - ganz klar: Dein 
Problem
Wenn Du eine bessere Lösung hast - ganz klar: lass die Anderen dumm 
sterben

Merkst Du eigentlich noch was?

Weiter: Warum soll ich einen Taster periodisch abfragen, wenn Dieser 
ggf. nur alle Stunde Mal gedrückt wird?
Ja, der µC ist ja schnell genug, Der hat auch dafür Zeit.

Bitte, wenn schon nicht für toll befunden, dann bitte eine Alternative 
nennen.
Wenn schon eine Alternative genannt wird, dann auch den Blöden unter uns 
aufzeigen, was damit besser geht.

Wenn sich ein 'pin changed', was spricht gegen einen 'pin change 
Interrupt'?

Die Leute können hier nur besser werden, wenn Ihr Euer Wissen weiter 
gebt - befürchte aber, bis hier hin liest eh kaum Einer ...

MfG

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Patrick, komm mal wieder 'runter. Das Forum, insbesondere die 
Codesammlung, ist voll davon, wie man Taster abfragt. Die Interruptpins 
an Tastern haben genau einen Zweck: den Controller bei Bedarf zu wecken, 
wenn er im Tiefschlaf ist. Da muss man beim XMega aber aufpassen, denn 
nur die asynchronen IRQ-Pins können dazu genutzt werden. Das ist anders 
als bei den PCINT-Pins der Megas und Tinies. Wenn man keine 
Low-Power-Anwendung hat oder der Controller bereits wach ist, werden 
Taster gepollt, und zwar mittels periodischem Timer-Interrupt alle 
1...10ms. Die Entprellung muss ja auch auf festen Intervallen basieren, 
sonst ist das alles Murks. Guck in die Codesammlung, da steht alles 
darüber drin und da muss man nicht alles 1.000 Male wiederkäuen.

von c-hater (Gast)


Lesenswert?

Knut B. schrieb:

> Die Interruptpins
> an Tastern haben genau einen Zweck: den Controller bei Bedarf zu wecken,
> wenn er im Tiefschlaf ist. Da muss man beim XMega aber aufpassen, denn
> nur die asynchronen IRQ-Pins können dazu genutzt werden. Das ist anders
> als bei den PCINT-Pins der Megas und Tinies.

Nicht wirklich. Auch bei den Megas und Tinys gibt es genug (ältere) 
Devices, die nur recht wenige asynchrone Edge-Interrupts bieten.

Man kann das so deuten: Während bei den klassischen AVRs die Entwicklung 
stetig weiter ging, waren die ATXMega wohl doch mehr oder weniger 
Totgeburten. Zu wenig Nutzer, um deren Entwicklung signifikant 
voranzutreiben. Und das trotz der sehr guten Architektur der XMegas, die 
durchaus viele Vorteile gegenüber der der klassischen AVRs bietet.

Offensichtlich waren also andere Eigenschaften der klassischen AVR für 
die Kunden relevanter. Ich würde mal darauf tippen: 5V-capable, auch im 
DIL-Gehäuse verfügbar...

Mal sehen, wie das bei Mikrochip jetzt weiter geht. Die neuen Tinys 
überzeugen mich jedenfalls nicht, auch wenn sie den mächtigen Core der 
XMega besitzen. Wenn die Entwicklung unter Mikrochip weiter in diese 
Richtung geht, dann ist wohl absehbar, dass es am Ende doch eher auf 
kleine ARMs hinausläuft. Die haben zwar auch alle Nachteile der der 
XMega gegenüber den Classic-AVR, aber sie sind dafür einfach mal 
schneller und obendrein auch noch billiger...

von w.n. (Gast)


Lesenswert?

c-hater schrieb:
> Die neuen Tinys
> überzeugen mich jedenfalls nicht, auch wenn sie den mächtigen Core der
> XMega besitzen.

Habe ich eine News hier verpasst? Welcher Tiny hat einen Xmega-Core?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?


von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

c-hater schrieb:
> Man kann das so deuten: Während bei den klassischen AVRs die Entwicklung
> stetig weiter ging, waren die ATXMega wohl doch mehr oder weniger
> Totgeburten.

Das ist Deine Meinung. Wir setzen die XMegas seit 2009 auch in 
kommeziellen Produkten ein. Hierbei überzeugen die inneren Werte. Wer 
heute immer noch an 5V und DIL-Gehäuse festhält, ist ohnehin als Käufer 
uninteressant für den Hersteller.

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.