Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMega168/C] Dlaczego tego typu eliminacja drgań styków jest błędna

ADI-mistrzu 13 Lip 2011 11:01 5655 34
  • #1 13 Lip 2011 11:01
    ADI-mistrzu
    Poziom 30  

    Witam!

    Mam problem który już powoduje że siwieję...
    [ATMega168/C] Dlaczego tego typu eliminacja drgań styków jest błędna
    Tak wygląda mój sposób eliminacji drgań styków. Idea działania przycisków jest dość prosta, każdy przycisk wywołuje przerwanie na INT0 w którym jest sprawdzany czy na którymś z pinów także nie pojawił się stan niski, jeśli tak to ten przycisk został naciśnięty, jeśli nie to przycisk podpięty tylko pod INT0.

    Nawet ładnie to działa, ale z nieznanych mi powodów, co któreś naciśnięcie przycisku podpiętego tylko pod INT0 powoduje restart procesora :|
    Sprawdziłem wszystkie ścieżki i są OK (płytka z płytkowni pochodzi).
    Po podpięciu pinu do oscyloskopu (przy przycisku) myślałem że zobaczę przyczynę ale wtedy już się nie resetował.
    Pomyślałem że może niewielkie obciążenie oscyloskopu pomogło więc równolegle z kondensatorem dałem opornik 100k i pomogło, ale wróciły drgania styków
    :cry:

    Co w tym może być źle? Dlatego to chodzi tak dziwnie, szczególnie jakim cudem restartuje się procesor?

    0 29
  • #2 13 Lip 2011 11:17
    mgyz
    Poziom 13  

    A masz włączone podciąganie linii PC1,PC2,PD2 do Vcc?

    0
  • #3 13 Lip 2011 11:22
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Zwieranie naładowanego kondensatora niekoniecznie jest dobrym pomysłem. Nie lepiej byłoby dać (mniejszy) rezystor po stronie przycisku? Kondensator ładowałby się przez podciągający w mikrokontrolerze.

    No i jak na schemacie masz GND to dawaj je jednak w "normalną" stronę, bo szczerze mówiąc jak zobaczyłem etykietę od góry to nawet nie czytałem co tam pisze, bo uznałem, że to VCC.

    4\/3!!

    0
  • #4 13 Lip 2011 11:37
    ADI-mistrzu
    Poziom 30  

    Tak, wszystko jest podciągnięte, po za tym raczej nie powodowało by to restartów kontrolera.
    Tzn kondensator zamiast dać przy przycisku to przy mikrokontrolerze?

    0
  • #5 13 Lip 2011 11:41
    ekrzychoooo
    Poziom 13  

    1 Tak ja powiedział Freddie zwieranie kondensatorów nie jest dobre (po jakimś czasie swich do wymiany).
    2 Eliminuj drgania programowo.
    3 Opornik równolegle do kondensatora raczej nie (pull-up wewnętrzny może mieć 50k).
    4 Sprawdź debugerem czy nie jest tak że zawsze się resetuje. Na pewno były błędy w kompilatorach/linkerach dla mega88 i mega168. W mega168 wektor int0 leży w 0x..2 a w mega88 w0x..1. W DS jest malutkimi literkami napisana uwaga że mega88 nie obsługuje rozkazu JMP. Napisz jakich narzędzi używasz? No i przykładowy Twój kod.

    0
  • Pomocny post
    #6 13 Lip 2011 11:44
    kult
    Poziom 16  

    wstaw rezystor między kondensatorem c22 a vcc (10k).

    0
  • #7 13 Lip 2011 12:17
    ADI-mistrzu
    Poziom 30  

    Używam AVRStudio i kompilatora GCC.
    Zrobiłem tak jak napisał kult i niby się uspokoiło (przeniosłem jedynie rezystor, dałem go w szereg z kondensatorem).
    [ATMega168/C] Dlaczego tego typu eliminacja drgań styków jest błędna
    Programowo nie chce za bardzo bo raz że trzeba wykorzystać opóźnienia a staram się ich dawać jak najmniej a dwa można tego się pozbyć sprzętowo i zaoszczędzić nieco pamięci (wiem że mało ale zawsze).

    0
  • #8 13 Lip 2011 12:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    Rozumie, że to część tego projektu:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=9706732#9706732
    więc nie muszę pytać o filtrowanie zasilania?

    ADI-mistrzu napisał:
    Programowo nie chce za bardzo bo raz że trzeba wykorzystać opóźnienia a staram się ich dawać jak najmniej a dwa można tego się pozbyć sprzętowo i zaoszczędzić nieco pamięci (wiem że mało ale zawsze).

    Opóźnienia? Nie trzeba można robić jako dodatkowa funkcja do timera który wykorzystujesz do innych celów.

    A pamięci stracisz może ze 100-200 bajtów.

    0
  • #9 13 Lip 2011 12:20
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ADI-mistrzu napisał:
    Programowo nie chce za bardzo bo raz że trzeba wykorzystać opóźnienia

    Wcale nie trzeba (; Można próbkować stan przycisków przy użyciu timera (sprzętowego lub programowego).

    4\/3!!

    0
  • #10 13 Lip 2011 12:24
    kult
    Poziom 16  

    ADI-mistrzu -> nie chodziło mi o takie rozwiązanie, chodziło mi o podciągnięcie kondensatora c22 (a tym samym switcha) do plusa przez rezystor ok 10k bo wydaje mi się, ze wejście INT0 nie jest w żaden sposób spolaryzowane, dlatego występują na nim dziwne stany nieustalone i stąd takie zachowanie procesora.

    0
  • #11 13 Lip 2011 12:29
    mirekk36
    Poziom 42  

    Freddie Chopin napisał:
    ADI-mistrzu napisał:
    Programowo nie chce za bardzo bo raz że trzeba wykorzystać opóźnienia

    Wcale nie trzeba (; Można próbkować stan przycisków przy użyciu timera (sprzętowego lub programowego).


    Dokładnie, i nie dość, że nie trzeba wykorzystywać nawet najmniejszego opóźnienia, to jeszcze nie trzeba tracić wejścia przerwania INTx, które może się przydać do ważniejszych rzeczy. A kwestia sprzętowego wspomagania eliminacji drgań styków to tak jak już ktoś wcześniej napisał. SAM KONDENSATOR podłączony do pinu a podciąganie do VCC zapewnione przez wewn. podciąganie albo i przez zewnętrzne jak ktoś się uprze. Zamiast tych dziwacznych połączeń rezystora w szereg z kondensatorem albo tak jak to było widać na pierwszym schemacie.

    Dodano po 1 [minuty]:

    A poza tym nikt chyba ci nie podpowie dlaczego ci program się restartuje jak nie pokażesz kodu obsługi tego przerwania bo zapewne jeszcze tam coś jest hmm "nieteges"

    0
  • #12 13 Lip 2011 12:36
    Freddie Chopin
    Specjalista - Mikrokontrolery

    mirekk36 napisał:
    A kwestia sprzętowego wspomagania eliminacji drgań styków to tak jak już ktoś wcześniej napisał. SAM KONDENSATOR podłączony do pinu a podciąganie do VCC zapewnione przez wewn. podciąganie albo i przez zewnętrzne jak ktoś się uprze. Zamiast tych dziwacznych połączeń rezystora w szereg z kondensatorem albo tak jak to było widać na pierwszym schemacie.

    Rezystor zapobiega dużym impulsom prądowym podczas rozładowywania kondensatora przyciskiem, które w teorii mogą przyspieszyć zniszczenie takiego przycisku. Nie ma w takim rezystorze (byle niewielkim - ~100R) nic złego.

    4\/3!!

    0
  • #13 13 Lip 2011 12:56
    tomhandyman
    Poziom 13  

    Używasz zbyt dużych rezystorów, szczególnie jesli używasz wewnętrzne podciąganie.
    Podłącz jeden styk i przetestuj nastepująco : zasilanie - rezystor - rezystor - kondensator - masa. Pomiędzy rezystorami masz wyjście do procesora i mikrostyku, a drugi koniec mikrostyku do masy. Wartość obu rezystorów ta sama 300ohm -1kOhm i 100nF kondensator. Dla przełącznika obrotowego (szybkie impulsy) lepsza jest mniejsza rezystancja tzn. 300-400 Ohm.
    Wewnętrzne podciaganie możesz wyłączyć. Działa na 100%.

    0
  • #14 13 Lip 2011 13:02
    gaskoin
    Poziom 38  

    Jak Mirek napisał warto też żebyś pokazał program, bo istnieje też możliwość, że w obsłudze przerwania robisz jakieś cuda i najzwyczajniej w życiu np przepełnia się stos albo robi się coś gorszego :)

    0
  • #15 13 Lip 2011 13:15
    ADI-mistrzu
    Poziom 30  

    dondu tak, to dalsza część tamtego.

    Program niema nic do tego, jeśli pozostawię w programie jedynie piknięcie buzzera (z generatorem) przed pętlą while(1); to też się restartuje, mimo że wyłączone są przerwania. Dlatego stwierdziłem że to problem techniczny a nie software.

    Chyba problem był w nagłym rozładowaniu tego kondensatora, może jakieś śmieci rozsyłał i dlatego coś takiego się robiło.
    Teraz wszystko ładnie działa, zmieniłem tylko rezystor w szeregu z kondensatorem na 1kΩ ale nie dałem podciągającego, bez niego w sumie dobrze sobie radzi.

    0
  • #16 13 Lip 2011 13:37
    tomhandyman
    Poziom 13  

    Działa dobrze bez podciągania , ponieważ prawdopodobnie wykrywasz w programie tylko stan niski. Natomiast przy szybkim ponownym naciśnięciu, kondensator nie zdąży sie naładować i może nie wykryć naciśnięcia. Zalecałbym zewnętrzne podciąganie 1kΩ.

    0
  • #17 13 Lip 2011 15:59
    ADI-mistrzu
    Poziom 30  

    tomhandyman napisał:
    ...przy szybkim ponownym naciśnięciu, kondensator nie zdąży sie naładować i może nie wykryć naciśnięcia. Zalecałbym zewnętrzne podciąganie 1kΩ.


    No nie powiedział bym, jeśli założymy że w kontrolerze jest wbudowany rezystor 50kΩ i 1kΩ szeregowo z kondensatorem, to obliczając czas ładowania kondensatora wyjdzie nam jakieś 40ms, raczej nie dam rady w tym czasie 2 razy nacisnąć przycisku :wink:
    A jeśli wy nastąpiło wciśnięcie to raczej było by to drganie styków, które właśnie chce się pozbyć, więc można powiedzieć że powolne ładowanie kondensatora jest wręcz zalecane.

    Chyba że coś mylę, to proszę o poprawienie.

    0
  • #18 13 Lip 2011 21:02
    Fredy
    Poziom 27  

    Te szeregowo połączone rezystory z kondensatorami to są pozbawione większego sensu.
    Daj tak jak ci już podpowiadało kilku kolegów podciągnięcie wszystkich użytych pinów do zasilania. Możesz dać małe kondensatorki na wejściach, ale one nie są konieczne.
    Jednakże twoje resetowanie się procesora to jest zupełnie inna bajka.
    Ten układ napewno nie przyczynia się do resetu.

    Czy masz kondensator na resecie? Czy masz rezystor pomiędzy resetem a VCC?

    0
  • #19 13 Lip 2011 21:23
    ADI-mistrzu
    Poziom 30  

    Dany jest sam rezystor 10k na reset do zasilania.
    A dlaczego kondensatory nie są konieczne? To niby jak będzie niwelowane drganie styków? Nie mówię tutaj o programowym, chciał bym postarać się go nie używać.

    Wiem że może to i dobre rozwiązanie, dla jeśli można to rozwiązać sprzętowo to czemu nie, nie wszystko musimy pchać w program.

    0
  • #20 13 Lip 2011 21:24
    drzasiek
    Specjalista - Mikrokontrolery

    Mi tu coś śmierdzi.. Ja dawałem na początku gołe kondensatory równolegle do klawiszy i wszystko to bezpośrednio do uC i GND bez żadnych rezystorów i nigdy nic się nie resetowało. Ba, uC zasilałem bez kondensatorów blisko nóg zasilania, był tylko filterek w zasilaczu. I zawsze było ok, więc coś tu nie gra.
    Piny klawiszy na pewno ustawione jako wejścia?
    A może uC pracuje na jakimś skrajnym przetaktowaniu?

    0
  • #21 13 Lip 2011 21:43
    ADI-mistrzu
    Poziom 30  

    Też dziwne to jest dla mnie, z kondensatorem bezpośrednio do pinu potrafi restartować, a w tej konfiguracji jest spokój.
    Procesor na 20MHz, więc można powiedzieć ze skrajnie. Piny na 100% są wejściami i podciągnięte do zasilania.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Przyciski podłączone są pod PC1, PC2, PC3 oraz oraz PD2 (INT0).
    Dziwna była rzecz, że przez ułamek sekundy coś się działo z zasilaniem. Podłączyłem pin z 5V do oscyloskopu i naciskając przycisk patrzyłem czy wykres skoczył i w czasie restartu skakał. Co ciekawsze tylko gdy miał zapewnioną dobrą masę (płytka z przyciskami jest montowana na płytce z elektroniką za pomocą 2 dystansów, dystanse przylegają do masy), gdy był na cieniutkim kabelku sygnałowym problem ten prawie nie występował.
    [ATMega168/C] Dlaczego tego typu eliminacja drgań styków jest błędna [ATMega168/C] Dlaczego tego typu eliminacja drgań styków jest błędna

    0
  • #22 13 Lip 2011 21:53
    janbernat
    Poziom 38  

    Nie ma cudów- jak mawiał mój ksiądz od religii wystawiając oceny.
    Tak jak pisał Freddie Chopin- jak się kondensator rozładuje przez przycisk to w końcu się przycisk sklei przez zbyt duży prąd.
    To tylko kwestia czasu.
    No i prądu.
    A prąd przepływający zależy od oporności/indukcyjności ścieżek.

    0
  • #23 13 Lip 2011 22:10
    ADI-mistrzu
    Poziom 30  

    Dlatego dałem w szereg z kondensatorem opornik ograniczający ten prąd i działa teraz dobrze, coś musiało z tym być skoro przestało się tak dziać, może za duży ładunek szedł w masę i na chwilę różnica potencjałów była za mała (chodź czy ten ładunek taki duży był).

    0
  • #24 13 Lip 2011 22:21
    drzasiek
    Specjalista - Mikrokontrolery

    janbernat napisał:
    Nie ma cudów- jak mawiał mój ksiądz od religii wystawiając oceny.
    Tak jak pisał Freddie Chopin- jak się kondensator rozładuje przez przycisk to w końcu się przycisk sklei przez zbyt duży prąd.

    Oczywiście, ja temu nie przeczę. Jak powiedziałem tak podłączałem kiedyś, na początku (co prawda nie dawno), teraz eliminuję drgania za pomocą Timera, wygodne i pewne rozwiązanie.
    Ale tak jak mówiłem kiedyś tak podłączałem i nie było problemów dlatego dziwię się, że tutaj się resetuje.

    Edit:
    Wyjaśnienie: Mówiąc, że u mnie bez filtracji i na gołych klawiszach z kondensatorami to działało, nie miałem na celu udowadnianie, że bez filtracji i prawidłowego podłączenia można, ale chciałem wyolbrzymić zdziwienie czemu tutaj nie działa mimo, że filtracja jest. Dyskusja o konieczności stosowania kondensatorów przy każdej parze nóg zasilających już na tym forum była jakiś czas temu i ja zostałem przez fachowców do tego przekonany.
    (Dopisałem to sprostowanie na prośbę jednego z użytkowników, żeby nie wprowadzić błąd kogoś kto nie wie o tej konieczności a przeczyta ten temat)

    0
  • #25 13 Lip 2011 22:46
    janbernat
    Poziom 38  

    Bo to wszystko jest trudno obliczalne.
    Jest obliczalne- ale trudno i kłopotliwie.
    Wystarczy żeby przyciski i ścieżki do nich prowadzące były pod nieco innym kątem- i zakłócenia indukujące się w ścieżkach resetu powodują reset- albo nie.
    Fizyka jest obliczalna- ale zwykle trudno to obliczyć.
    Zwykle wystarcza przestrzeganie podstawowych zasad.

    0
  • #26 13 Lip 2011 22:54
    drzasiek
    Specjalista - Mikrokontrolery

    Ale ja tutaj widzę porządną płytkę, z masami i bez plączących się kabli (pomijając te od zasilania).. Zapowiada się fajny (Choć nieczytelny w słoneczne dni) komputer pokładowy.
    Ale jeśli to ma być podłączone do zasilania w samochodzie to ja bym proponował nie "omijać" problem resetowania się ale go znaleźć i wyeliminować.

    0
  • #27 13 Lip 2011 23:06
    ADI-mistrzu
    Poziom 30  

    No już się nie resetuje, odkąd zmieniłem ani razu to nie wystąpiło, mogło faktycznie coś się indukować przy nagłym zwarciu kondensatora do masy.

    A wyświetlacz nawet czytelny jest o dziwo, słońce które na niego pada jest odbijane od powierzchni która za nim jest i tak naprawdę nawet w mocno słoneczne dni widać dobrze.

    Ale dziękuję wam Panowie za pomoc, nie wpadł bym na to że faktycznie zwieranie kondensatora do masy przecież jest nie zdrowe :|

    0
  • #28 13 Lip 2011 23:17
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jeśli do resetu masz tylko rezystor podciągający, to wykosztuj się jednak na kolejny kondensator - od resetu do masy (standardowe 100n or course). Przy zakłóceniach te wszystkie fantastyczne układy wewnętrznej filtracji resetu można od razu zignorować - nic nie dają.

    4\/3!!

    0
  • #29 14 Lip 2011 10:05
    adiabel
    Poziom 17  

    rzeczywiście tak jak koledzy mówili zwieranie kondensatora do masy - nawet
    przy 100n - może wygenerować impuls prądowy tak duzy , że spowoduje
    indukcje napięcia w sasiednich ścieżkach ; nawet do wartości odczytywalnych przez TTL.

    0
  • #30 14 Lip 2011 23:14
    LordBlick
    VIP Zasłużony dla elektroda

    Freddie Chopin napisał:
    Jeśli do resetu masz tylko rezystor podciągający, to wykosztuj się jednak na kolejny kondensator - od resetu do masy (standardowe 100n or course).
    I nie zapomnij o jego odłączaniu przy programowaniu, inaczej możesz ubić programator... ;)

    0
  Szukaj w 5mln produktów