2017-10-04 1 views
1

Ich arbeite zur Zeit mit den MSP430G2553, die in C.
Aus irgendeinem Grunde codiert scheine ich bei Codierung Grunde For und While Schleifen schrecklich zu sein, und ich kann nicht herausfinden, wie eine While Schleife länger dauern machen nach jeder Iteration abzuschließen.C-Code: Verlangsamung While-Schleife nach jeder Iteration?

Grundsätzlich habe ich beim Start eine LED mit 100ms blinken.

Wenn ich einen Knopf halte, möchte ich die LED immer langsamer blinken lassen, je länger ich den Knopf halte.

Wenn ich loslasse, sollte die LED ihre verlangsamte Blinkrate halten.

Dann wird mit einer zweiten Taste die LED-Blinkrate wieder auf 100 ms zurückgesetzt.

Momentan kann ich die LED-Anzeige langsamer machen, wenn ich den Knopf gedrückt halte, aber es geht nicht langsamer. Ehrlich gesagt bin ich mir nicht sicher, wie ich das machen soll, also habe ich hier einen Account erstellt und gepostet.

for(;;) //loop forever 
{ 
    if((P1IN & BIT3)==BIT3) //if button is not pressed 
    { 
     i = 0; 
     a = 4000; //At 10000, 4 cycles per second, or 250ms delay. 4000 cycles = 100ms or 10Hz delay. 
     P1OUT ^= BIT0 + BIT6; //two LEDs 
     while(i < a) //delays LED blinking until while-loop is complete. 
     { 
      i = i + 1; 
     } 
    } 
    else if((P1IN & BIT3)!=BIT3) //if button is pressed 
    { 
     i = 0; 
     a = 10000; 
     P1OUT ^= BIT0 + BIT6; 
     while(i < a) //delays LED blinking until while-loop is complete. 
     { 
      a = a + 2; 
      i = i + 1; 
     } 
    } 
} 
+0

Danke Jungs, ich verstehe dass die CPU-Last wegen hässlicher For-Schleifen ziemlich voll sein wird, aber momentan bin ich anscheinend schrecklich darin, diese For-Schleifen in einen Interrupt-Block zu übertragen. Auch hatte ich einige Probleme, sogar die MSP430-Uhr Wert über einen längeren Zeitraum zu ändern. Im Moment versuche ich nur die Logik zu hacken, die benötigt wird, um dies zu erreichen, bevor ich in die richtige CPU-Codierung übersetze. – Martian

Antwort

1

Sie müssten eine „globale“ halten (außerhalb des for scope) Zähler verzögern Spur der letzten Tastendruck zu halten, oder die Verzögerung

int button1Pressed = 0; // "global" flag 
for(;;) 
{ 
    if((P1IN & BIT3) != BIT3) // if button pressed 
    { 
     button1Pressed = 1; 
    } 
    if((P1IN & BIT4) != BIT4) // hypothetical button 2 press 
    { 
     button1Pressed = 0; 
    } 
    int delay = 4000; 
    if(button1Pressed) 
    { 
     delay = 10000; 
    } 
    while(delay>0) { 
     delay = delay - 1; 
    } 
} 
Verwandte Themen