Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 cze 2017, o 23:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 32 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 20 kwi 2017, o 20:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Witam wszystkich i bez zbędnego owijania mam prośbę abyście w boju przetestowali poniższy programik do obsługi enkodera-impulsatora. Podłączajcie pod procka przetarte ("iskrzące") stare enkodery (kurcze ja mam wszystkie nowe i sprawne) i katujcie ile się da. Moje próby wyprowadzenia programu z równowagi nie powiodły się. Konkretny impuls zawsze należał do konkretnego pyknięcia i nie udało mi się zarejestrować ani jednego błędu mimo prób bardzo wolnego (przyblokowanego) ruchu gałką.
Podaje dla ułatwienia testów dwie wersje: dla enc połówkowego czyli jeden krok to 00-01-11, następny krok 11-10-00, oraz takiego który przelatuje przez całą sekwencję od 00-01-11-10-00 i dopiero zatwierdza impuls (właściwie robi to w trakcie ;) ).
Procesor Atmega32 taktowany kwarcem 16Mhz.
Konfiguracja LCD następująca:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Enkoder podłączamy bez żadnych dodatkowych elementów (broń boże jakieś kondensatory tam pchać) bezpośrednio pod dwa pierwsze piny czyli 0 i 1 portu A.

Chodzi o to, że uparłem się (tak już mam :lol: ) aby nie korzystać z gotowych rozwiązań, które nie do końca są po mojej myśli i zacząłem tworzyć własną obsługę enkodera. Warunkiem była oczywiście pewność działania przy stosunkowo małym rozmiarze kodu (136 bajtów dla wersji "half" i 80 bajtów dla wersji "full"), mała zasobożerność (kod jest błyskawiczny) i duża szybkość reakcji. Tu pracuje w przerwaniach 10kHz i obsługa 500 impulsowego enkodera (pracował jako half) jaki z największych miałem pod ręką była bezproblemowa. Jeśli dobrze liczę to powinienem przy tej częstotliwości taktowania odbierać impulsy z częstotliwością ponad 3300Hz (3 kroki na cykl liczenia). Jeszcze jedną rzeczą, której chciałem uniknąć to zatrzymywania przerwań (atomic block). W moich projektach sterowników są one dość rygorystycznie obsługiwane i mogłoby (choć nie koniecznie musiało) zakłócić pracę innych bloków programu.
Na razie testujcie. Kod będzie później jak się okaże, że wszystko jest ok i nie mam się czego wstydzić ;)
Załącznik:
impulsator.zip


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2017, o 10:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

Brzmi interesująco. Gratuluję ciekawego podejścia do prezentacji swojej pracy.
Na pewno wypróbuję kod, bo bardzo interesują mnie enkodery :)
Ciekaw jestem tych obietnic... :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2017, o 10:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Dotrzymuję słowa :) Najpierw testy, później kod ;)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2017, o 10:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

Ach źle napisałem, chodziło mi o wypróbowanie wsadu (w domyśle kodu, w końcu bez kodu nie ma wsadu ) :)
Mam w domu enkoder optyczny 360 impulsów na obrót (pogróżka :) ), będę zatem bezlitosny :)

Z drugiej strony tak sobie myślę, że goła obsługa enkodera nie jest tak dużym wyzwaniem jak choćby nieco bardziej skomplikowany, wielowątkowy, czasowy projekt.
W takich dopiero warunkach można oceniać kod obsługi enkodera, co mam nadzieję, że wypróbujemy w następnych iteracjach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2017, o 14:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Zealota napisał(a):
Mam w domu enkoder optyczny 360 impulsów na obrót (pogróżka :) ), będę zatem bezlitosny :)


Świetnie. Na to liczę :mrgreen:

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 15:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Widzę, że wsad parę razy pobrany... Naprawdę nikt jeszcze nie przetestował tej próbki? :(

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 16:23 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 152
Pomógł: 2

Idzie do mnie enkoder > 16kobr. Jak dojdzie - przetestuję i dam znać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 18:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

To chyba jakiś specjalistyczny? Przy wysokich obrotach nie ma szans, żeby AVR czegoś nie zgubił, chociaż jakby podnieść częstotliwość przerwań to coś tam zliczy :)
Jak będę przy kompie to wrzucę bibliotekę. Będzie wtedy można przetestować na czym kto może i na czym kto chce :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 18:34 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1073
Lokalizacja: okolice Warszawa
Pomógł: 98

Witaj SylwekK,
SylwekK napisał(a):
Widzę, że wsad parę razy pobrany... Naprawdę nikt jeszcze nie przetestował tej próbki? :(

skusiłem się by sprawdzić ten wsad. :)
pobawiłem się na ATB 1.05 ,
kręcąc w obie strony jak szalony. (dobrze że enkodera nie urwałem) :lol:
sprawdziłem też w powolnym tempie,
zauważyłem że pojawia się sporadycznie kierunek przeciwny(czyli zakłócenia z mojego enkodera), :P
kurcze, pomimo tego oszukaństwa licznik nie zgubił się. :D
i o wyskalowaniu graficznym widzę pomyślałeś. :) działa fajnie ! ;)
pozdrawiam Darek P.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 19:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

No dobra, to wrzucam jak obiecałem bibliotekę. Myślę, że wybaczycie mi dużo mniej elastyczny sposób jej konfiguracji w porównaniu z tym co robi Mirek, ale mimo wszystko z jej korzystaniem nie powinno być problemu. W załączniku libsik, a poniżej przykładowe użycie na M32 16Mhz.

Aktualna wersja biblioteki pod poniższym linkiem:
topic18208.html#p188030

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


@Daro69, z tym kierunkiem to po prostu odczyt zmiennej encoder_dir, a ta w trakcie drgania styków może się zmienić kilka razy :) Umieściłem w tamtym wsadzie tylko jako ciekawostkę. Jeśli to komuś potrzebne to można badać już sam wynik po zmianie i będzie bardziej wiarygodnie :)

_________________
http://www.sylwekkuna.com



Ostatnio edytowano 6 maja 2017, o 11:05 przez SylwekK, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 19:34 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1073
Lokalizacja: okolice Warszawa
Pomógł: 98

aha ...nie napisałem że odpaliłem na 18,432 MHz, :) , bo nie miałem 16-ki. :P
dzięki za .c i .h , przeanalizuję w celu edukacyjnym. :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2017, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Aha, a ja zapomniałem dopisać, że jeśli ktoś nie korzysta z przerwań to też można spokojnie działać z enkoderem. Warunek jest taki, że cały czas w pętli musi być odczytywany razem z aktualizowaną zmienną czyli coś w tym stylu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


EDIT:
Oczywiście w takim przypadku warto LCD odświeżać nieco rzadziej, bo to on będzie tu zakłócał odczyt (spora strata czasowa) i w życiu nie uzyska się takiej pewności zliczania jak w przerwaniach.

_________________
http://www.sylwekkuna.com



Ostatnio edytowano 23 kwi 2017, o 17:35 przez SylwekK, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2017, o 09:50 
Offline
Użytkownik

Dołączył(a): 27 sty 2016
Posty: 152
Pomógł: 2

Projektuję i buduję gniazda produkcyjne. Takie enkodery to moja codzienność - muszę przecież jakość odmierzać pozycję.
m.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2017, o 22:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

Widzę wątek się fajnie rozrósł, jest gotowa biblioteka.
W międzyczasie udało mi podłączyć zarówno enkoder optyczny jak i mechaniczny.
Niestety na testy optycznego nie miałem pomysłów, mam jedynie ogólne wrażenie: kręci się i to szybko:)
Wrzuciłem więc mechaniczny i nie udało mi się programu wyprowadzić z równowagi, przy standardowym kręceniu paranoika :)
Jest zasadne, że kod powinien nadać się do standardowych rozwiązań jako manipulator i powinienem spróbować go zaadoptować u siebie, ale nie wiadomo kiedy :( bo mirkowe kody w moich programach póki co działają.
Jeśli jednak podejmę się zadania to prawie na pewno obuduję i tę bibliotekę w callbacki i zdarzenia.
Dzięki jeszcze raz za podzielenie się biblioteką.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2017, o 23:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

Jeśli można chciałbym zaprezentować drobną modyfikację (w ramach zabawy z kodem).
Modyfikacja ta pozwoli nam definiować dowolne, piny z różnych portów.
Sercem będzie makro i definicje portów oraz pinów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Żeby całość działało tak jak w oryginale, należy zmodyfikować funkcję "encoder_port":
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Do tego stworzymy funkcję dodatkową:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i podmieniamy za makro ENC_IN w pliku encoder_SK.c
No i cieszymy się zwiększoną funkcjonalnością.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2017, o 07:23 
Offline
Użytkownik

Dołączył(a): 10 sty 2017
Posty: 36
Pomógł: 4

Taka moja drobna poprawka zupełnie kosmetyczna. Wydaje mi się, że lepszy dla szybkiej identyfikacji znaczenia będzie zapis zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

np. taki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I jeszcze pytanko
Zealota napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pomijając jak zostanie zoptymalizowany zapis temp |= (1<<1);
czemuś szczególnemu ma służyć? Linijkę wcześniej jest temp = 0x01; a dalej przesunięcie bitowe stałej o wartości 0x01 o jeden bit w lewo.
Pytam bo chciałbym wiedzieć o powodach zastosowania dwóch różnych zapisów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2017, o 07:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Cieszę się, że jest zainteresowanie biblioteką, którą opublikowałem jako inspirację do dalsazych prób i modyfikacji. Mam jednak uwagę co do zamiany makra ENC_IN - właśnie to makro wskazane by było aby zajmowało jak najmniej czasu. Te kilka dodatkowych if'ów w przeróbce zajmuje sporo miejsca jak by nie patrzył. Fajnie by było jakby odpowiednimi definicjami już na etapie preprocesora udało się załatwić wygodniejszee przypisy do pinów wybranego portu oraz stałych STANx. To by było chyba najekonomiczniejsze rozwiązanie jeśli chodzi o szybkość wykonywania funkcji. Moje definicje może nie są jakieś wyszukane, ale w sumie można się połapać choć nie ukrywam, że właśnie liczyłem na kogoś kto to zmodyfikuje, bo moja wiedza na tym etapie jest nieco skromna :-)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2017, o 12:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

SylwekK napisał(a):
Cieszę się, że jest zainteresowanie biblioteką, którą opublikowałem jako inspirację do dalsazych prób i modyfikacji. Mam jednak uwagę co do zamiany makra ENC_IN - właśnie to makro wskazane by było aby zajmowało jak najmniej czasu. Te kilka dodatkowych if'ów w przeróbce zajmuje sporo miejsca jak by nie patrzył. Fajnie by było jakby odpowiednimi definicjami już na etapie preprocesora udało się załatwić wygodniejszee przypisy do pinów wybranego portu oraz stałych STANx. To by było chyba najekonomiczniejsze rozwiązanie jeśli chodzi o szybkość wykonywania funkcji. Moje definicje może nie są jakieś wyszukane, ale w sumie można się połapać choć nie ukrywam, że właśnie liczyłem na kogoś kto to zmodyfikuje, bo moja wiedza na tym etapie jest nieco skromna :-)


Moja wiedza też niestety skromna.
Widzę jedynie potencjał takiej modyfikacji przy pracy nad nowymi projektami, gdzie szukamy dopiero właściwej pinologii.
Ja często "żongluję" pinami jeśli pracuję koncepcyjnie, szczególnie wtedy, gdy szukam rozwiązań lub gdy przygotowuję bibliotekę np na kilka procków. Zaproponowane makra pozwalają na pewną swobodę, niestety kosztem szybkości, choć uważam, że w standardowych projektach nie będzie z tym problemu, a wygoda doboru pinów ma swoją wartość.
Wracając do szybkości, założyłem, że funkcja typu "static inline" dołoży trochę do szybkości.
Zmienną temp można wspomóc przedrostkiem "register", co powinno dać dodatkowy wzrost prędkości, ale te modyfikacje mogą zależeć silnie od opcji kompilacji.
riddik napisał(a):
Taka moja drobna poprawka zupełnie kosmetyczna. Wydaje mi się, że lepszy dla szybkiej identyfikacji znaczenia będzie zapis zamiast

Podoba mi się :)

riddik napisał(a):
Zealota napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pomijając jak zostanie zoptymalizowany zapis temp |= (1<<1);
czemuś szczególnemu ma służyć? Linijkę wcześniej jest temp = 0x01; a dalej przesunięcie bitowe stałej o wartości 0x01 o jeden bit w lewo.
Pytam bo chciałbym wiedzieć o powodach zastosowania dwóch różnych zapisów.


Tu nie chodzi o przesunięcie bitowe, same w sobie, ale o wykrycie stanów wysokich na pinach.
Pierwszy zapis ustawi bit 0, a drugi bit 1.
Jest to standardowy sposób na ustawianie pojedynczych bitów, jak zauważył SylwekK może mieć wpływ na szybkość w wymagających zadaniach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2017, o 13:47 
Offline
Użytkownik

Dołączył(a): 10 sty 2017
Posty: 36
Pomógł: 4

Ok ale dlaczego w takim razie nie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2017, o 13:54 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21018
Lokalizacja: Szczecin
Pomógł: 765

riddik napisał(a):
temp |= 0x02;

Dlatego, że na tym forum każdy docenia przejrzysty zapis z przesunięciami bitowymi, który jest po stokroć bardziej przejrzysty niż wpisywanie wartości HEX ...

dla ciebie nie ma różnicy pomiędzy np takimi dwoma zapisami ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


? jak nie widzisz różnicy to postaraj się zrozumieć co oznacza "dobry styl programowania" ponieważ te dwa zapisy NICZYM się nie różnią z punktu widzenia kompilatora a tym bardziej procesora. Za to ten drugi sposób JEST PASKUDNY jeśli chodzi o widoczność, które bity macamy.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 07:58 
Offline
Użytkownik

Dołączył(a): 10 sty 2017
Posty: 36
Pomógł: 4

To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 << 0)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 08:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21018
Lokalizacja: Szczecin
Pomógł: 765

riddik napisał(a):
To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 << 0)?

Pokazałem, który zapis jest czytelniejszy i napisałem dlaczego - a nie żeby się przyczepiać co jest dwie linijki wyżej a co niżej.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 09:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

riddik napisał(a):
To dlaczego dwie linijki wyżej jest temp = 0x01 zamiast temp = (1 << 0)?

No cóż, programowanie to taka sztuka, gdzie każde z zadań ma wiele rozwiązań.
Co zostanie wybrane to zależy od umiejętności programisty, jego predyspozycji, uzyskanej wiedzy a czasami, po prostu, pewnych preferencji zależnych od kontekstu, a zwykle po prostu jego "widzimusię" :)

Powyższe zadanie miało na celu ustawienie dwóch najmniej znaczących bitów w bajcie.
Założyłem, że zacznę od ustawiania bitu na pozycji 0 (jeśli będzie potrzeba - warunek "if").
Ten kto już liznął zapisu hexadecymalnego to łatwiej mu wpisać "temp = 0x01". Mając pewną wprawę w programowaniu taki zapis jest dość czytelny.
Drugi wpis miał zmanipulować bitem na pozycji 1, nie naruszając żadnego innego bitu.
W dwóch linijkach mamy dwie formy zapisu, pierwsza będzie szybsza, bo mamy tylko przypisanie, druga będzie nieco wolniejsza, bo oprócz przypisania jest też przesunięcie. Różnice w szybkości dla tego zadania nie są jakieś kolosalne, ale warto o nich pamiętać.
Nie ma żadnych przeciwwskazań żeby zapisać całość tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ale dla mnie czytelniej było to co wcześniej, choć na pewno nie powiem, że lepiej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 09:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21018
Lokalizacja: Szczecin
Pomógł: 765

Zealota napisał(a):
druga będzie nieco wolniejsza, bo oprócz przypisania jest też przesunięcie


to:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


będzie wolniejsze niż to?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeśli kolega tak sądzi to proponuję jednak zrobić proste ćwiczenie jak DRUT, czyli skompilować i zajrzeć do kodu ASM w pliku *.lss

No i zastanowić się dobrze ... bo tu nawet nie ma ŻADNEJ wątpliwości, że obydwa zapisy dla kompilatora są ABSOLUTNIE JEDNOZNACZNE, proponuję też przypomnieć sobie co to są tzw "stałe dosłowne"

NIGDY W ŻYCIU procesor nie będzie tu wykonywał ŻADNEGO przesunięcia bitowego ;) panie kochany obydwa zapisy

Kod:
0x02
(1<<1)


to są STAŁE DOSŁOWNE czy ty tego nie widzisz ? ;) powiem więcej, takie zapisy jak niżej

Kod:
0b00000010
2
0x02
1<<1


to też będzie TO SAMO - czyli ta sama stała dosłowna ;) Toż kompilator zamieni to na bajt o wartości = 2 i taka wartość trafi do rejestru aby brać udział w operacji przypisania do zmiennej

no myślę, że takie PODSTAWY to jednak warto dobrze rozumieć.

To co piszę nie ma już nawet nic wspólnego czy używać przesunięć czy wartości HEX. Bo tak jak piszesz czasem w tak prostym przypadku gdzie mamy albo 0x01 albo 0x02 to nie stanowi dużego problemu

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 09:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

No cóż biję się w pierś, to były braki w wiedzy, ale po to ciągnie się wątki, żeby sobie ją uporządkować :)
Sprawdziłem i faktycznie tak jest, także dzięki, lekcję o stałej dosłownej na pewno zapamiętam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 09:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21018
Lokalizacja: Szczecin
Pomógł: 765

Zealota napisał(a):
ale po to ciągnie się wątki, żeby sobie ją uporządkować

Dokładnie o to chodzi ... dlatego czasem staram się włączyć do dyskusji ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 10:42 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 864
Pomógł: 40

Przesunięcia bitowe doszły by wtedy gdyby zostały zastosowane jakieś zmienne a nie stałe :)

Sent from my Mi-4c using Tapatalk



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2017, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

micky napisał(a):
Przesunięcia bitowe doszły by wtedy gdyby zostały zastosowane jakieś zmienne a nie stałe :)


Ooo tego nie umiałem sformułować w komentarzu, choć podskórnie wiedziałem o tym :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 kwi 2017, o 01:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1149
Lokalizacja: Lipsko
Pomógł: 74

Żeby już postawić kropkę nad obsługą różnych typów enkoderów dodaję jeszcze ciut rozbudowaną wersję biblioteki obsługującą 4 impulsy czyli innymi słowy każdą zmianę stanu enkodera (nie tylko na "klik"). Gdzie to się może przydać? Przede wszystkim tam gdzie enkoder nie robi "kilik", tj. enkodery optyczne lub magnetyczne gdzie ich ruch jest płynny. Pozwala to znacznie zwiększyć ich rozdzielczość. Przykładowo moje enkodery magnetyczne RMS20-250, które z założenia mają 250 impulsów... ale pełnych czyli od 00 do 00 (lub 11 do 11 ;) ) teraz uzyskują 1000 impulsów na obrót :) Oczywiście drgania styków nie straszne, bo akceptowane są tylko stany sąsiednie enkodera, a podczas drgań następuje i wzajemna kompensacja impulsów nadmiarowych.

Aha, i o ile przy przerwaniach 10kHz robiłem kołowrotek z enkodera to zdarzyło mu się coś zgubić, natomiast po zwiększeniu próbkowania do 50kHz mało palców nie połamałem przy kręceniu, a pozycja startowa za każdym razem była ta sama, z której zaczynałem 8-)


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
http://www.sylwekkuna.com



Ostatnio edytowano 6 maja 2017, o 11:28 przez SylwekK, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 kwi 2017, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 63
Lokalizacja: Gliwice
Pomógł: 4

Wg mnie jeszcze nie można postawić kropki :) Już tłumaczę dlaczego.
Brakuje tutaj jeszcze, żeby dopełnić obsługę enkodera, technik zdarzeniowych i funkcji zwrotnych :)
Pewnie niektórzy złapią się za głowę, po co taką "kobyłę" stosować do "prościutkiej" biblioteki, ale wg mnie po to, żeby nieskomplikowany kod nie komplikował tych bardziej skomplikowanych. Oprócz tego Mirek wielokrotnie udowadniał w poradnikach, że zdarzenia i callbacki znacznie upraszczają kod i powoli ta myśl mnie ukierunkowuje.
Dodatkowo myślę, że należy iść tą drogą już nawet na początku programowania, bo na końcu to taki must have.

Sam jeszcze tego tematu całkowicie nie ogarniam, ale wszystko wskazuje na to, że udało mi się zastosować obsługę mirkowych rozwiązań do niniejszej biblioteki. Mam nadzieję też, że ten przykład ukierunkuje innych.
Załączam bibliotekę, a zmiany to:
- pozostaję przy modyfikacji definicji dowolnych pinów procesora (bo tak :) )

- włączenie techniki zdarzeniowej i calbacków, dzięki temu kod jest przejrzysty oraz dodatkowo wyświetlacz nie jest męczony w pętli głównej (efekt uboczny, ale pożądany :) )
Może tego nie widać na LCD, ale u mnie na VFD strasznie to migało. Oczywiście to tylko kod przykładowy był u Sylwka, ale warto zwrócić na to uwagę.

- włączenie/wyłączenie obsługi timera przez użytkownika i korzystanie bez dodatkowych zabiegów z pollingu.
Nie zawsze można skorzystać z timera, a w wielu projektach obsługa enkodera nie musi być krytyczna. Jeśli coś się zgubi to niewielka strata.

- przeniesienie inicjalizacji timera do funkcji inicjującej enkodera. Przy okazji zmieniłem na:
void encoder_init(void); To jeszcze bardziej uprościło funkcję main.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Na zakończenie jeszcze uproszczony plik main.c:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



PS
"prościutkiej" biblioteka - to taki mój skrót myślowy.
Sam jestem pod wrażeniem kodu Sylwka, bo obsługa jest naprawdę przemyślana, a brak konieczności używania jakichkolwiek filtrów na piny enkodera to jest ta najważniejsza miodność tego rozwiązania :)


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 32 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO