Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
PCB.center

Zmienne millis, prośba o pomoc

Autor Wiadomość
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 14-11-2017, 17:38   

no więc co miałeś na myśli pisząc :"(bo co będzie, jeśli wartość stanz będie inna niż LOW czy HIGH)? "???

Ostatnio popularny » Kurs STM32 F4 - #8 - Zaawansowane funkcje liczników


Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 48
Otrzymał 1 piw(a)
Programuję w:
C, C++
Wysłany: 14-11-2017, 17:41   

To, że zakładanie iż zmienna przyjmuje wartości z zakresu, który sobie założyłeś to najczęstszy błąd.

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm

Wysłany: 14-11-2017, 17:41   

Proszę jaka dyskusją się rozpoczęła :) Dotarłem w końcu do knajpy, można spokojnie połączyć się z netem i wrócić to przerwanego wątku.
Więc jak chodzi o oryginalny kod i negację, to nie ma tutaj różnicy - chociaż jest pojęciowa.
Tak się składa, że LOW i HIGH są zdefiniowane jako 0 i 1, ale tak wcale nie musi być. To jest po prostu wartość, można przyjąć LOW = 50, HIGH = -10 i też będzie dobrze.
Typ logiczny (bool) powinien przyjmować tylko dwie wartości prawdę (true) lub fałsz (false). Jednak adresowanie bitowe jest mało wydajne, więc najczęściej bool to bajt lub całe słowo (np. 32-bitowe). Co wiecej fałsz jest reprezentowany jako wartość zerowa, cokolwiek innego interpretowane jest jako true. Kompilatory używają jedynki na określenie true.
Negacja ma dwie postaci:
* logiczną, czyli !wartość, działa ona tak, że zero zamienia na 1, a cokolwiek innego na zero
* arytmetyczna ~wartość - wszystkie bity są negowane.
Kod z if-em moze nie był krótki, ale dziłał poprawnie dla dowolnej reprezentacji LOW, HIGH. Użycie negacji działa przypadkiem, gdyby LOW lub HIGH były inaczej zdefiniowne, po prostu by nie działało.
Jednak kod typu:
Kod programu: Zaznacz cały
stan = !stan;

Jest ładny i zwarty, więc można byłoby to zaakceptować, nawet jeśli logicznie jest to błąd.
Natomiast przypisanie z negacją w parametrze funkcji to herezja czystej postaci :)
Jak chodzi o chwalenie się dokonaniami, to niewiele mogę napisać poza tym że pracuję jako konsultant. Zwiedziłem więc nieco firm, widziałem różne style i kody programów. Każda firma ma lub próbuje mieć własny styl kodowania, ale są pewne wspólne elementy. I pisanie tak żeby było ciekawie i nieczytelnie raczej nie jest mile widziane. A żeby też jakiegoś linka podać, to np tomtom.com - ale to dawno temu, jeszcze jak biuro było w Amsterdamie. To były czasy :)

Zmianna stan nie jest typu logicznego. Więc wykonywanie na niej operacji logicznej (!stan) jest nie do końca poprawne - to chciałem napisać. Natomiast użycie if-ów zadziała dla dowolnych wartości, nie ma problemu jeśli będzimy mieli np. Trzy stany.

Ostatnio zmieniony przez Elvis 14-11-2017, 17:48, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 14-11-2017, 17:59   

Elvis! love me tender :mrgreen:

Polecany artykuł » Kurs Arduino - #11 - podsumowanie, QUIZ


Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 48
Otrzymał 1 piw(a)
Programuję w:
C, C++
Wysłany: 14-11-2017, 18:09   

Dobra, heretyku, też już siedzę w barze i wznoszę szklenicę do ust :)
Nie zgodzę się z Tobą w kwestii umieszczenia w parametrze wyrażenia dającego efekt uboczny. Ale to zostawmy sobie na chwilę, gdy przypadkowo znajdziemy się w jednej knajpie :)
Ty pracujesz jako konsultant - ja jako (jak to nazwać... Nie wiem...) taki gość co w firmie robi różne takie dziwne rzeczy, które mają zwyczaj działać wbrew oczekiwaniom różnych fachmanów od php, majskula i innych wynalazków ;)
Niech więc koledzy, którzy chcą się nauczyć programowania, uczą się nie na przykładach typu forum arduino (bo mnie to działa i tak jest fajnie) - ale od kogoś mądrzejszego. Nie mówię że to ja jestem ten najmądrzejszy - ale negowanie jakiejś konstrukcji języka tylko dlatego, że "mnie siem nie podoba" to błąd, którego żaden nauczyciel nie ma prawa popełnić.
Zdrówko!
(Edytka) od kiedy w C są typy logiczne?

Ostatnio zmieniony przez ethanak 14-11-2017, 18:13, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 14-11-2017, 18:15   

Dobra ja siedzę przy herbacie i bułce z pasztetem :mrgreen:
Kod programu: Zaznacz cały

const int czerwona =  10;
const int zielona = 8;
int stanC = LOW; 
int stanZ = LOW;           
unsigned long previousMillisC = 0;
unsigned long previousMillisZ = 0;     
const long intervalZ= 1000;
const long intervalC = 300;     
void setup() {
pinMode(czerwona, OUTPUT);
pinMode(zielona, OUTPUT);
}

void loop() {
 
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillisC >= intervalC) {
    previousMillisC = currentMillis;

  if (stanC == LOW) {
      stanC = HIGH;\\plan był taki:załącza się co 300ms na 200ms
      delay(200);
      stanC = LOW; [code]
    }
   digitalWrite(czerwona, stanC);
  }
   if (currentMillis - previousMillisZ >= intervalZ) {
    previousMillisZ = currentMillis;

  if (stanZ == LOW) {
      stanZ = HIGH;
    } else {
      stanZ = LOW;
    }
   digitalWrite(zielona, stanZ);
   }
}
[/code]
Jaki był plan jest w komentarzu, dlaczego nie działa?
sorry za pomyłkę slasha i backslasha...



już doszedłem, prosty błąd był, ma być:
Kod programu: Zaznacz cały


const int czerwona =  10;
const int zielona = 8;
int stanC = LOW; 
int stanZ = LOW;           
unsigned long previousMillisC = 0;
unsigned long previousMillisZ = 0;     
const long intervalZ= 1000;
const long intervalC = 300;     
void setup() {
pinMode(czerwona, OUTPUT);
pinMode(zielona, OUTPUT);
}

void loop() {
 
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillisC >= intervalC) {
    previousMillisC = currentMillis;

  if (stanC == LOW) {
     stanC = HIGH;//plan był taki:załącza się co 300ms na 200ms
      digitalWrite(czerwona, stanC);
 
      delay(200);
      stanC = LOW;
      digitalWrite(czerwona, stanC);
 
    }
 
   }
   if (currentMillis - previousMillisZ >= intervalZ) {
    previousMillisZ = currentMillis;

  if (stanZ == LOW) {
      stanZ = HIGH;
    } else {
      stanZ = LOW;
    }
   digitalWrite(zielona, stanZ);
   }
}
[/code]

Ostatnio zmieniony przez SOYER 14-11-2017, 18:28, w całości zmieniany 3 razy  
Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 48
Otrzymał 1 piw(a)
Programuję w:
C, C++
Wysłany: 14-11-2017, 18:27   

Ktoś tu dał przykład zegarka na lodówce...
Gotujesz gulasz (50 minut), a po upływie 50 minut sprawdzasz czy minęły trzy minuty...
Tak przy okazji: stanz i stanc mają być typu bool a nie int - za dużo kasz ramu w arduino czy co?

Ostatnio zmieniony przez ethanak 14-11-2017, 18:29, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm

Wysłany: 14-11-2017, 18:30   

Typ logiczny jest chyba od C99, ale długo o tym nie wiedziałem. Ostatnio studiowałem nowości w C++14 i nadal twierdzę, że ostatni sensowny C++ był w 93, a od 98 to tylko C--. Jak chodzi o C to mniej się zmieniło, ale typ bool niby istnieje. Chociaż tradycyjnie na int moża zamienić. Za to zawsze były logiczne operatory np. &&, || w odróżnieniu od bitowych &, |. To samo dotyczy negacji ! Vs ~ (jeśli pomyliłem nazewnictwo to z góry przepraszam).
Co do pogadania w knajpie to jak najbardziej, ale teraz mam kontrakt w Kopenhadze, więc może być nieco daleko. Pozostaje zdalny toast za zgodę i zrozumienie zamiast wykazywania jedynie słusznej racji.
SOYER, używasz delay, a to nie działa dobrze z millis() - albo jedno albo drugie

Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 14-11-2017, 18:31   

Już poprawiłem, spójrz do góry... co zmienić by miało look? Elvis? ethanak?
[edit] Rzeczywiście, przy wstawianiu różnych wartości gryzie się... :cry:
Czyli delay wpływa na odliczanie czasu millis...
[edit2] gryzie się gdy oba interwały są podzielne przez siebie... dobrze obserwuję?

Ostatnio zmieniony przez SOYER 14-11-2017, 18:36, w całości zmieniany 3 razy  
Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm

Wysłany: 14-11-2017, 18:37   

Nie, ale jak program wykonuje delay() to nic innego nie może zrobić. A poza tym brakuje drugiego delay - ustawiasz stan wysoki dla diody "czerwona", czekasz 200 ms, później stan niski. Tutaj nie czekasz i znowu stan wysoki - więc nawet nie widać, że coś się dzieje.
Ale ogólnie - jak delay() to nie milis()

Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 48
Otrzymał 1 piw(a)
Programuję w:
C, C++
Wysłany: 14-11-2017, 18:38   

Wrrrr... Nie wpływa.
Zapomnij o istnieniu delay.

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1300
Pomógł: 92 razy
Otrzymał 244 piw(a)
Skąd: wawa
Programuję w:
C, asm

Wysłany: 14-11-2017, 18:41   

O używaniu millis() możesz myśleć jak o zegarku - patrzysz która godzina i jeśli od rozpoczęcia np. Gotowania/pieczenia nie minęło odpowiednio dużo czasu, to robisz cokolowiek innego. Za moment patrzysz na zegarek znowu itd.
Delay to drzemka, albo ważny telefon - choćby wszystko poszło z dymem i wykipiało, jesteś tym zajęty i do końca czasu nic innego nie zrobisz.
Mieszanie drzemki z gotowaniem jajek na twardo nie wychodzi i dlatego program nie działa.

Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 93
Otrzymał 3 piw(a)
Skąd: Kryry
Wysłany: 14-11-2017, 18:44   

Elvis napisał/a:
Nie, ale jak program wykonuje delay() to nic innego nie może zrobić. A poza tym brakuje drugiego delay - ustawiasz stan wysoki dla diody "czerwona", czekasz 200 ms, później stan niski. Tutaj nie czekasz i znowu stan wysoki - więc nawet nie widać, że coś się dzieje.
Ale ogólnie - jak delay() to nie milis()

No właśnie widać bo wtedy czeka jeszcze 100ms aż upłynie interval...(mam to podłączone, rzeczywiście gaśnie na b. krótko)
ale rzeczywiście jak mam delay to za bardzo nie działa tak jak powinno...
[edit] o dziwo dla tych wartości działa bardzo dobrze, dla innych gorzej.

Ostatnio zmieniony przez SOYER 14-11-2017, 18:50, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Arduino i programowa... Atmega - problem z b... Przysyłanie/Odbieran... Arduino Mega pliki d...
lub przeszukaj forum po wybranych tagach: millis, pomoc, prosba, zmienne


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki