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].
(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źć.
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
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.
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
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
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)
pz
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
Ale - nie warto czasem kombinować pod górkę. Najpierw niech bedzie kod który robi co trzeba. Na doskonałość przyjdzie pora
PS: Moze kompilator zauważył ze robisz dwa razy to samo niezaleznie od wyniku IFa.
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/opt...g-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
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ś
Przyznam się że nie rozumiem vima.
Hardcore to byl jak IDE Arduino wywalilo mi system
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
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
) 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
Zeby by bylo juz zupelnie offtop: sprawdzilem z przypisaniem do drugiej zmiennej w przypadku else/case - zaleznosci pozostaja takie same.
pz
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]