Xmega Interrupts

OP #4975841
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 ?
OP #4975856
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?
OP #4975875
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?
#4976318
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
(Firma: TravelRec.) Persönliche Seite #4976423
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.
Gast #4976464
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...
(Firma: TravelRec.) Persönliche Seite #4976632
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.

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