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 ?
Es reicht auch nur einer der Interrupt, einfach in der Interruptroutine die 4 Taster (Ports) abfragen um den/die richtigen Taster zu detektieren.
// 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?
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?
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.
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
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.
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...
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.