Odpowiedz 
 
Ocena wątku:
  • 6 Głosów - 4 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO
SP9MRN Offline
MAc
*****

Liczba postów: 817
Dołączył: 29-08-2009
Post: #124
RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO
Bardzo śliczny przykład Ryśka chytrze poprzekręcam (mając w tym paskudny cel)

Kod:
//Wyobraźmy sobie, że  "licznik" to "millis"
// specjalnie używamy "char" bo się szybko "przekręca" - liczy tylko do 255 :-)
//pamiętajmy, że używamy "unsigned char" - bo zwraca nam liczby od 0-255
//w odróżnieniu od "char", które zwróci nam znaki ascii

unsigned char licznik = 0;

void setup(){
  Serial.begin(9600);
delay(500);  
}

void loop(){
  Serial.println(licznik);
  licznik++;
  delay(50);  
}

Zamiana "int" na "unsigned char" ma swój ukryty cel - ale o tym w następnym odcinku

MAc
// *****************

No to następny kawałek :-)
Dla wyjaśnienia - "charami" posługujemy się wyłącznie dlatego, że są jednobajtowe, czyli dziesiętnie przyjmują wartość od 0 do 255, co pozwala nam kilkakrotnie "przewinąć licznik" w sensownym czasie.

Jeżeli dla eksperymentu do tego co mieliśmy wcześniej dołączymy wywołanie i funkcję smetra, to serialmonitor pokaże nam co się dzieje z działaniem funkcji po przewinięciu licznika.
Otóż licznik już po pierwszym przekroczeniu 255 zaczyna głupieć.

Tyle tylko, że w naszym przypadku nie ma to większego znaczenia - od czasu do czasy sprawdzi smeter trochę "gęściej" i tyle. Niewykluczone nawet, że tego nie zrobi, bo sama funkcja smetra zajmuje trochę czasu, co spowoduje "przeskoczenie" licznika millis().
Tego się nie da niestety zasymulować (chyba, że ktoś wymyśli jak) - prosty "delay()" nie pomaga, bo wstrzymuje też funkcję symulującą millis()
Podsumowując - wygląda na to, że trzeba zostawić złomka na półtora miesiąca i zobaczyć :-)


Kod:
//Wyobraźmy sobie, że  "counter" to "millis"
// specjalnie używamy "char" bo się szybko "przekręca"
unsigned char licznik = 0;
unsigned char s_metr_update_time = 0;
unsigned char currentlicznik = 0;
unsigned char s_metr_update_interval=50;

void setup() {
   Serial.begin(9600);
   delay(500);  
   Serial.println("Zaczynamy...");
}
void loop() {
   for (int x=0; x<1000; x++) { // parę razy przekręcić unsigned char od 0 do 255
// ******* to counter udaje millis()
       licznik++; // powiększa się()
       Serial.println(licznik);
// ******
    show_smetr();  
   }
Serial.println("koniec!");
while(1); // koniec wysylania na serialport
}

void show_smetr(){
  
        if(licznik >= s_metr_update_time){ // czy już wyświetlić?
         Serial.println("Update smeter"); //albo cokolwiek innego zaleznego od czasu
         s_metr_update_time = licznik + s_metr_update_interval;
      }
  
}


Idąc dalej.
Teraz nam to nie przeszkadza, ale może się zdarzyć, że (oczywiście edukacyjnie) będzie to miało znaczenie.
Co nam zatem zostaje?
Zastanowić się jak uniknąć nieuniknionego.
Oszukać przeznaczenie. (1, 2, 3)

A może to wcale nie licznik nam się przewija?
Może sami coś przewijamy korzystając z licznika?

Miłej zabawy

MAc
mrn
(Ten post był ostatnio modyfikowany: 02-11-2014 22:22 przez SP9MRN.)
02-11-2014 18:22
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP9MRN - 02-11-2014 18:22

Skocz do:


Użytkownicy przeglądający ten wątek: 5 gości