Liczba postów: 821
Liczba wątków: 30
Dołączył: 29-08-2009
28-10-2014, 11:59
(Ten post był ostatnio modyfikowany: 28-10-2014, 11:59 przez SP9MRN.)
Rysio!
Uśrednianie to jedno a chwila spokoju dla przetwornika to drugie. Tam jest jeden multipleksowany przetwornik i najlepiej jest wywołać przetwornik, poczekać i dopiero zmierzyć.
Uśrednianie z kolei daje nam "pewność" pomiaru - np zabezpiecza przed niestabilnością potencjometru.
analogRead(A0);
delay(10);
sensorReading[0] = analogRead(A0);
analogRead(A1);
delay(10);
sensorReading[0] = analogRead(A1);
Muszę znaleźć wykład o tym - ale w tej chwili nie pamiętam linku
to nie jest zawsze potrzebne - np przy pojedynczym smetrze to nie ma większego znaczenia, ale jak w sterowniku czytałem dwa potencjometry jednocześnie kręcone, to się zaczynały cuda. Może się tak zdarzać również przy pomiarze SWR - jak bierzemy jednocześnie sygnał analogowy fwd i rev do dalszej obróbki.
MAc
PS znalazłem
"The Atmega datasheet also cautions against switching analog pins in close temporal proximity to making A/D readings (analogRead) on other analog pins. This can cause electrical noise and introduce jitter in the analog system. It may be desirable, after manipulating analog pins (in digital mode), to add a short delay before using analogRead() to read other analog pins. "
http://arduino.cc/en/pmwiki.php?n=Tutori...gInputPins
Liczba postów: 233
Liczba wątków: 8
Dołączył: 01-03-2012
28-10-2014, 13:41
(Ten post był ostatnio modyfikowany: 28-10-2014, 13:41 przez SP2IPT.)
MAc - przenioslbym ostatnia linie wyzej
O tak:
MagicznyKod napisał(a):buttonState = digitalRead(stepPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) { zróbcotrzeba();}
lastButtonState = buttonState;
}
Jak oszczedzac czas to oszczedzac
pz
Liczba postów: 410
Liczba wątków: 32
Dołączył: 18-06-2009
Witam
Cytat:Napisane przez SQ9MDD - 26-10-2014 22:45
Wielkość binarna szkicu: 15 820 bajtów (maksymalnie: 30 720 bajtów)
Czyli mijamy powoli połowę, dlaczego pytasz?
Pytam się Rysiu bo ja mam arduino z prockiem co ma 256kb atmega 256 , i nie wiedziałem ile w mniejszym arduino nano sofcik zajmuje miejsca.
Pytanie bardziej z Ciekawości :-)
Pozdrawiam
Andrzej
Liczba postów: 821
Liczba wątków: 30
Dołączył: 29-08-2009
(28-10-2014, 13:41)SP2IPT napisał(a): MAc - przenioslbym ostatnia linie wyzej 
O tak:
MagicznyKod napisał(a):buttonState = digitalRead(stepPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) { zróbcotrzeba();}
lastButtonState = buttonState;
}
Jak oszczedzac czas to oszczedzac 
pz
Obawiam się, że jak przeniesiemy do "if" to stracimy istotę debouncingu. chodzi o to, żeby stany się wyrównały bezwarunkowo, po to, żeby kolejne działanie odbyło się wyłącznie wtedy, kiedy są różne.
ale mogę się mylić.
MAc
mrn
Liczba postów: 380
Liczba wątków: 34
Dołączył: 01-02-2009
Wartość edukacyjna wątku wzrasta

I bardzo dobrze, zachęcam gorąco do eksperymentów i publikowania ich wyników tutaj na forum. Oczywiście nie wszystkie eksperymenty będą udane, patrz moje walki z RIT-em na potencjometrze. Ale co się człowiek nauczył przy tym to jego.
Andrzej 256Mega to kawał procka jest, ja na tym swoją drukarę 3D zrobiłem (RAMPS), do zabaw z DDS to takie maleństwo jak 328 lub 32u4 wystarczy.
Cytat:...chodzi o to, żeby stany się wyrównały bezwarunkowo, po to, żeby kolejne działanie odbyło się wyłącznie wtedy, kiedy są różne
MAc jedna z lepszych krótkich definicji tego zagadnienia jakie słyszałem.
Ogólnie ta metoda jest jak najbardziej polecana wszędzie tam gdzie nie używamy przerwań a zależy nam na dostępności procesora. Ja tutaj celowo użyłem metody z delay-ami by początkujący złapali ideę.
Czasami trzeba ten krok zrobić by zdać sobie sprawę z ograniczeń.
A jak już jesteśmy przy ograniczeniach to moja metoda na obsługę s-metra ma jedną wadę ciekaw jestem kto zgadnie/wie jaką. Taki mały quiz...
Dla przypomnienia wygląda to tak:
Kod:
const long s_metr_update_interval = 100; //interwał odświeżania s-metra w msec
long s_metr_update_time = 0; //zmienna pomocnicza do przechowywania czasu następnego uruchomienia s-metra
Kod:
void show_smetr(){
if(millis() >= s_metr_update_time){ //sprawdzam czy już jest czas na wykonanie funkcji
...cos tam robie i robie i robie, a następnie
s_metr_update_time = millis() + s_metr_update_interval; //ustawiam czas kolejnego wykonania tej funkcji
}
}
...przede wszystkim nie zakłócać...
Liczba postów: 464
Liczba wątków: 6
Dołączył: 23-03-2010
No ja wiem....ale myśmy o tym debatowali telefonicznie. Dlatego tez dobrowolnie nie wezmę udziału w quizie aby dać szansę innym

Rysio!
Liczba postów: 821
Liczba wątków: 30
Dołączył: 29-08-2009
no ja zgaduję, że basen za mały ;-)
MAc
Liczba postów: 9
Liczba wątków: 1
Dołączył: 03-04-2012
29-10-2014, 14:32
(Ten post był ostatnio modyfikowany: 29-10-2014, 14:32 przez SQ5OUX.)
Czy chodzi o to, że metoda millis() po ok 50 dniach działania programu "przekręca" się i zaczyna liczyć od 0 ?
Teoretycznie nie wejdzie wtedy do tego if`a.
Norbert
Liczba postów: 380
Liczba wątków: 34
Dołączył: 01-02-2009
Brawo Norbert!
Dokładnie z tym będzie problem. W zasadzie to z tym i jeszcze z jedną rzeczą, już tłumaczę.
Otóż millis() używa licznika 32bit bez znaku, czyli unsigned long, ma zakres od 0 do 4,294,967,295 (czas w milisekundach, to jest około 48dni z małym hakiem). Jednakże w całym programie błędnie przypisałem do liczenia zmiennej czasu, zwykłego longa a ten to też liczba 32bit, ale w zakresie od -2,147,483,648 do 2,147,483,647.
Czyli skróciłem swój licznik w którym mogę przechowywać kolejny moment odpalenia funkcji s-metr o połowę.
A zatem po około 24 dniach kolejne odsunięcie wykonania funkcji s-metra trafi w obszar którego mój licznik nie może przyjąć.
Reasumując jeśli przez 24dni nie wyłaczymy tego transceivera s-metr przestanie działać.
Należy zatem zadbać o obsługę przekroczenia licznika milis() i dodatkowo użyć właściwej zmiennej do liczenia czasu.
...przede wszystkim nie zakłócać...
Liczba postów: 821
Liczba wątków: 30
Dołączył: 29-08-2009
Albo oszczędzać prąd i raz na 3 tygodnie wyłączyć radio i pójść na spacer :-)
MAc