dondu Październik 11, 2011 Udostępnij Październik 11, 2011 Odwrócenie diod pomogło. Aczkolwiek jest to dla mnie dziwne ale ważne że działa. Dziękuję wszystkim za pomoc. Pozdrawiam Rozwiązanie problemu, bez zrozumienia dlaczego działa, nie wróży Ci przyszłości w tej dającej wiele satysfakcji dziedzinie.
niciki Październik 11, 2011 Udostępnij Październik 11, 2011 Sabre: Twoje uwagi do moich postów są niewątpliwie słuszne i zasadne. Moje powyższe argumenty nie są wyznacznikiem poprawności rozwiązania. Pozwól jednak, że obronię przytoczone przeze mnie podejście w inny sposób. Proponuję następujące rozwiązanie: Określenie, który przycisk został wciśnięty, odbywa się na zasadzie skanowania jak poprzednio, z tą różnicą, że port B (od PB0 do PB3) jest portem wyjściowym, a port C (od PC0 do PC3) jest portem wejściowym. Kolejnośc skanowania jest oznaczona pogrubionymi cyframi. Kolorami zaznaczono kolejne kody skanujące: ================== 1 2 3 4 PB0 ----|-----|-----|-----|--- 0 1 1 1 PB1 ----|-----|-----|-----|--- 1 0 1 1 PB2 ----|-----|-----_----|--- 1 1 0 1 PB3 ----|-----|-----|-----|--- 1 1 1 0 _____PC0 PC1 PC2 PC3 (zczytywanie) ______1___1___1___1___1 ______1___1___1___1___2 ______1___1___0___1___3 <- wciśnięty przycisk w 3cim wierszu i 3ciej kolumnie ______1___1___1___1___4 Wady: - komplikacja kodu programu - układ "trudniejszy" do oprogramowania dla początkujących Zalety: - oszczędność nóżek uK (dla 16 przycisków zużywamy 8 nóżek: 4 wiersze i 4 kolumny) - układ skalowalny (szybko można zwiększy/zmniejszyć liczbę przycisków) - możliwość wykrycia kombinacji wciśniętych przycisków (np. inna interpretacja wciśnięcia dwóch, lub trzech przycisków jednocześnie)
dondu Październik 11, 2011 Udostępnij Październik 11, 2011 Drobna uwaga do Twojego schematu. Rezystory nie są potrzebne ponieważ wystarczy ustawić pull-upy na PC0-PC3. Ponieważ odniosłem się wcześniej do Twojego układu, to spróbuję dokończyć i opisać jak ja bym to widział, ale bez rezystora i bez diod. Autorowi tematu zależało na przerwaniu, więc moja propozycja jest taka: Oczywiście będzie to trudniejsze programowo, ale za to z przerwaniem INT czyli bez skanowania oraz bez dodatkowych elementów. Inicjujemy obsługę klawiatury: 1. Ustawiamy PD2(INT0) jako wejście i włączamy jego pull-up 2. PC0-PC3 jako wyjścia i ustawiamy na nich 0 3. Włączamy przerwania z INT0 na opadające zbocze i globalne oczywiście także. przerwanie(INT0){ zablokuj przerwania od INT0 zmień PD2 na wyjście i ustaw zero zmień PC0-PC3 na wejścia i ustaw pull-upy odczytaj PC0-PC3 <-- stan klawiszy } W ten sposób mamy odczytany stan klawiatury w momencie przyciśnięcia przycisku. Teraz jedynie musimy stwierdzić, czy wszystkie przyciski zostały puszczone i ponownie zainicjować klawiaturę. Jak to zrobić - trzeba skanować, lub odwrócić kota ogonem czyli INT0 przestawić na zbocze narastające, które pojawi się gdy klawisz zostanie puszczony. Algorytm powyższy nie pozwala jednak na naciskanie więcej niż 1 przycisku. Ale gdyby pogłówkować, to coś by się dało wymyśleć. Poza tym rozwiązanie z diodami jakie zostało przytoczone przez autora tematu jest pod tym względem, tak samo ograniczone, czyli zakładał właśnie możliwość przyciśnięcia w tym samym momencie tylko 1 przycisku. Oczywiście zawsze jest pytanie czy warto komplikować program? Na to pytanie już tylko autor tematu zna odpowiedź, bo on wie, co jest dla niego ważne, a co nie. Dodatkowo w każdym omawianym w tym temacie rozwiązaniu należy jeszcze pamiętać o: Drganiach styków
certino Październik 12, 2011 Autor tematu Udostępnij Październik 12, 2011 Witam Nie zakładam wciskania 2 przycisków jednocześnie, dlatego to co mam mi wystarczy. Co do drgań styków nie mam problemu są wyeliminowane programowo i dodatkowo dołożyłem ceramik przy każdym porcie do masy. Wciśnięcie przycisku powoduje 1 przerwanie więc nic nie drga.
dondu Październik 12, 2011 Udostępnij Październik 12, 2011 ... dodatkowo dołożyłem ceramik przy każdym porcie do masy. Wciśnięcie przycisku powoduje 1 przerwanie więc nic nie drga. Czy wiesz także, o tym, że switch zwierający do masy kondensator pracuje w warunkach zwarcia i cały prąd z kondensatora płynąc przez styki klawiszy powoduje ich sukcesywne niszczenie? Zobacz przedostatni punkt w tym temacie: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html W konsekwencji, czy wiesz, że w ten sposób jest także możliwe uszkodzenie mikrokontrolera przez generowane zwarciem "przepięcia"?
nanab Październik 12, 2011 Udostępnij Październik 12, 2011 Jak wielka energia jest zgromadzona w kondensatorze o pojemności kilku nF naładowanym do 3,3 albo 5V? Nie pamiętam już wzorów i szczerze nie chce mi się ich szukać a tym bardziej liczyć tego, ale sądzę, że wartość prądu przekraczałaby kilkadziesiąt mA przez kilkadziesiąt ps, max kilka ns. I jakie to groźne dla uC "przepięcia" generuje rozładowywany kondensator? Co dzieje się z napięciem i prądem i w jaki sposób wpływa to na uC?
dondu Październik 12, 2011 Udostępnij Październik 12, 2011 Jak wielka energia jest zgromadzona w kondensatorze o pojemności kilku nF naładowanym do 3,3 albo 5V? Nie pamiętam już wzorów i szczerze nie chce mi się ich szukać a tym bardziej liczyć tego, ale sądzę, że wartość prądu przekraczałaby kilkadziesiąt mA przez kilkadziesiąt ps, max kilka ns.I jakie to groźne dla uC "przepięcia" generuje rozładowywany kondensator? Co dzieje się z napięciem i prądem i w jaki sposób wpływa to na uC? Na tyle groźne, że w marcu bieżącego roku ATMEL, postanowił zmienić swoją notę AVR042 z września 2005: http://prottoss.com/projects/ucGoZilla/ucGoZilla.files/AVR042_revC.pdf na nową: http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf a w niej poruszyć ten temat: Radzę doceniać zjawiska fizyczne, które są znane od wielu lat, a jednak nie doceniane, by później nie zachodzić w głowę czemu szlag trafił mój projekt, albo czemu on ciągle się resetuje.
nanab Październik 12, 2011 Udostępnij Październik 12, 2011 Trochę tego nie rozumiem. Żeby zapobiec przepięciom na bliskiej zeru indukcyjności switch-a(które i tak pewnie zostałyby zgaszone przez kondensator) zalecają dodać w szereg kolejną indukcyjność?
dondu Październik 12, 2011 Udostępnij Październik 12, 2011 Dodając rezystor szeregowo do switcha zmniejszasz radykalnie prąd (a właściwie jego zmianę czyli di), przez co czas rozładowania kondensatora (dt) się wydłuża, co w konsekwencji prowadzi do radykalnego zmniejszenia się członu równania di/dt. L - indukcyjność ścieżek i switcha jest stała. W konsekwencji wielkość wygenerowanej szpilki jest KOLOSALNIE mniejsza. Należy także pamiętać, że switch generuje, kilka drgań następujących jedno po drugim.
nanab Październik 13, 2011 Udostępnij Październik 13, 2011 L - indukcyjność ścieżek i switcha jest stała. Ale dokłada się do niej kolejną indukcyjność-rezystor. A ta może być 10 czy 100x większa niż indukcyjność ścieżek i switcha. No i czy te przepięcia nie zostały bo wytłumione przez kondensator?
dondu Październik 13, 2011 Udostępnij Październik 13, 2011 Ale dokłada się do niej kolejną indukcyjność-rezystor. A ta może być 10 czy 100x większa niż indukcyjność ścieżek i switcha. Moim zdaniem liczby, które podajesz są bardzo zawyżone. Zawsze możesz sprawdzić oscyloskopem i zwiększyć rezystor, by zmniejszyć prąd. Innymi słowy, dla wzoru mniej istotna jest indukcyjność, a KOLOSALNIE istotne są di i dt. No i czy te przepięcia nie zostały bo wytłumione przez kondensator? Odwrotnie, To kondensator jest sprawcą tych przepięć
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »