Arduino Polska Forum
Zatrzymanie pętli - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Zatrzymanie pętli (/watek-zatrzymanie-p%C4%99tli)



Zatrzymanie pętli - JWydra - 08-05-2019

Jestem początkujący ale kiedyś programowałem w FORTRAN


int i=0;

void setup() {
  // put your setup code here, to run once:
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
Serial.begin(9600);
Serial.print(i);
}

void loop() {
  // put your main code here, to run repeatedly:

while(i<=255&&digitalRead(2)==LOW){
  analogWrite(9, i);
  if(digitalRead(2)==LOW)(i=i+1);
  delay(10);
  }

while(i>=0&&digitalRead(3)==LOW){
  analogWrite(9, i);
  if(digitalRead(3)==LOW)(i=i-1);
  delay(10);
  }
}


Jeżeli na pinie 2 mam stan niski program mi ładnie rozjaśnia żarówkę jeśli podczas rozjaśniania zdejmę LOW z pin 2 to proces się zatrzymuje. Jeśli na pinie 3 dam stan niski proces zachodzi odwrotnie. Dzięki warunkowi "while" mogłem "wizualnie" zatrzymać efekt ale pętla loop cały czas działa. Gdzie należy umieścić "Serial.print(i)" aby wyświetlić aktualną wartość "i" po zatrzymaniu. Czy da się zapisać tak kod aby program wykonał operację tylko raz?


RE: Zatrzymanie pętli - kaczakat - 08-05-2019

Niestety to wcale nie jest ładne bo na czas maksymalnie 255x(10ms+czas innych funkcji w while) program się zatrzymuje w tym punkcie. 2.5s to jest wieczność... Otwórz przykład z blinkWhitoutDelay, zamień 1000 na 10.
Potem zamiast zmieniać stan led wewnątrz tego warunku (jeśli od poprzedniej operacji upłynęło 10ms) na przeciwny zmieniaj rozjaśnienie żarówki w górę lub w dół. A wydruk możesz zrobić jeśli stan led się zmienił AND przycisk nie jest wciśnięty AND wcześniej był.
Jak będziesz potem robił mniej trywialny program i będziesz rozumiał ten mechanizm - zarządzać czasem, ale go "nie zatrzymywać", to upchasz wiele rzeczy w loop, które będą działały "jednocześnie" (dla nas patrzących z zewnątrz, żyjących w świecie sekund i minut) nie blokując się na wzajem.


RE: Zatrzymanie pętli - es2 - 09-05-2019

Wskazówki juz otrzymałeś od @kaczakat, pozbądź się konstrukcji:
Kod:
while(i<=255&&digitalRead(2)==LOW)
Bywa, że w powolnych uC, bez DMA inaczej się nie da, cóż tanio i dobrze (za pierwszym razem tanio). Z pewnością musisz zlikwidować:
Kod:
delay(10);
10ms to "wieczność" dla uC, nawet staruszka 8051 czy Z-80. Użyj przerwań od timera. Staraj się używać na max sprzętu.


RE: Zatrzymanie pętli - bukkit - 17-07-2019

Cytat:10ms to "wieczność" dla uC, nawet staruszka 8051 czy Z-80. Użyj przerwań od timera. Staraj się używać na max sprzętu.
Jak wieczność? Dlaczego preferujesz przerywać zamiast pauzować?