Hallo ich verwende den mspgcc und einen M430F149. Ich habe da noch ein Problem mit dem MSP430 und dessen Interrupts: Wann wird der Interrupt beim MSP430 ausgelöst? Ich habe nämlich das Problem das alle X-Mal der Interrupt ausgelöst wird wenn die Taste losgelassen wird. Was ja im Prinzip kein allzu großes Problem ist. Jetzt will ich aber einen Schrittmotor damit steuern der solange P1.1 gedrückt ist nach links läuft und solange P1.2 gedrückt ist nach rechts laufen. Da stört mich der Umstand das der Interrupt erst beim loslassen der Taste ausgelöst wird ziemlich. Hier die Initialisierung meines PORTS Es wird nur P1.1 und P1.2 als Interrupt initialisiert. P1DIR = 0xF9; //Port1 als Eingang verwenden P1IE = 0x06; //PORT1 Interrupt Enable Flag P1SEL = 0xF9; //PORT1 Modul select Flag P1IFG = 0x00; //PORT1 Interrupt Flag P1IES = 0xF9 ; //PORT1 Interrupt Edge select (0=pos 1=neg) Oder habe ich insgesammt ein riesen Denkfehler drin? Die Tasten habe ich nachgemessen, die sollten das richtige tun. cu chege
Ich habe jetzt nicht lange drüber nachgedacht, aber das hört sich nach falschem IES an... Gruß, Patrick... P.S.: Korrigiert mich, wenns falsch ist ;)
@ OldBug Meines Wissens müsste ich die den PORT richtig initialisiert haben. Hier ein ausführliches Beispiel: #include <msp430x14x.h> #include <io.h> #include <signal.h> #include <iomacros.h> #define KEY_INPUT P1IFG #define MASK 0x06 //Maskierung nur P1.1 und P1.2 void delay(unsigned int d); //Prototyp für delay(...) int main(void) { WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer P5DIR = 0xFF; //Port5 (LEDS) alle PINS auf Ausgang schalten "1111 1111" P1DIR = 0xF9; //Port1 als Eingang verwenden P1IE = 0x06; //PORT1 Interrupt Enable Flag P1SEL = 0xF9; //PORT1 Modul select Flag P1IES = 0x00; //PORT1 Interrupt Edge select (0=pos 1=neg) P5OUT = 0xFF; // Alle LEDS an _EINT(); //Enables Interrupts for(;;) //Endlosschleife { nop(); delay(65500); // Delay } return(0); } void delay(unsigned int d) { volatile int i; for(i = 0; i < d; i++) nop(); } interrupt(PORT1_VECTOR) intServiceRoutine(void) { P5OUT = 0x00; // LEDS aus P5OUT = P1IFG & MASK; // IFG Maskiert P5OUT = P5OUT << 5; // LED 6&7 = P1IFG P5OUT = P5OUT | (~P1IN & MASK); // LED 1&2 = P1IN P1IFG = 0x00; //Verlassen des Interrupts }
Hallo Christian! Wie ist denn Dein Taster an P1.1 bzw P1.2 angeschlossen? Wird der Pin per PullUp gegen Versorgungsspannung gehalten, und der Taster legt den Pin dann auf low, oder wird der Pin per PullDown gegen GND gehalten, und der Taster legt den Pin auf high?
Also ich bin eher der Programmierer nicht so der Hardware Mensch ;-) Vielleicht hilft Dir das ja schon weiter, ich habe das DEMO Board von ELV. Gab es günstig bei Ebay sonst hätte ich es mir nicht gekauft. So ist das Teil beschaltet: (P1.2 P1.4 Analog) R24 10kOhm ____ VCC 3.2 V o---|______|-------o-------------------> MSP430 | |-D Taster P1.1 ... | GND o------------------|----------- __|__ ----- - Das müsste dann PullUp sein oder ? thx chege
Schade hat er total zerhauen ;-( Ich häng ein Bild mit dran! cu chege
Hm, Probiers mal damit: P1IES |= BIT0; /* Interrupt on falling edge */ Gruß, Patrick...
Hi Christian, Also ausser P1IES, müsste bei Dir v.a. P1SEL falsch gesetzt sein. Die Port 1 Pins mit Tasten dran müssten eigentlich im P1SEL auf 0 gesetzt werden, d.h. die müssen als ganz normaler IO konfiguriert sein. Bei mir (MSPGCC) kommt sonst jedenfalls überhaupt kein Interrupt auf Tastendruck. Gruss, Oli
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.