Gast
#4176734
Moin moin, ich verzweifle seit ein paar Tagen an meinem MSP430F5529 Launchpad... Folgendes Programm soll auf Tasterdruck den Modus zwischen 1 - 4 wechseln und je nachdem die LEDs in unterschiedlicher Art und Geschwindigkeit blinken lassen... Soweit so gut funktioniert auch alles. Leider werden aber (ca jeder 3.) Status bei Tasterdruck übersprungen. Es scheint so als würde der Taster Interrupt mehrfach ausgelöst werden. Die Versuche den Taster mittels Timer zu Entprellen brachten etwas Besserung...jedoch werden immernoch Stati übersprungen. Habe ich beim Entrpellen irgendwo einen Fehler drin?? Viele Grüße und Danke im voraus Martin Hier der Code: #include <msp430.h> unsigned count = 62000; volatile unsigned int modus = 0; void initialize_LEDS(void) { P1DIR |= 0x01; // LED links = P1.0 P4DIR |= 0x80; // LED rechts = P4.7 P1OUT &=~0x01; // LED links ausschalten P4OUT &=~0x80; // LED rechts aus } void initialize_Taster(void) { P1REN |= 0x02; // P1.1 internen Pullup aktivieren P1OUT |= 0x02; // P1.1 internen Pullup auf VCC P1IE |= 0x02; // P1.1 Interrupt enable P1IES |= 0x02; // P1 hi/lo-Flanke P1IFG &= ~0x02; // P1.1 IFG lˆschen } void initialize(void) { // --------------- Initialisierung --------------------- WDTCTL = WDTPW + WDTHOLD; // Watchdog nicht benutzen TA1CTL = TASSEL_1+ID_0+MC_2+TACLR+TAIE; TA1R = count; TA1CTL &=~TAIE; // disable Timer A IR _BIS_SR(GIE); // Interrupts global freigeben } void sleep(unsigned int round) { for (unsigned int j=round;j>0;j--) for(unsigned int i=50000;i>0;i--); // Delay } void main(void) { // --------------------- Hauptprogramm mit main loop --------- initialize(); initialize_Taster(); initialize_LEDS(); modus = 0; while(1) { if (modus==0) { sleep(4); P1OUT ^= 0x01; P4OUT &=~0x80; } else if (modus==1) {sleep(3); P1OUT &=~0x01; P4OUT ^= 0x80; } else if (modus==2) {sleep(2); P1OUT ^= 0x01; P4OUT ^= 0x80; } else if (modus==3) {sleep(1); P1OUT &=~0x01; P4OUT ^= 0x80; } } } #pragma vector=PORT1_VECTOR // ----------- Interrupt Service Routine ----------- __interrupt void Port1_Interrupt (void) { P1IE &=~0x02; // P1.1 Interrupt disable TA1IV &= 0x00; TA1R = count; TA1CTL |=TAIE; // enable Timer A IR P1IFG &= ~0x02; // P1.1 IFG lˆschen if (modus<3) modus++; else modus = 0; } #pragma vector=TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR(void) { switch (__even_in_range(TA1IV, 14)) { case 0: break; // No interrupt case 2: break; // CCR1 not used case 4: break; // CCR2 not used case 6: break; // reserved case 8: break; // reserved case 10: break; // reserved case 12: break; // reserved case 14: P1IFG &= ~0x02; // P1.1 IFG lˆschen P1IE |= 0x02; // P1.1 Interrupt enable P2IFG &= ~0x02; // P2.1 IFG lˆschen P2IE |= 0x02; // P2.1 Interrupt enable TA1IV &= 0x00; TA1R = 0; TA1CTL &=~TAIE; // disable Timer A IR break; default: break; } }