Skocz do zawartości

Pomocna odpowiedź

(edytowany)

Czekam na wskazanie baboli

Dowcip o pierwszej kobiecej wyprawie kosmicznej:

załoga: Houston, Houston mamy problem

kontrola lotów: Proszę go opisać

załoga: Houston. Domyśl się sam 

Edytowano przez Kogut007
Uzupełnienie odpowiedzi

To czekaj dalej.

Widzisz - początkujący jeśli pokazuje kod i pyta czy jest dobrze to mu się pokazuje co jest źle.

Jeśli natomiast ktoś udaje speca, popełnia sążnisty artykuł uważając czata giepata za wyrocznię i nawet nie sprawdza swoich wypocin - wybacz, ale musi nauczyć się języka w którym pisze kody (to że coś się skompiluje nie znaczy że działa), czytać dokumentacje... a w linku który podał @orb777 był dokładnie pokazany ten błąd i przykład jak powinno być prawidłowo.

Tak że pytaj SI,  jeśli użycie własnej jest za trudne.

  • Lubię! 1
(edytowany)

do ethank. Gdybyś zechciał sprawdzić informację z linku, to byś przekonał się, że dokumentacja nie jest wyrocznią. Wystarczyłoby zmodyfikować przykład  chociażby z Forbota: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418, który zmodyfikowałem tak, aby przepełnienie otrzymać po 65 sekundach i przy okazji wyświetlić różnicę czasu.

unsigned short aktualnyCzas = 0;
unsigned short zapamietanyCzas = 0;
unsigned short roznicaCzasu = 0;
void setup(){
  Serial.begin(9600);
}
void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = (short) millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;
  
  //Jeśli różnica wynosi ponad sekundę
  if (roznicaCzasu >= 1000) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
    //Wyslij do PC
    Serial.println(roznicaCzasu);
    Serial.println(aktualnyCzas);
  }
}

Powołujesz się na dokumentację. Zakładasz, że jest nieomylna i na tej podstawie publicznie stawiasz mi zarzuty. Nie sprawdziłeś, czy moje rizwiązanie jest poprawne czy może dokumentacja jest błędna? Co sądzisz o bezkrytycznym (i innym też) rozpowszechnianiu błędów? Co do udawania speca, to pamiętaj, że o rzemieślniku świadczą jego dzieła. Pokaż moje błędy, a nie powołuj się na cokolwiek bez sprawdzenia. Poza tym pamiętaj, że nie ma jedynie słusznej drogi do dowolnego celu.  

I jeszcze jedno. Jeśli ktoś udaje fachowca i robi to dobrze, to po prostu jest fachowcem.

Edytowano przez Kogut007
Uzupełnienie odpowiedzi

Popraw błąd (a właściwie błędy) bo na razie ten cały artykuł to stek bzdur.

A jeśli uważasz że dokumentacja Arduino jest błędna to zgłoś poprawkę, bo na razie rozpowszechniasz jakieś bzdury wyssane z palca typu "wiem ale nie powiem". 

BTW. cholernie nie lubię jak się zniekształca mój nick ale czego mam wymagać od takich przemądrzalców co wiedzą lepiej a nie potrafią obsługiwać edytora na forum...

  • Lubię! 1

do ethank. Jak do tej pory nie wskazałeś ani moich błędów, ani nie wykazałeś, że mój artykuł to stek bzdur. Co więcej, nie odniosłeś się do załączonego przykładu w moim poprzednim poście. Twierdzisz, że "cholernie nie lubię jak się zniekształca mój nick". A jak sądzisz - czy ktokolwiek lubi, jak bezpodstawnie zarzuca się mu cokolwiek? I poza tym, jak sądzisz, jak stawianie takich zarzutów świadczy o Tobie? 

(edytowany)
1 godzinę temu, Kogut007 napisał:

Powołujesz się na dokumentację. Zakładasz, że jest nieomylna i na tej podstawie publicznie stawiasz mi zarzuty. Nie sprawdziłeś, czy moje rizwiązanie jest poprawne czy może dokumentacja jest błędna? Co sądzisz o bezkrytycznym (i innym też) rozpowszechnianiu błędów? Co do udawania speca, to pamiętaj, że o rzemieślniku świadczą jego dzieła. Pokaż moje błędy, a nie powołuj się na cokolwiek bez sprawdzenia. Poza tym pamiętaj, że nie ma jedynie słusznej drogi do dowolnego celu.  

Ważne żebyś ty sprawdził a nie wdawał się w pyskówki 😉 jak wykażesz że oficjalna dokumentacja jest błędna to daję sobie paznokieć przyciąć że @ethanak przyzna ci rację i przeprosi. Tymczasem brniesz w stronę... Kosza 

Edytowano przez _LM_
(edytowany)

W załaczniku, do którego się odniosłeś, jest przykład kodu testującego problem. Pokazałem, skąd go ściągnąłem, wskazałem modyfikacje, jakie w nim dokonałem. Każdy może go ściągnąć i uruchomić, także Ty. Program realizuje przepełnienie po 65 sekundach i na konsoli wyświetla aktualny czas i różnicę czasu. Zobacz, co się dzieje na wydruku w 66 sekundzie - sprawdź konsolę: czas i różnicę czasu. Jeśli to nie jest dowodem na błąd w dokumentacji, to co nim jest? W załączeniu zrzut ekranu.

obraz.thumb.png.b3465f6ec4856f5378eff1eb7aaf7ddf.png

Edytowano przez Kogut007

Kompiluję na Arduino 2 - nie wyrzuca błędu. Faktycznie, zgodnie z zasadami sztuki powinno być static long PrevLed = 0L; Przepraszam za błąd

Poprawione funkcje:

void task_dioda() {
static long PrevLed = 0L;  
if (millis() - PrevLed >= int(LED_PERIOD) ) {
     if(digitalRead(LED_BUILTIN) == HIGH) digitalWrite(LED_BUILTIN, LOW); else digitalWrite(LED_BUILTIN, HIGH);
     PrevLed = millis();
  }
}

void task_nuda() { // liczba wywołań funkcji w czasie 1 sekundy
  static long PrevPrnt = 0L;
  static long Licznik = 0L;
  if(millis() - PrevPrnt >= 1000) {
    Serial.println(Licznik);
    Licznik = 0;
    PrevPrnt = millis();
  }

 

do ethanak. Co mam czytać? Dokumentację z odnośnika? Uwagi (a raczej brak merytorycznych) od Kolegi? Czy Kolega raczył przeczytać mój porzedni post dotyczący błędu w dokumentacji? Czy Kolega raczył uruchomić program, który ten błąd demonstruje? Poza tym ja także nie lubię, jak ktoś złośliwie zniekształca mój nick

W definicji funkcji  task_dioda i task_nuda źle zdefiniowałem zmienne. Winno być:

void task_dioda() {
static unsigned long PrevLed = 0L;  
if (millis() - PrevLed >= int(LED_PERIOD) ) {
     if(digitalRead(LED_BUILTIN) == HIGH) digitalWrite(LED_BUILTIN, LOW); else digitalWrite(LED_BUILTIN, HIGH);
     PrevLed = millis();
  }
}

void task_nuda() { // liczba wywołań funkcji w czasie 1 sekundy
  static unsigned long PrevPrnt = 0L;
  static unsigned long Licznik = 0L;
  if(millis() - PrevPrnt >= 1000) {
    Serial.println(Licznik);
    Licznik = 0;
    PrevPrnt = millis();
  }
  Licznik += 1;
}

Przepraszam za błędy. 

  • Lubię! 1
(edytowany)

@Kogut007 , no i gud. Dokumentacja powstaje na bazie kodu.

https://github.com/arduino/ArduinoCore-avr/blob/11b9130371e8447920edb65a75706a6c951e51fc/cores/arduino/Arduino.h#L141

Co by się działo?

Prosty przykład:

#include <iostream>
using namespace std;

// symulacja millis()
unsigned long millis(){
	static unsigned long x = 2147483647; // 2^31-1, "granica" dodatniej wartości dla signed long, następna ustawia już bit znaku na ujemny.
	return x++;
}

int main(){
	long PrevLed = millis();
	cout << "Jeszcze dobrze:\t" << PrevLed << endl;
	PrevLed = millis();
	cout << "Co się stało?:\t" << PrevLed << endl;
	PrevLed = millis();
	cout << "O co chodzi?:\t" << PrevLed << endl;
	return 0;
}

wynik.thumb.jpg.4b9d851ef24b5f3f680a0116276d38f3.jpg

Edytowano przez orb777

Kolega nie odtworzył problemu. Program pokazuje tylko przepełnienie, co jest oczywiste. Istotna jest różnica (millis() - PrevLed), bo ona jest warunkiem wykonania instrukcji . Poza tym żle zdefiniowałem zmienną PrevLed - powinno być zamiast long - unsigned long. W poprzednich postach poprawiłem definicję. Sam problem pokazałem w programie zamieszczonym w jednym z poprzednich postów

@Kogut007 , cóż, jestem tylko amatorem z zetafonem, mogę się mylić. Głównie chodziło mi o pokazanie co dzieje się ze zmienną "PrevLed" kiedy jest ze znakiem. Przesuń wynik millis() o ~25 dni (2^31) do przodu i zobacz na "żywym organizmie" jak zachowa się kod bez poprawki. Po tym czasie w warunku pojawia się dodawanie zamiast odejmowania.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...