Hallo zusammen, ich habe ein kleines Problem. Es gelingt mir nicht, einen Interrupt zu erzeugen, bzw. zu detektieren. Ich habe eine LED an den Ausgang Pin 2.7 angeschlossen. Die LED ist über einen Widerstand auf Masse gelegt, sollte also leuchten, wenn der Ausgang auf high liegt. Das funktioniert auch schon mal. Gleichzeitig habe ich einen Taster über einen 1,8kohm Widerstand auf 3,3Volt gelegt und an den Pin 1.0 angelegt. Der Pin ist auch über ca. 250kohm auf Masse. Also sollten an Pin 1.0 entweder 0V, bzw. im Falle eines betätigten Schalters 3,3Volt liegen. Nun versuche ich, die LED nach Programmstart leuchten zu lassen und über einen Interrupt an P1.0 (steigende Flanke) die LED aus zu machen. Dazu nutze ich folgenden Code unter IAR: _______________________ #include <msp430x16x.h> int main( void ) { WDTCTL = WDTPW + WDTHOLD; //watchdog aus P2DIR=0xFF; //port 2 = Output P2SEL=0x00; //alle ports als GPIO P2IE=0x00; //Port 2 interrupt ausmachen P2OUT=0x02; //initial alle LEDs aus (P2.1 LED is active low) P1DIR=0x00; //P1 alle als input P1SEL=0x01; //P1.0 as GPIO P1IE=0x01; //P1.0 interrupt einschalten P1IES=0xFF; //interrupt on rising edge _BIS_SR(GIE); //Interrupts aktivieren P2OUT=0x82; //LED einschalten for(;;) //Warteschleife { } } #pragma vector=PORT2_VECTOR __interrupt void Port_2(void) { P2OUT&=~0x82; //LED ausschalten P1IFG&=~0x00; //Interrupt flag löschen } _____________________________ Leider funktioniert es nicht so, wie es sollte. Es wird kein Interrupt an P1.0 detektiert und die LED leuchtet immer. Ich habe im Debug-Modus unter IAR festgestellt, das einige Male ein Reset ausgelöst wurde, was ich mir jedoch nicht erklären kann. Wer hat eine Idee, was ich falsch mache? Vielen Dank schon einmal für evtl. Tips. Gruß, Björn
1 | #pragma vector=PORT2_VECTOR
|
2 | __interrupt void Port_2(void) |
Interrupt an Port1 oder 2???? ;)
Ups. Danke für den Hinweis. Habe es umgeschrieben auf: #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) Gerade mal eben getestet, aber da ist wohl immer noch was im Argen. Es wird durch die Taste immer noch kein Interrupt ausgelöst...
> P1SEL=0x01; //P1.0 as GPIO P1SEL muss '0' sein für I/O-Funktion der Pins ! Mit P1SEL = 0x01 wählst Du für P1.0 die Peripheral-Funktion TACLK-input aus! > P1IES=0xFF; //interrupt on rising edge eben genau anders herum: P1IES = 0x00 für low-to-high transistion! >P1IE=0x01; //P1.0 interrupt einschalten Dies erst nach P1IES setzen, da sonst u.U. ein IRQ ausgelöst werden kann. Vorher P1IFG löschen! > #pragma vector=PORT2_VECTOR > __interrupt void Port_2(void) > { > P2OUT&=~0x82; //LED ausschalten > P1IFG&=~0x00; //Interrupt flag löschen > } Interrupt flag löschen: P1IFG &= ~0x01; Das steht aber alles im User-Guide. Stefan
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.