26-10-2014, 15:59
26-10-2014, 17:05
26-10-2014, 23:35
Weekend, weekend i po weekendzie... fajnie że tyle osób testuje złomka. To budujące że ktoś to buduje i testuje. A zatem do dzieła jedziemy dalej.
Dzisiaj zanim pójdę spać bo rano w trasę Postanowiłem przepisać obsługę klawiszy STEP i RIT, a konkretnie wzorem z Heńka przewalić je na jedno wejście, bo przyda nam się parę fajnych klawiszy a wejść jest jak na lekarstwo. Dodatkowo przeniosłem sygnał PTT z pinu 12 na 2, a dlaczego o tym na końcu.
Zacząłem od tego że przygotowałem dwie zmienne typu boolean by przechowywać status tych przycisków.
Do sprawdzania stanu wciśnięcia przycisków użyjemy jednego z wejść, dokładnie tego którego używaliśmy do obsługi przycisku krok syntezy, w tym miejscu by mocno w kodzie nie mieszać poprostu zapalamy flagi wciśniętych klawiszy:
A robimy to tak:
Uwagę proszę zwrócić na pierwszą linię tej funkcji, by nie opóźniać procesora podczas normalnej pracy gdy żaden z przycisków nie jest naciśnięty, funkcja ta nie sprawdza już nic więcej tylko resetuje flagi przycisków.
Poszczególne funkcje które dotychczas sprawdzały stan wejść teraz sprawdzają tylko stan flag przycisków.
Było tak:
a teraz jest tak:
Podobnie zrobiłem w części kodu obsługującego klawisz RIT.
Jesli chodzi zaś o przeniesienie sygnału PTT na pin 2 to intencją było zwolnienie pinu 12-tego który może pracować jako PWM. A na nim zrobimy sobie w następnym odcinku ściemnianie podświetlenia wyświetlacza. Taki wypas
[attachment=9150]
Mały schemat podłączenia przycisków.
W załączeniu kod po ostatnich zmianach.
Dzisiaj zanim pójdę spać bo rano w trasę Postanowiłem przepisać obsługę klawiszy STEP i RIT, a konkretnie wzorem z Heńka przewalić je na jedno wejście, bo przyda nam się parę fajnych klawiszy a wejść jest jak na lekarstwo. Dodatkowo przeniosłem sygnał PTT z pinu 12 na 2, a dlaczego o tym na końcu.
Zacząłem od tego że przygotowałem dwie zmienne typu boolean by przechowywać status tych przycisków.
Kod:
boolean step_button_pressed = false;
boolean rit_button_pressed = false;
Do sprawdzania stanu wciśnięcia przycisków użyjemy jednego z wejść, dokładnie tego którego używaliśmy do obsługi przycisku krok syntezy, w tym miejscu by mocno w kodzie nie mieszać poprostu zapalamy flagi wciśniętych klawiszy:
Kod:
const int buttons_input = A2;
A robimy to tak:
Kod:
if(analogRead(buttons_input) < 1000){ //jeśli cokolwiek jest wciśnięte to sprawdźmy co to
delay(10); //male opoźnienie by się ustabilizował stan
int adc_value = analogRead(buttons_input);
Serial.println(adc_value); //w tym miejscu sprawdzisz jaka wartość ma wcisnięty klawisz patrz port RS232 debugowanie
if(adc_value < 10){ //pierwszy przycisk
step_button_pressed = true;
}
if(adc_value > 10 && adc_value < 100){ //drugi przycisk
rit_button_pressed = true;
}
}else{ //w każdym innym przypadku resetujemy flagi przycisków
step_button_pressed = false; //reset przycisku step
rit_button_pressed = false; //przycisk rita
}
Uwagę proszę zwrócić na pierwszą linię tej funkcji, by nie opóźniać procesora podczas normalnej pracy gdy żaden z przycisków nie jest naciśnięty, funkcja ta nie sprawdza już nic więcej tylko resetuje flagi przycisków.
Poszczególne funkcje które dotychczas sprawdzały stan wejść teraz sprawdzają tylko stan flag przycisków.
Było tak:
Kod:
//obsługa klawisza zmiany kroku
if(digitalRead(step_input) == LOW){ //sprawdzanie czy przycisk jest wcisnięty
delay(50); //zwłoka by wyeliminować drgania styków
if(digitalRead(step_input) == LOW){
......
a teraz jest tak:
Kod:
//obsługa klawisza zmiany kroku
if(step_button_pressed == true){ //sprawdzanie czy przycisk jest wcisnięty
delay(50); //zwłoka by wyeliminować drgania styków
if(step_button_pressed == true){
....
Podobnie zrobiłem w części kodu obsługującego klawisz RIT.
Jesli chodzi zaś o przeniesienie sygnału PTT na pin 2 to intencją było zwolnienie pinu 12-tego który może pracować jako PWM. A na nim zrobimy sobie w następnym odcinku ściemnianie podświetlenia wyświetlacza. Taki wypas
[attachment=9150]
Mały schemat podłączenia przycisków.
W załączeniu kod po ostatnich zmianach.
26-10-2014, 23:39
Witam
Rysiu mam pytanie ile jeszcze wolnego miejsca jest , lub ile procent już zajmuje program w procku ?
Pozdrawiam
Andrzej
Rysiu mam pytanie ile jeszcze wolnego miejsca jest , lub ile procent już zajmuje program w procku ?
Pozdrawiam
Andrzej
26-10-2014, 23:45
Wielkość binarna szkicu: 15 820 bajtów (maksymalnie: 30 720 bajtów)
Czyli mijamy powoli połowę, dlaczego pytasz?
Czyli mijamy powoli połowę, dlaczego pytasz?
27-10-2014, 20:50
28-10-2014, 8:47
Brawo Janku.
Może jakies już własne zmiany w kodzie wprowadzałeś? Pytam bo jestem ciekaw czy Ty lub może inni koledzy już jakieś wersje "pod siebie" robicie?
A przy okazji PWM zasugerowałem się rysunkiem znalezionym na forum arduino, w którym był błąd. Oczywiście D12 nie jest wyjściem PWM
[attachment=9159]
Błędny rysunek.
[attachment=9160]
A tutaj poprawiony.
Trzeba mieć oczy dookoła głowy albo kolegów którzy z uwagą śledzę nasze poczynania i pokażą błędy. Dzięki Ryśku (SP6IFN).
A wracając do tematu ułożenia pinów połączeń i tego PWM do ściemniania wyświetlacza. Tak sobie myślę że może to i wodotrysk jest ale, akurat mnie się to przyda, więc dlatego to napiszę. Resztę pinów chętnie poprzesuwam, ale to czekam na sugestie osób które zajmą się PCB, na tym etapie to projekt płytki powinien decydować co gdzie przesunąć by było jak najmniej przelotek (jeśli mówimy o druku jednostronnym pod żelazko).
p.s. pozdrawiam z Piły
Może jakies już własne zmiany w kodzie wprowadzałeś? Pytam bo jestem ciekaw czy Ty lub może inni koledzy już jakieś wersje "pod siebie" robicie?
A przy okazji PWM zasugerowałem się rysunkiem znalezionym na forum arduino, w którym był błąd. Oczywiście D12 nie jest wyjściem PWM
[attachment=9159]
Błędny rysunek.
[attachment=9160]
A tutaj poprawiony.
Trzeba mieć oczy dookoła głowy albo kolegów którzy z uwagą śledzę nasze poczynania i pokażą błędy. Dzięki Ryśku (SP6IFN).
A wracając do tematu ułożenia pinów połączeń i tego PWM do ściemniania wyświetlacza. Tak sobie myślę że może to i wodotrysk jest ale, akurat mnie się to przyda, więc dlatego to napiszę. Resztę pinów chętnie poprzesuwam, ale to czekam na sugestie osób które zajmą się PCB, na tym etapie to projekt płytki powinien decydować co gdzie przesunąć by było jak najmniej przelotek (jeśli mówimy o druku jednostronnym pod żelazko).
p.s. pozdrawiam z Piły
28-10-2014, 10:15
Ponieważ "delay()" jest kolejnym paskudztwem, którego jeżeli tylko się da to trzeba unikać, ponieważ bezproduktywnie zjada czas procesora to można zrobić tak:
zmienne pomocnicze typu buttonstate i lastbuttonstate typu boolean (czyli zerojedynkowe więc małe)
przycisk normalnie podciągnięty wewnętrznie do plusa, po wciśnięciu zwierany do masy
buttonState = digitalRead(stepPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) { zróbcotrzeba();}
}
lastButtonState = buttonState;
Styki sobie mogą drgać ile chcą, a my się debouncem wogole nie przejmujemy, bo "zróbcotrzeba()" już zostało wykonane. to oczywiście nie rozwiązuje nap problemu ze stuprocentową pewnością, ale :
1. praktyka wykazuje, że stabilność jest bardzo duża
2. unikamy delaya
3. nie odpalamy rakiet z głowicami atomowymi
czasem delaya się nie da uniknąć, np przy czytaniu z seriala albo ustabilizowaniu odczytu z analoga, ale to już trudno
MAc
mrn
PS
akurat w obsłudze klawiatury delay nie jest tragiczny, bo i tak jest szybszy od naszego palca - ale ze względów edukacyjnych przypominam, że mało jest rzeczy gorszych niż wymuszanie TOTALNEGO nic nie robienia procesora. Wszystkie procesy się zatrzymują.
zmienne pomocnicze typu buttonstate i lastbuttonstate typu boolean (czyli zerojedynkowe więc małe)
przycisk normalnie podciągnięty wewnętrznie do plusa, po wciśnięciu zwierany do masy
buttonState = digitalRead(stepPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) { zróbcotrzeba();}
}
lastButtonState = buttonState;
Styki sobie mogą drgać ile chcą, a my się debouncem wogole nie przejmujemy, bo "zróbcotrzeba()" już zostało wykonane. to oczywiście nie rozwiązuje nap problemu ze stuprocentową pewnością, ale :
1. praktyka wykazuje, że stabilność jest bardzo duża
2. unikamy delaya
3. nie odpalamy rakiet z głowicami atomowymi
czasem delaya się nie da uniknąć, np przy czytaniu z seriala albo ustabilizowaniu odczytu z analoga, ale to już trudno
MAc
mrn
PS
akurat w obsłudze klawiatury delay nie jest tragiczny, bo i tak jest szybszy od naszego palca - ale ze względów edukacyjnych przypominam, że mało jest rzeczy gorszych niż wymuszanie TOTALNEGO nic nie robienia procesora. Wszystkie procesy się zatrzymują.
28-10-2014, 11:54
Cytat:czasem delaya się nie da uniknąć, np przy czytaniu z seriala albo ustabilizowaniu odczytu z analoga, ale to już trudnoAkurat przy odczycie z wejścia analogowego delaya można "zgubić" programowo, wykonując kilka pomiarów i je uśrednić. Na pierwszej lekcjii z Arduino którą przerabiałem było:
Cytat: //pomiar napięcia z potencjometru i dodanie wyniku do wart_potzaczerpnięte z "Elektronika Praktyczna Nr.6/2011 str.87".
for (int i =0; i < 20; i++); //pętla wykonywana 20 razy
wart_pot = wart_pot + analogRead(A0);
//obliczanie średniej arytmetycznej z 20 pomiarów
wart_pot = wart_pot / 20;
// przeliczanie odczytanej wartości na napięcie
wart_nap=(5.0*wart_pot*20)/1024.0;
Rysio!
28-10-2014, 12:59
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
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