Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO
[quote='SQ9MDD' pid='22696' dateline='1414140501'

W załączeniu najświeższa wersja źródłowa.

[/quote]

Witam
Gdzie ten RIT? jakoś nie mogę go znaleźć,czym go zalączamy?
Reszta biega wyśmienicie.
pozdrawiam Janek
Odpowiedz
Tak u mnie wygląda odpalony ale nie spalony "Złomek" z RIT-em.
Jeszcze bez 9850.


   
Odpowiedz
Witam
A tak u mnie,Rysiu jestes 'W I E L K I"
Janek        
Odpowiedz
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ę Wink 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 Wink

   
Mały schemat podłączenia przycisków.

W załączeniu kod po ostatnich zmianach.





Załączone pliki
.zip   zlomek_v_1_0_12-141026b.zip (Rozmiar: 6.91 KB / Pobrań: 971)
...przede wszystkim nie zakłócać...
Odpowiedz
Witam

Rysiu mam pytanie ile jeszcze wolnego miejsca jest , lub ile procent już zajmuje program w procku ?

Pozdrawiam

Andrzej
Odpowiedz
Wielkość binarna szkicu: 15 820 bajtów (maksymalnie: 30 720 bajtów)

Czyli mijamy powoli połowę, dlaczego pytasz?
...przede wszystkim nie zakłócać...
Odpowiedz
Ostatni kod
   
Janek
Odpowiedz
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

   
Błędny rysunek.


   
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 Wink
...przede wszystkim nie zakłócać...
Odpowiedz
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ą.

Odpowiedz
Cytat:czasem delaya się nie da uniknąć, np przy czytaniu z seriala albo ustabilizowaniu odczytu z analoga, ale to już trudno
Akurat 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_pot
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;
zaczerpnięte z "Elektronika Praktyczna Nr.6/2011 str.87".
Rysio!
Odpowiedz


Skocz do:


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