HomeMade
Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Urządzenia nadawczo odbiorcze KF (/forum-62.html)
+--- Dział: Syntezy częstotliwości i moduły DSP (/forum-74.html)
+--- Wątek: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO (/thread-2164.html)

Strony: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP3JDZ - 03-11-2014 21:31

Znalazłem przyczynę dziwnego zachowania u mnie wersji 13-tej. Otóż nadgorliwie podłączyłem drabinkę oporową do masy (że niby rysownik schematu niedomalował masy). Odłączyłem masę, zaoszczędziłem dwa rezystory 1k no i ruszyło - przyciski step i RIT zaczęły działać.
Kod z przerobioną obsługą enkodera dla wersji 13-tej:
[attachment=9172]
Przy okazji zauważyłem takie fragmenty kodu:
Kod:
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){      //jeśli klawisz nadal jest wcisnięty (czyli nie są to zakłócenia)
i
Kod:
if(rit_button_pressed == true){             //jeśli klawisz wciśnięty
   delay(50);                                 //zwłoka by wyeliminować drgania styków
    if(rit_button_pressed == true){           //jeśli nadal wciśnięty (eliminuję drgania styku)
Myślę, że zmienne step_button_pressed i rit_button_pressed nie mają prawa same się zmienić więc ten czas jest stracony ;-)[/quote].


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 03-11-2014 22:24

(03-11-2014 21:31)SP3JDZ napisał(a):  Myślę, że zmienne step_button_pressed i rit_button_pressed nie mają prawa same się zmienić więc ten czas jest stracony ;-).

Masz 100% rację Witku, to zaszłość, spowodowana przepisaną na nowo obsługą klawiszy, gdy każdy z nich miał swoje wejście, wtedy było to sensowne.

W momencie gdy czytamy je z jednego wejścia analogowego.

Brawo za czujność.

Witek mam propozycję by nie robić zamieszania z wersjami programu może umówmy się tak że twoje wersje będziesz ciągnął w osobnej numeracji, na przykład: 1.1.xxx a jeśli ktoś jeszcze dołączy do modyfikacji to swoją linię będzie mógł ciągnąć na przykład w serii: 1.2.xxx dzięki temu będzie łatwiej ogarnąć która wersja z której wynika i jakie można tam modyfikacje znaleźć.


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP2ONG - 04-11-2014 19:30

A nie myslicie o tym aby kod umiescic w GITHUB https://github.com/ lub SVN google code ? http://code.google.com/
Zaleta takiego rozwiazania jest ze kazdy ma dostep do kodu ale nad rozwojem pracuje grupa ktora jest wpisana w projekcie, mozna zglasazc swoje poprawki. Latwy system zarzadzania zmianami a jesli okaze sie ze jakas poprawak cos napsula to latwao ja wycofac korzystajac z mozliwosci czy to GIT czy SVN. Mozna robic tzw forki czyli jesli ktos uzna ze bedzie prowadzil swoja galaz rozwojowa kodu to jest to dostepne. Mysle ze warto to rozwazyc

73 Waldek sp2ong


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 04-11-2014 19:55

Kurcze! Waldek o tym nie pomyślałem...
Cały czas projekt traktowałem jako swojego rodzaju zabawę... Ale pomysł jest całkiem niezły, z tym że nie wszyscy korzystali z SVN-a. Pewnie będziesz musiał z tym pomóc. Smile

A właśnie jeśli chodzi o zabawę to dzisiaj przed sniadaniem chciałem sprawdzić w praktyce to o czym mówił Jakub SP2IPT, a mianowicie jakie są różnice w czasie wykonania operacji na IF-ach i SWITCH-ach.

Doszedłem do tego że robiąc różne operacje w środku tego kodu wyniki testu są niejednoznaczne... Popróbujcie sami kod poniżej

Kod:
//kilka zmiennych
unsigned long time_start = 0;
unsigned long time_stop = 0;
unsigned long if_execution_time = 0;
unsigned long switch_execution_time = 0;
int test_zmienna = 0;
int test_val = 1;

//setup odpalamy port szeregowy
void setup(){
Serial.begin(9600);
  delay(3000);
}

//pętla główna
void loop(){
  //sprawdzamy ile czasu wykonuje sie if
  time_start = micros();
  if(test_zmienna == 0){
   Serial.println("ABCD");
  }else{
   Serial.println("BCDA" );
  }
  time_stop = micros();
  if_execution_time = time_stop - time_start;
  
  //sprawdzamy ile czasu wykona się switch
  time_start = micros();
  switch(test_zmienna){
   case 0:
     Serial.println("ABCD");
   break;
   case 1:
     Serial.println("BCDA" );
   break;
  }
  time_stop = micros();
  switch_execution_time = time_stop - time_start;
  
  //wyświetlamy wyniki
  Serial.print("test 1 czas wykonania instrukcji IF: ");
  Serial.print(if_execution_time);
  Serial.println("uS");
  Serial.print("test 2 czas wykonania instrukcji SWITCH: ");
  Serial.print(switch_execution_time);
  Serial.println("uS");
  delay(10000);
  
  if(test_zmienna == 0){
    test_zmienna = 1;
  }else{
    test_zmienna = 0;
  }
}

Jako następne ćwiczenie sprawdźcie co się stanie jeśli w procedurze "switch" i procedurze "if", wykonamy jakąś operację która jest prosta i szybka na przykład zmiana wartości zmiennej czy coś podobnego...

Myślę że taką analizę co kompilator robi z naszymi poleceniami to mógłby wykonać ktoś kto posiada znajomośc assemblera Wink


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP2ONG - 04-11-2014 20:47

Witam,

Czy GITHUB czy SVN trudno mi powiedziec ktory lepszy. Jedni wola GIT a inni SVN. W GIT widze ze dosc latwo robi sie tzw forka czyli osobna galaz projektu. W SVN nie bardzo pamietam. Troche uzywalem SVN na google bo tam mialem 2 projekty swoje OpenCaching (zabawa z GPS) ale obecnie juz mniej sie zajmuje nim bo sa koledzy ktorzy ciagna dalej :-)

Mysle ze trzeba zalozyc na przyklad projekt na ale tam trzeba miec konta na google a na GITHUB tez trzeba zarejstrowac sie i zalozyc konto chodzi o prowadzacych projekt.

Oczywiscie ci co bawia sie w programowanie musza zainstalowac sobie na SVN oprogramowanie i synchoroniowac go z code.google. Moze to wyglada strasznie napoczatku ale wierzcie mi jak jest paru ktorzy kod rozwijaja to porzadkuje calosc a moga dolaczyc inni zainteresowani.

Pare linkow do poczytania:

http://frogermcs.blogspot.com/2010/08/obsuga-svn-google-code-z-eclipse.html
http://mirror.1tbps.org/old-yc/youthcoders.net/oprogramowanie/svn/789-zakladanie-projektu-na-google-code.html
http://informatyka.wroc.pl/node/628

Pod MSWidnows oprogramowanie niezbedne
http://tortoisesvn.net/downloads.html

http://leniwy.eu/news,9,Podstawy-SVN-poradnik-dla-poczatkujacych.html
http://funkcje.net/pod_kat/5/47.html

pewnie wiele innych poradnikow

Dla GITHUB

http://git-scm.com/book/pl/v1/Podstawy-Gita-Pierwsze-repozytorium-Gita
http://blog.end3r.com/142/github-kodowanie-spolecznosciowe/
http://pl.discovermeteor.com/chapters/github/


Aby zylo sie lepiej z GITHUB w MSWidnows: https://windows.github.com/


http://www.kaims.pl/~goluch/KNAG/InstrGiT.pdf

Na GITHUB przykladowe projekty

https://github.com/electroyou/DDS_AD9834
https://github.com/MarSik/HF-SSB-CW-direct-conversion-receiver
https://github.com/m0xpd/DDS

Mysle ze GITHUB bedzie dobrym wyborem

73 Waldek SP2ONG


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP2IPT - 04-11-2014 21:42

Hmmm... nawet wyjalem po raz pierwszy Mege 2560 z pudelka i podlaczylem do komputera.
Musze przyznac, iz jestem zadziwiony wynikiem. Ciekawe jak to jest w rzeczywistosci optymalizowane, ze wyniki sa takie jakie sa.

Kod:
//kilka zmiennych
unsigned long time_start = 0;
unsigned long time_stop = 0;
unsigned long if_execution_time = 0;
unsigned long switch_execution_time = 0;
int test_zmienna = 0;
int test_val = 1;
int wyjscie;

//setup odpalamy port szeregowy
void setup(){
Serial.begin(9600);
  delay(3000);
}

//pętla główna
void loop(){
  //sprawdzamy ile czasu wykonuje sie if
  time_start = micros();
  
  for (int i=0; i<1000; i++) {
    for (int j=0; j<1000; j++) {
      if (test_zmienna == 0) wyjscie=test_zmienna; else wyjscie=test_zmienna;
    }
  }
  time_stop = micros();
  if_execution_time = time_stop - time_start;
  
  //sprawdzamy ile czasu wykona się switch
  time_start = micros();
  for (int i=0; i<1000; i++) {
    for (int j=0; j<1000; j++) {
      switch(test_zmienna) {
        case 0:
          wyjscie=test_zmienna;
          break;
        case 1:
          wyjscie=test_zmienna;
          break;
      }
    }
  }
  time_stop = micros();
  switch_execution_time = time_stop - time_start;
  
  //wyświetlamy wyniki
  Serial.print("test 1 czas wykonania instrukcji IF: ");
  Serial.print(if_execution_time);
  Serial.println("uS");
  Serial.print("test 2 czas wykonania instrukcji SWITCH: ");
  Serial.print(switch_execution_time);
  Serial.println("uS");
  delay(10000);
  
  if(test_zmienna == 0){
    test_zmienna = 1;
  }else{
    test_zmienna = 0;
  }
}

Daje na wyjsciu spojne czasy:
Kod:
test 1 czas wykonania instrukcji IF: 251852uS
test 2 czas wykonania instrukcji SWITCH: 629160uS
test 1 czas wykonania instrukcji IF: 251852uS
test 2 czas wykonania instrukcji SWITCH: 629160uS
test 1 czas wykonania instrukcji IF: 251852uS
test 2 czas wykonania instrukcji SWITCH: 880692uS
test 1 czas wykonania instrukcji IF: 251852uS
test 2 czas wykonania instrukcji SWITCH: 629156uS
test 1 czas wykonania instrukcji IF: 251852uS
test 2 czas wykonania instrukcji SWITCH: 880696uS
test 1 czas wykonania instrukcji IF: 251856uS
test 2 czas wykonania instrukcji SWITCH: 629156uS
test 1 czas wykonania instrukcji IF: 251852uS

Zdeycdowanie co innego pamietam z nauki C Big Grin

Jak widac ominalem niepotrzebne opoznienia na komunikacji z portem szeregowym i kazalem prockowi troche policzyc zeby miec pewnosc prawidlowosci pomiaru.

BTW: czy da sie podpiac pod to IDE jakis normalny edytor? (czytaj: vim) Wink

pz


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ5KVS - 04-11-2014 22:20

Właśnie nie wiem jak to jest z atmelami, ale... Procesory ARM maja inaczej zorganizowane wywołanie "IF" i w zasadzie różnic w szybkości miedzy If a switch nie ma. Zdecydowanie lepiej tez "komasowac" wiele instrukcji w jednym wywołanie, wtedy kompilator optymalizuje do odpowiednich komend wyższego poziomu (które robią kilka rzeczy na raz). Swego czasu pisałem programy z użyciem MMX/SSE/SSE2 - fajna zabawa, i sporo główkowania Smile
Ale - nie warto czasem kombinować pod górkę. Najpierw niech bedzie kod który robi co trzeba. Na doskonałość przyjdzie pora Wink

PS: Moze kompilator zauważył ze robisz dwa razy to samo niezaleznie od wyniku IFa.


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SQ9MDD - 04-11-2014 22:56

ad. p.s. To przebiegły kompilator...

Do poczytania, nie jesteśmy pierwsi którzy się zastanawiają o co chodzi...
http://blog.kriegsman.org/2013/12/01/optimizing-10-lines-of-arduino-code-youre-wrong-so-am-i/

No i Karol masz absolutną rację na tym etapie nie chodzi o "czystą perfekcję" a raczej o użyteczny kod i kupę zabawy Wink Kolega coś napisza a człowiek do porannej kawy główkuje jak by to przetestować. No a poza tym ja się cieszę że aktywność w wątku wzrasta.

Waldek dzięki za informacje o "SVN-ach" jest co czytać... postaram się coś z tego wdrożyć, chyba że będziesz pierwszy, to z chęcią się podepnę.

Vim? Brrr... to hardcor jakiś Wink Przyznam się że nie rozumiem vima.


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP2IPT - 04-11-2014 23:27

Hardcore to byl jak IDE Arduino wywalilo mi system Smile
OSX 10.10, wersja beta IDE do Ardka 10.5.8 zeby nie musiec uzywac starej dziurawej Javy. W pewnym momencie podczas przelaczania programow zostal mi tylko enter w klawiaturze, myszka to sobie tylko moglem jezdzic, klikanie przestalo dzialac Big Grin

Jak narazie zaczynam rozgryzac STMy, ale pewnie jak juz wyjalem plytke z folii to cos tez w wolnej chwili (w tym momencie prawie sam padlem ze smiechu Wink) sie pobawie. Wrazenia jak narazie sa takie, ze na Arduino duzo latwiej zaczac, ale to oczywiste.

Zaczynalem od Emacsa, ale w miare szybko przerobili mnie znajomi na Vima Big Grin

Zeby by bylo juz zupelnie offtop: sprawdzilem z przypisaniem do drugiej zmiennej w przypadku else/case - zaleznosci pozostaja takie same.

pz


RE: Fork-Heńka... czyli jak sobie poradzić z DDS za pomocą ARDUINO - SP3TLU - 06-11-2014 9:01

Witam szanownych kolegów.

Pozwolę sobie dołączyć do grona beta-testerów Złomka.
Temat śledzę od początku, ale dopiero wczoraj miałem trochę czasu
by to poskładać i uruchomić.

Ryszard, gratuluję i podziwiam.

Vy 73 Sebastian

[attachment=9173][attachment=9174][attachment=9175]