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



Teraz jest 4 paź 2024, o 10:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 27 wrz 2012, o 18:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Znalazłem dość ciekawe filmiki na temat eliminacji drgań styków (metoda hardware (very simple way), i metoda software -też proste).
Można pozbyć się w fajny sposób funkcji blokujących _delay_.
Na pierwszym pokazane jest na oscyloskopie jak w rzeczywistości wyglądają drgania styków:

http://www.youtube.com/watch?v=Iby888ZXpZ8

na drugim jak temu kolo zaradza w prosty sposób

http://www.youtube.com/watch?v=sSOz1QcYnB0

Jeśli nasi moderatorzy uznają że jest to shit i nie przyda się nikomu lub jest w złym dziale - niech usuną

Pozdrawiam Arek

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 19:08 

Pomógł: 0

Fajne filmy :)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 19:52 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

W ogóle ten facet fajne filmy ma, chociażby konstruowanie własnej maszyny CNC od podstaw... ;D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 20:52 
Offline
Moderator
Avatar użytkownika

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

Nie ma co usuwać ;) ... jednak sam wciąż przymierzam się do stworzenia podobnego poradnika tyle że takiego zadającego niestety KŁAM - tym nieszczęsnym "drganiom styków"

wiem, wiem... ktoś zaraz powie, że przecież sam poświęciłem drganiom styków sporo miejsca w swojej pierwszej książce ;) ale już tłumaczę o co chodzi ... tzn o co mi teraz chodzi

Naturalnie "drgania styków" to nie jest żaden MIT. Ale ich rzekomy wpływ i to jeszcze tak tragiczny wpływ na działanie naszych programów to już jest MEGA MIT ....

A jak do tego dodać jeszcze tak durne pomysły jak prezentuje pewien gościu na swoim blogu, gdzie wciska początkującym chore pomysły iż jeśli stosujemy np kondensator 100nF jak na tych filmikach to jeszcze trzeba KONIECZNIE NIBY dodać rezystor w szereg ponieważ może dochodzić .... ba... na pewno dochodzi do WYPALANIA biednych styków :( .... ogniem piekielnym to już tworzy się ballada o zabarwieniu folklorystycznym z dorzecza amazonki ;) (nie będę tu podawał linku do tego bloga - na elektrodzie można znaleźć go w co drugim poście ;) ) ... żeby nie szerzyć tych bzdur

ale ok - przejdźmy do rzeczy bo jak widzę taki temat i takie filmiki to aż się prosi aby napisać poradnik o co tu chodzi ;) W zasadzie to ten człowiek na tych filmikach zrobił już kawał dobrej roboty w zasadzie udowadniając sam sobie - że drgania styków są w ogóle nie szkodliwe i to nie one przeszkadzają mu w tym programie ;) z tymi dwoma migającymi diodkami LED ..... dlaczego ?

Ano dlatego że zdecydowana większość ludzi w tego typu poradnikach szerzy niestety herezje :( .....

1. Popatrzcie sobie na te kolejne klikania i rozpaczliwe próby zaobserwowania drgań styków ;) ... ileż się facet musi naklikać żeby COŚ tam się pojawiło. A co się pojawia ? otóż pojawiają się takie przebiegi które w żaden sposób nie wpłynęłyby na te szybkie mignięcia diodami LED

2. facet programowo stara się udowadniać przez długi czas jak ciężko je wyeliminować żeby na końcu podać hmmm przepraszam ale koszmarny przykład jak je niby eliminować programowo. Bo hyhyhy najlepsze jest to że z użyciem kondensatora udowodnił tylko że zbocza się lekko wygładzają i rzeczywiście mniej tam troszkę tych zakłóceń

3. zakłócenia te są jednak w zdecydowanej większości przypadków (chociaż to też zależy od rodzaju przełączników) ... mizerne i nie mają wystarczających poziomów logicznych aby wyzwolić jakieś tam durne przełączanie diodek LED. Tym bardziej, że zwróćcie uwagę na podstawę czasu na końcu gdy poszerza ją na maxa (chyba są ze 2us) - co to ma do rzeczy ??? to wygląda tak jakby ktoś chciał nam wmówić że drgania styków pojawiają się same nawet gdy nie dotykamy klawiszy albo gdy je delikatnie muskamy palcem hahaha ;) sorki ale to bzdura .... takie nawet microswitche trzeba nieźle doginać żeby w ogóle wcisnąć - jak na takie maleństwa


...... no dobra - to gdzie jest problem ??? ktoś zapyta! ... przecież widać na filmiku że diodki LED czasem przekakują (zapalają się) niezgodnie z naszym oczekiwaniem

taaaaak oczywiście ale jeszcze raz podkreślam to nie WINA tych całych kocich drgań styków w zdecydowanej większości przypadków.

Przyczyną jest niezrozumienie (niestety) jak powinien działać klawisz w naszej aplikacji, jak zapewnić niezależne jego działanie od obsługi innych rzeczy w pętli głównej a także innych pojedynczych klawiszy.

podam prosty przykład na początek, który chyba każdy zna jako podstawę tej eliminacji drgań

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


No niech ktoś mi powie, że to nie wyeliminuje skutecznie drgań styków ? ;) .... no kto ? ktoś tak powie ??? (nie zważamy na razie że użyta jest tu funkcja _delay_ms() - nie w tym rzecz - skupmy się na istocie rzeczy)

więc proszę sobie ten kod wklepać - i spróbować kliknąć klawisz żeby dioda się zapaliła, potem kliknąć drugi raz żeby się zgasiła i tak dalej.....

a tu co ???? ZONK !!!

rzadko udaje się trafić żeby zapalić diodę albo ją zgasić - ona jak ta niesforna pchła wciąż się wymyka naszej kontroli. Gorzej ;) a co się stanie gdy wciśniemy paluch i go trzymamy wciąż ???? OOOO jej :( .... dioda zaczyna migać jak porąbana i robi nam się nagle z obsługi klawisza ułomny PWM ;)

no więc jak ??? jak to zrobić żeby jednokrotne naciśnięcie klawisza niezależnie jak długo czy krótko kliknę to żeby WYRAŹNIE zmieniło stan tej diody hmmm ??? no jak ? ;)

oczywiście rzadko komu się chce dogłębnie przeanalizować zagadnienie obsługi klawisza - bo każdy zresztą szybko myśli "a co tu analizować w ogóle?" .....

i ciach - wzbogaca nasz program o dodatkową jedną linijkę:

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



oooo ;) teraz jakby się coś poprawiło. Klikam krótko i ładnie dioda zmienia stan, klikam krótko drugi raz i znowu ładnie .... mniaaam ;) ... po co dalej myśleć - to wystarczy no nie ? ;)

a tu za chwilę znowu ZONK - bo przyszedł kolega, który ma duże paluchy i jest powolny i nie potrafi tak krótko jak my tego maleństwa kliknąć - więc gdy go wdusza do dioda znowu zachowuje się nieprzewidywalnie. Hmmm szybkim krakowskim targiem z uwagi na kolegę zwiększamy czas 250ms do np 500ms (pół sekundy) .... no i teraz koledze się udaje .... ale znowu nam to zaczyna przeszkadzać :( Nie mówiąc o tym, że znowu gdy wciśniemy długo klawisz to miga dioda co pół sekundy czy tam co 250ms a nam nie o to chodziło!!! Przecież niezależnie ile czasu go wduszę tego niesfornego klawisza to powinien się TYLKO RAZ zmienić stan diody LED !!!!! kurka wodna !!!

cóż to ? czyżby aż taaaaaaaaaak długie drgania tych styków ???? NIE, NIE - zdecydowanie NIE ....

po prostu trzeba to jakoś dalej i inaczej oprogramować - ŻADEN kondensator tu nie pomoże ;) chyba zaczynacie to dostrzegać prawda ???? (nie wspominam już o tych nieszczęsnych _delayach :( )

dlatego pierwsza podpowiedź.

1. trzeba nauczyć się programowo rozróżniać i to wyraźnie dwa stany: PRESS (wciśnięcie) oraz PUSH (zwolnienie klawisza) i reagować uwaga! TYLKO na jedno z tych zdarzeń !!!! zgadza się ???

przecież gdy zareagujemy na PRESS to gdy nadejdzie PUSH nie może się już powtarzać nasza akcja czyli miganie diody LED ;) I tak samo - jeśli zareagujemy na PUSH to reakcja nie może się powtórzyć podczas PRESS

i tu leży klucz do zrozumienia obsługi klawisza !!!! a nie tam durne drgania styków.

Na tych filmikach gościu pokazał pewien hmm dość standardowy sposób i to bez _delay'ów .... który DOKŁADNIUŚKO realizuje tę zasadę. A nieumiejętne początki pisania tej procedury przypisywał nadal z uporem maniaka drganiom styków.

proszę tu macie taki przykład:

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


Powołane są tu dwie zmienne Press oraz cnt, które tworzą taką mini maszynę stanów. Sprawdźcie to niby działa - ale też jeszcze nie tak do końca - czasem się zdarzy że jeszcze coś nie tak przeskoczy. Ale jeśli dodamy jeszcze jeden licznik i napiszemy to tak:

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



to nagle okazuje się że zaczyna to już działać niby IDEALNIE. Tzn spróbujcie sami - zapraszam. W sumie niby proste prawda ? - sprawdźcie działa ślicznie teraz. I co więcej nie ma nawet żadnego _delay'a !!!!!! zauważyliście to ??? więc ogromny postęp jakby nie patrzeć. Ale ten dodatkowy licznik wcale nie został dodany w związku z rzekomymi drganiami styków ;) .... chodzi o to, żeby nasz ludzki ułomny paluch nie trafił akurat na moment gdy cnt jest już PRAWIE = 0 !!!! bo wtedy kilka us dłuższego wciśnięcia i CIACH znowu KLOPS stan diod się zmieni ....

żeby jednak nie było zbyt różowo - jak bym miał w swoim projekcie wykorzystywać TYLKO jeden klawisz to pewnie bym użył może i takiego sposobu.

Ale jeśli miałbym tych klawiszy np PIĘĆ !!!! albo SIEDEM ??? To SZOK - ile trzeba byłoby zmiennych powołać do każdego z nich!, ile IF'ów !!!!

a co gorsze spróbujcie to tzn ten sposób wyprowadzić do jakiejś funkcji ;) .... jak zaczniecie to robić to....

.... to wbrew pozorom będą dwa pozytywne skutki jeśli się nie poddacie. Bo jeśli stworzycie to:

1. satysfakcja że się udało we własnym zakresie
2. zdobycie sporego (skill'a) doświadczenia - bez wątpliwości
3. gdyby wam jeszcze przyszło dodanie obsługi krótkiego kliknięcia i dłuższego a nie daj co jeszcze opcji AUTOREPEAT (która wg mnie bardzo często jest potrzebna) .....

to na końcu zrozumiecie funkcję

SuperDebounce() opisaną w mojej pierwszej książce - a dalej to już będzie o tyle fajnie, że będziecie sobie radzić luzikiem w każdej takiej sytuacji nawet bez SuperDebounce() .... tylko sami lekką ręką będziecie pisać takie nieblokujące i własne funkcje

reasumując - zobaczcie ile można napisać o takim "głupim" małym klawiszu ;)

------------------------ [ Dodano po: 2 minutach ]

MichalXY napisał(a):
W ogóle ten facet fajne filmy ma, chociażby konstruowanie własnej maszyny CNC od podstaw... ;D


Tylko żeby mnie ktoś źle nie zrozumiał - i tak super że gościu pokazuje takie fajne poradniki bo jak pisze MichalXY na prawdę ma ich wiele i fajnych sam oglądałem ;)

jedyne z czym się nie zgadzam - a to chyba drobiazg - to fakt, że nie tłumaczy on eliminacji drgań styków bo one w tym o czym opowiada odgrywają super marginalną rolę a omawia to jak powinno się podejść do obsługi durnego klawisza ;) i żeby zrozumieć podstawy to bardzo dobry przykład podaje - więc od strony dydaktycznej (jak zwał tak zwał) - przykład jest OK bo na pewno pozwoli wielu początkującym poradzić sobie w prostych swoich pierwszych programach z taką obsługą.

_________________
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: 28 wrz 2012, o 18:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Jak sprawdzić szybkość inkrementowania zmiennej licznik i cnt?
Skąd wiadomo ile wynosi okres "zwiększenia o jeden" każdej z tych zmiennych?
Nie rozumiem też po co jest w tym programie zmienna cnt. Do czego została wprowadzona i jak ona tutaj działa?
Proszę o wytłumaczenie i z góry dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 19:37 
Offline
Moderator
Avatar użytkownika

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

a po co ci sprawdzać szybkość inkrementowania cnt ?

widzę że nie przeczytałeś tego uważnie - czyli nie przeanalizowałeś i nie określiłeś wyraźnie celów jakie chcesz osiągnąć ? jeśli tak to najpierw je opisz - bo twój przykładowy kod nie działa właśnie dlatego że piszesz go na gorąco bez przemyślenia .... ot tak żeby coś przypasowało :(

z chęcią więc wytłumaczę ale odpowiedz na powyższe najpierw.

_________________
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: 28 wrz 2012, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Naprawdę ciągle analizuję Twój post od mojego ostatniego wpisu i wciąż nie rozumiem bytu zmiennej cnt.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kod w takiej postaci jest dla mnie zrozumiały (bez zmiennej cnt) i wszystko działa tak jak razem ze zmienną cnt. Tzn ja żadnych zmian w działaniu nie zauważyłem, w czym tkwi sęk?
Każde kolejne kliknięcie zmienia stan diody na przeciwny, czyli zgodnie z założeniem programu.
Serio nie rozumiem po co tam wyżej była użyta zmienna. :(
A jeżeli chodzi o czas inkrementowania zmiennej w tym przypadku - zmiennej licznik, to po prostu chciałbym wiedzieć ile czasu trwa cała inkrementacja od zera do tych 20000 z pierwszego warunku.
Podoba mi się to rozwiązanie, a nawet bardzo, bo brak tutaj jakichkolwiek delay'ów.
Po drugie chciałbym wykorzystać ten pomysł do zrobienia przycisku z reakcją na krótkie/długie zwarcie do masy, stąd też chciałbym wiedzieć do jakiej wartości musi być inkrementowana zmienna licznik żeby trwało to np 2 sekundy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 21:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

A zauważyłeś że nie ma tam _delay , Jest to funkcja nie blokująca i dlatego jest tam zmienna licznik , powinieneś ją potraktować jak swego rodzaju opóźnienie które eliminuje drgania styków ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 21:55 
Offline
Moderator
Avatar użytkownika

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

A mnie się ten sposób nie podoba bo przez niego kod programu się rozbudowuje jak kaszanka :( i pisałem że jest mało przydatny

odnośnie licznika cnt - to jeszcze raz sobie rozważ przykłady po kolei - czy nie widzisz że mowa o reakcji na PRESS albo na PUSH ???? rozróżniasz te stany ? (cnt jest odpowiedzialny za puszczenie ... jeśli z tego nie korzystasz to możesz pominąć cnt a jeśli nie korzystasz z PRESS to możesz pominąć zmienną licznik.

Wiesz przy okazji co to AutoREPEAT dla klawisza ?

Analizowałeś funkcję SuperDebounce() ???

------------------------ [ Dodano po: 1 minucie ]

Malutki_27 napisał(a):
A zauważyłeś że nie ma tam _delay , Jest to funkcja nie blokująca i dlatego jest tam zmienna licznik , powinieneś ją potraktować jak swego rodzaju opóźnienie które eliminuje drgania styków ;)


Nie nie Malutki - to wcale nie jest do eliminacji drgań styków - przeczytaj ten post z linku który podałem wyżej i zobacz jaki zadaję CIOS bajkom na temat drgań styków ;) .... tzn jakie ja herezje tam opowiadam ;)

Niedługo wrzucę cały opis na Bloga bo widzę że tego posta mało kto czyta

"drgania styków to bajki" dla niegrzecznych dzieci ;)

_________________
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: 28 wrz 2012, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Nie no dobrze zrozumiałem ....... jest to opóźnienie związane z potrzebą opóźnienia wykonania się funcji ( ja to nie opatrznie określiłem jako drgania styków )

Bardzo podobną funkcję sam wykorzystuje tylko że ja akurat zamiast licznika używam "trójstanu" zmiennej ........ ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 22:33 
Offline
Moderator
Avatar użytkownika

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

a to okej ;)

_________________
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: 28 wrz 2012, o 22:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Aaaaa już rozumiem! Chodziło o ten moment "odbicia przycisku". Wduszamy -> wbijamy przycisk, później puszczamy -> czyli odbijamy. :)
Analizowałem funkcję z książki, ale to jest "level-up" moich umiejętności. Może jak przerobię jeszcze parę ćwiczeń warsztatowych, to ją w końcu pojmę..
Czekam, czekam na artykuł na blogu! :)
A jeszcze 2 sprawy pozostały, z tym czasem podczas inkrementowania zmiennej licznik jak to jest?
I co ja źle robiłem w tym programie z Timerem1?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 23:02 
Offline
Moderator
Avatar użytkownika

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

jeszcze raz powtarzam ten "licznik" nie jest i nie wykorzystasz go do tego o czym myślisz czyli opóźnienia ;) ... zapomnij o tym.

Z timerem to po prostu zrobiłeś tak cyrkową sztuczkę że mi nawet trudno powiedzieć co źle zrobiłeś bo nie wiem co chciałeś zrobić ?

A jeśli na to pytanie miałbyś odpowiedzieć, że chciałeś uzyskać w ten sposób jakieś opóźnienie 2s to - niestety KOSMOS - spróbuj sam to przeanalizować na głos - to się też zapętlisz jak i kompilator. W ogóle nie tędy droga.

_________________
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: 28 wrz 2012, o 23:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 kwi 2012
Posty: 59
Pomógł: 1

Będę w takim razie pisał w tamtym temacie, żeby nie było bałaganu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 23:11 
Offline
Moderator
Avatar użytkownika

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

Stanley napisał(a):
Będę w takim razie pisał w tamtym temacie, żeby nie było bałaganu.


Ok, spróbuj tam napisać coś na nowo ale co ważne opisać dokładnie i w komentarzach też - jak to wg ciebie ma działać linia po linii - wtedy będzie można coś pomóc.

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO