• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zatrzymanie pętli
#1
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?
 
Odpowiedź
#2
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
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.
 
Odpowiedź
#4
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ć?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości