logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

lupin22 03 Lip 2017 23:47 1365 25
  • #1 16567217
    lupin22
    Poziom 10  
    Witam,

    mam problem, który umyka mojemu zrozumieniu. Chodzi o mikrokontroler XMEGA32A4U-AU

    W moim programie używam opcji uśpienia oraz wybudzenia pinem 1 portu A.

    Moja funkcja usypiająca wygląda następująco:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czego brakuje? Pull-upa oczywiście, bo wybranie LEVEL (druga opcją jest BOTHEDGES) aktywowane jest ciągłym stanem niskim na pinie. Pull-up był, ale przestałem mu ufać, gdy w pierwszej wersji płytki wydawał się nie mieć efektu. Wstawiłem więc na płytce rezystor 10k (więc dość silny pull-up) między VCC a wyjście z pinu. Zresztą w trakcie resetu (a taki wykonywany jest po wybudzeniu) pin by właśnie pływał, więc chciałem tego uniknąć.

    Niestety po takim uśpieniu wystarczy włączyć metr dalej lutownicę do gniazdka, lub upuścić poduszkę na panele (zgaduję, że generuje się wtedy jakieś drobne zakłócenie wywołane elektrostatycznością) i mikrokontroler się wybudza...

    Jak to możliwe, jeżeli mam fizycznie wstawiony pull-up (mierzyłem na pinie napięcie, jest 3.3V), wstawiałem również w programie dodatkowo, ale nic to nie zmieniło, a port zachowuje się, jakby "pływał". Układ zasilany bateryjnie, raczej nie szaleją po nim żadne zakłócenia, pobiera jakieś 2mA po wyłączeniu.

    Nie daje mi to spokoju, chociaż rozwiązałem to w programie, wprowadzając w zasadzie debouncing:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po wybudzeniu odczekuję milisekundę i sprawdzam ponownie stan przycisku, jeżeli nie jest naciśnięty to mikrokontroler idzie z powrotem spać. W zasadzie to działa, ale wolałbym wiedzieć skąd się bierze to dziwne zachowanie, bo może mi się potem w najmniej oczekiwanym momencie zemścić.

    Z góry dziękuję za odpowiedzi :)
  • Pomocny post
    #2 16567351
    czareqpl
    Poziom 33  
    Dodaj na pin kondensator 10nF lub nawet 100nF tak jak jest w układzie resetu.
  • Pomocny post
    #4 16567464
    tmf
    VIP Zasłużony dla elektroda
    Przy takich objawach to podejrzewałbym raczej źle rozprowadzone zasilanie mikrokontrolera - brak odpowiedniej liczby, lub źle rozmieszczone kondensatory odsprzęgające. Pokaż schemat i rysunek PCB.
  • #5 16567753
    lupin22
    Poziom 10  
    czareqpl napisał:
    Dodaj na pin kondensator 10nF lub nawet 100nF tak jak jest w układzie resetu.


    W układzie resetu nie ma, jest tylko podciągnięcie 10k do VCC, bo programuję poprzez PDI. Ale spróbuję rzeczywiście dodać w następnej wersji PCB.

    JarekC napisał:
    A jesteś pewien że to wybudzenie od pinu a nie reset całości (szczególnie od tego wł/wył lutownicy)?

    Tak, bo sprawdzam sobie to debuggerem. Tak, jak jest teraz z tym pseudo debouncingiem mikrokontroler jest po prostu wybudzany, bo zatrzymuje mi się na breakpoincie ustawionym w linii

    if ((PORTA.IN & PIN1_bm)) set_to_sleep();

    Chyba, że samo podłączenie programatora (atmel ice) coś zmienia. Ale gdyby tak było, to moje rozwiązanie programowe by nie działało, a póki co nie udało mi się mikrokontrolera wybudzić przypadkiem (a próbowałem :D )

    tmf napisał:
    Przy takich objawach to podejrzewałbym raczej źle rozprowadzone zasilanie mikrokontrolera - brak odpowiedniej liczby, lub źle rozmieszczone kondensatory odsprzęgające. Pokaż schemat i rysunek PCB.


    Oj tutaj starałem się nie oszczędzać, ale może rzeczywiście są źle rozmieszczone. Już pokazuję.

    Kondensatory mikrokontrolera (największy to tantalowy):
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?
    Kondensatory na źródle napięcia 3.3V:
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

    Płytka jest dość upakowana, nie wiem, czy dobrze będzie widać (pomaranczowe kropki to kondensatory mikrokontrolera, zielone to te na źródle napięcia, a fioletowe to odsprzęglenie pamięci flash (1nF, 100nF i 1 uF):
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?
  • Pomocny post
    #6 16567783
    czareqpl
    Poziom 33  
    lupin22 napisał:
    W układzie resetu nie ma, jest tylko podciągnięcie 10k do VCC, bo programuję poprzez PDI. Ale spróbuję rzeczywiście dodać w następnej wersji PCB.


    Chodziło mi o to aby struktura była taka jak jest stosowana w układach resetu, czyli rezystor do zasilania, kondensator do masy obwodu. W ten sposób zmniejszasz podatność pinu na przypadkowe zmiany stanu (obniżasz impedancję wejściową).
  • #8 16567845
    Freddie Chopin
    Specjalista - Mikrokontrolery
    lupin22 napisał:
    Płytka jest dość upakowana, nie wiem, czy dobrze będzie widać (pomaranczowe kropki to kondensatory mikrokontrolera, zielone to te na źródle napięcia, a fioletowe to odsprzęglenie pamięci flash (1nF, 100nF i 1 uF):

    Te kondensatory mają być zaraz przy pinie zasilania - po jednym na pin, a nie wszystkie razem równolegle "gdzieśtam".
  • #9 16567846
    lupin22
    Poziom 10  
    czareqpl napisał:
    Chodziło mi o to aby struktura była taka jak jest stosowana w układach resetu, czyli rezystor do zasilania, kondensator do masy obwodu. W ten sposób zmniejszasz podatność pinu na przypadkowe zmiany stanu (obniżasz impedancję wejściową).


    Rozumiem, oczywiście dodam ten kondensator.

    JarekC napisał:
    W kodzie nie widzę głównej pętli programu.

    To że program zatrzymał się na pułapce wg. mnie nie znaczy że nie nastąpił Reset.
    Jeżeli zakłócenie będzie trwać powyżej 1ms to układ się Zresetuje -> Uśpi -> Wybudzi.


    Bo to dość spory program, ciężko byłoby pokazać. Ale ogólnie rzecz biorąc w głównej pętli programu sprawdzany jest warunek (stan pinu podłączonego do przycisku) i jeżeli został on spełniony, to mikrokontroler jest usypiany funkcją z pierwszego posta.

    Tak naprawdę, to mam wrażenie, że to opóźnienie wykonuje się tylko raz - bo jest pierwszą rzeczą po przebudzeniu po poprawnym uśpieniu wcześniej. Jeżeli się wybudzi i jest usypiany ponownie, to nie jestem do końca pewny, w którym miejscu programu jest po wybudzeniu, ale wydaje mi się, że pomiędzy delay a ifem. Jeszcze spróbuję to sprawdzić.

    Natomiast z tym, że nie wiadomo, czy się nie resetuje, to nie za bardzo rozumiem - jeżeli program by się zresetował, to bym po prostu zauważył, bo by mi zagrał na powitanie :D A tak się nie dzieje.

    Freddie Chopin napisał:
    Te kondensatory mają być zaraz przy pinie zasilania - po jednym na pin, a nie wszystkie razem równolegle "gdzieśtam".


    Płytka ma 28mm szerokości, kończy się dosłownie kilka mm za prawą i lewą krawędzią zdjęcia, muszę też tamtędy puścić sygnały. Nie mogę tych pinów po prawej i na dole mikrokontrolera od strony zewnętrznej odsprzęglić, dlatego dałem to odsprzęglenie pod spód. Wydawało mi się, że jest to częsta praktyka? Natomiast przy głównym zasilaniu (od strony lewej) wciąż mówimy o odległościach milimetrowych, czy to jest tak bardzo istotne? Jeżeli tak, to spróbuję z tej strony trochę bliżej dać to odsprzęglenie. Umknął mi też jeden kondensator do pokolorowania, ten na prawo od tantalowego.

    Więc na linii zasilania mikrokontrolera (od regulatora do mikrokontrolera) o całkowitej długości 20-25mm mam tantalowy 22uF, ceramiczny 10uF i 2x 100nF, to za mało? Pozostałe 2 piny VCC mają pod spodem jeszcze 2x100nF.

    Dodam tylko, że mikrokontroler niczego nie zasila, wychodzą z niego tylko sygnały sterujące, jeżeli to ma jakieś znaczenie.

    EDIT:
    Poprawiony kod "debouncingu", poprzedni nie działał poprawnie, bo po wybudzeniu drugi raz wracał do głównej pętli (a nie przed ifa, jak myslałem). Zamiast tamtego bloku po spełnieniu warunku uśpienia (naciśnięcie przycisku) wykonywana jest funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 16567903
    MODI
    Poziom 17  
    Pokaż więcej płytki. Tam gdzie przerwanie jest poprowadzone. Zasilania bym się nie czepiał. Ewentualnie sobacz czy napięcie odpowiednie.
  • #11 16567904
    lupin22
    Poziom 10  
    Przerwanie:
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

    Przez przelotkę jest poprowadzony pullup podpięty do VCC (a konkretniej tego oznaczonego na wcześniejszym obrazku jako VCC do PDI).
  • #12 16567941
    MODI
    Poziom 17  
    czy przy zwartym pinie na stałe do VCC także potrafisz wywołać te przerwanie?
    EDIT:
    Jakie długie przewody podłączone są do płytki? Może załącz zdjęcie aplikacji.
  • #13 16568039
    lupin22
    Poziom 10  
    MODI napisał:
    czy przy zwartym pinie na stałe do VCC także potrafisz wywołać te przerwanie?
    EDIT:
    Jakie długie przewody podłączone są do płytki? Może załącz zdjęcie aplikacji.


    Tak, jestem. W zasadzie to praktycznie nie zrobiło różnicy. I to mnie najbardziej zdumiewa.

    Przewody mają około 10cm. W chwili obecnej wszystko sobie leży po prostu na biurku.

    Może ja robię coś źle programowo? Nie wyłączam timerów, które sobie leciały, ale w trybie powerdown wszystkie zegary są i tak wyłączone:
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

    Pin, z którego korzystam, ma ograniczone możliwości asynchroniczne przerwania (tylko LEVEL i BOTHEDGES, bez FALLING i RISING), ale czy to może mieć znaczenie?
  • #14 16568180
    tmf
    VIP Zasłużony dla elektroda
    Jeżeli przy zwartym do Vcc wejściu ciągle możesz wywołać przerwanie wybudzające MCU to znaczy, że coś jest mocno nie tak i problem leży w zupełnie innym miejscu. Nie masz jakiegoś zimnego lutu? Gdzieś masz poważny błąd elektryczny.
  • #15 16568205
    lupin22
    Poziom 10  
    Taki problem pojawiał się już na kilku kolejnych płytkach w różnych wersjach, nie lutowałem ich osobiście, wyglądają w porządku. Co więcej, o ile pamiętam na module X3-DIL64 Leon Instruments z xmegą128 miałem identyczny problem, ale ręki sobie nie dam uciąć, nie jestem też w stanie tego w tym momencie sprawdzić, ale jak tylko będę mógł, to spróbuję.

    Jaki błąd elektryczny mógłby być przyczyną takiego zachowania? Zakładając, że luty są w porządku.

    Cała reszta układu działa w porządku - korzystam z SPI, USB, DAC, DMA i systemu eventów i TWI (z którym również mam pewien problem, czasami program wiesza mi się na takiej funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Rejestr STATUS pokazuje wtedy BUSSTATE BUSY i jeszcze nie doszedłem, z czego to wynika i co w ogóle może być powodem).

    I żadnych innych nienaturalnych zachowań oprócz tego wybudzania przerwaniem i rzadkiego zawieszenia twi nie zauważyłem.
  • Pomocny post
    #16 16568482
    tmf
    VIP Zasłużony dla elektroda
    Jeśli pin na stałe zwarty do Vcc powoduje wybudzanie procesora ustawione na poziom niski to powiem, że to niemożliwe. Tak jak koledzy napisali - jesteś pewien, że procesor się nie resetuje, ew. inna część programu nie działa nieprawidłowo? Sprowadź to do najprostszego kodu i wtedy sprawdź czy problem się powtarza. Z własnych doświadczeń wiem, że nawet przełączanie 2-3 kW w pobliżu procka nie jest problemem, nawet jeśli przewody sygnałowe owijałem wokół obciążenia.
  • #17 16568862
    lupin22
    Poziom 10  
    Wygrzebałem mój moduł X3 od leon instruments. Do pinu A1, którego przerwanie będę sprawdzał, podpiąłem przewód, z drugiej strony sobie" wisi". Nie jest podpięty do niczego.
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

    Zrobiłem prosty program:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W przerwanie wrzuciłem cokolwiek i ustawiłem sobie tam breakpointa, żeby wiedzieć kiedy jest wywołane. No i...

    Jeżeli przewodu nie ma (jest sam moduł bez kabelka wpiętego), nie udało mi się włączając lutownicę wywołać przerwania, a trzymałem ją już bardzo blisko.

    Jeśli przewód jest, to wystarczy jakieś 0.5m dalej trzymać tą lutownicę i po kilku włączeniach przerwanie się odpala.

    Jeszcze rejestry z debuggera dla portu A:
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?
    Wszystko jest ustawione tak, jak powinno być.
    Sprawdziłem również inne porty, inne piny - zawsze tak samo.

    Jak to możliwe, co ja robię źle? Tym razem program prościutki, nic w nim nie ma, a jestem w stanie bez problemu zreplikować błąd.

    -----------------------------------------------
    Zaintrygowała mnie inna sprawa. Może to nie wina przerwania i coś jest na rzeczy z tym resetem, tylko co?

    Mianowicie, jak wywołuję przerwanie (lutownicą, czy po prostu przyciskiem zwierając pin do masy) to zwróciłem uwagę, że na komputerze (moduł X3 zasilam poprzez usb) dostaję komunikaty o podłączeniu i odłączeniu urządzenia, co by sugerowało, że coś jeszcze się dzieje. Zilustruję to filmem (kod taki, jak u góry):








    Jeśli nie widać (albo nie słychać), co się dzieje, to już mówię.
    Na filmie 1 używam przycisku, żeby wywołać przerwanie. Po pierwszym naciśnięciu lampka gaśnie i się zaświeca, tak samo z połączeniem usb (rozłącza się i łączy ponownie). Potem lampka wyłącza się po naciśnięciu, usb się rozłącza i nie łączy ponownie. Za każdym razem, gdy lampka ze stanu zgaszonego przechodzi w zapalony, to trochę mruga.

    Na filmie 2 robię to samo, tylko bez dotykania :P Klikający dźwięk to moje przełączanie przedłużacza, na którym podpięta jest lutownica.

    Kod, którego użyłem, znajduje się na górze posta.

    Czy ktoś widzi może, w czym może być problem? A może komuś leży gdzieś jakaś xmega albo zestawik i mógłby to sprawdzić u siebie (chociaż u mnie efekt ten sam jest na płytce docelowej (i jej poprzednich wersjach) oraz na moim module X-3, więc szansa, że wszystko jest skopane w ten sam sposób jest chyba dość mała?).
  • #18 16568964
    tmf
    VIP Zasłużony dla elektroda
    Dźwięk odłączanego i przyłączanego urządzenia USB w Windows sugeruje, że następuje reset procesora i reset magistrali USB - np. na skutek przeciążenia zasilania. Czyli przycisk z jakiegoś powodu wywołuje zwarcie zasilania lub procesor nie jest zasilany - dostaje np. zasilanie pasożytniczo. Czy zworki na module wyboru napięcia USB/zewnętrzne są ustawione prawidłowo?
    Druga sprawa - pokazany kod zmienia konfigurację PIN2, a zrzut z debuggera pokazuje, że zmiana dotyczy konfiguracji pin1 - czyli procesor nie realizuje pokazanego przez ciebie kodu, a w każdym razie pokazany kod to nie kod testowy.
  • #19 16569060
    lupin22
    Poziom 10  
    Tak, z tym debuggerem i kodem namieszałem, bo zmieniałem parę razy, testowałem itd i umknął mi ten screen. Niemniej jednak ostateczny kod to ten na początku poprzedniego posta, a zrzut debuggera daje prawidłowy wynik dla nowego kodu również (sprawdziłem bit po bicie z datasheetem).

    Zworka jest poprawnie nałożona.

    Już nie wiem, co się dzieje...

    Wróć! Zagadka USB rozwiązana. Pechowo wybrałem pin D6, do neigo podłączone jest usb, stąd był problem. No to zmieniłem kod na prostszy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zrzut z debuggera, tym razem zgadzający się z kodem:
    XMEGA32A4U-AU - Przerwanie wybudzające zbyt czułe, jak poprawić stabilność?

    Na filmie przełączanie konwencjonalne oraz wireless :P




    Tym razem nic nie mruga, wszystko działa pięknie, kod jest maksymalnie prosty i wciąż ten sam problem. Jeżeli ten sam kod puszczę bez przewodu łączącego moduł z przyciskiem, to nie jestem w stanie przełączyć lutownicą, czyli wygląda to tak, jakby robił on za antenę.

    Już nie wiem, co o tym myśleć. W końcu nie działa mi tutaj podstawowa funkcjonalność mikrokontrolera...
  • #20 16569439
    MODI
    Poziom 17  
    Jakiś pullup jest na tej lini?
  • Pomocny post
    #21 16569503
    tmf
    VIP Zasłużony dla elektroda
    Dla wewnętrznego pullupa to może i tak będzie - on ma o ile się nie mylę 25 kOm, czyli naprawdę sporo. Daj zewnętrzny rzędu 2-4 k i sprawdź ponownie. Warto też pomyśleć o sprawdzeniu na innym zasilaniu niż z kompa. Z moich doświadczeń wynika, że przez USB przenosi się makabryczna ilość paskudztwa z komputera, chociaż aż takich cudów nigdy nie spotkałem. Może masz też kiepską instalację elektryczną i przez nią się przenoszą zakłócenia. Zasil Moduł np. z baterii i sprawdź czy nadal jest problem.
  • #22 16569554
    lupin22
    Poziom 10  
    tmf napisał:
    Dla wewnętrznego pullupa to może i tak będzie - on ma o ile się nie mylę 25 kOm, czyli naprawdę sporo. Daj zewnętrzny rzędu 2-4 k i sprawdź ponownie. Warto też pomyśleć o sprawdzeniu na innym zasilaniu niż z kompa. Z moich doświadczeń wynika, że przez USB przenosi się makabryczna ilość paskudztwa z komputera, chociaż aż takich cudów nigdy nie spotkałem. Może masz też kiepską instalację elektryczną i przez nią się przenoszą zakłócenia. Zasil Moduł np. z baterii i sprawdź czy nadal jest problem.



    Rzeczywiście, program ze zwykłym przełączaniem czytając stan pinu w pętli po podłączeniu zasilania bateryjnego spisuje się znacznie lepiej, chociaż wciąż da się go przełączyć lutownicą, jedynie trzeba ją przyłożyć kilka cm od przewodu, nawet na wewnętrznym pullupie. Zewnętrzny pullup 2,2k poprawił sytuację, ale dalej jest możliwość przełączenia pinu, chociaż w tym przypadku muszę tę lutownicę trzymać w taki sposób (równolegle do przewodu na całej jego dlugości), że już chyba normalne jest, że jakiś pik się wyindukuje przy załączaniu lutownicy.

    W tych samych warunkach ale z programem z przerwaniem jest w zasadzie podobnie, chociaż mam wrażenie, że troszkę gorzej. Czy to możliwe, że przerwanie jest bardziej czułe, niż zwykłe sprawdzanie pinu w pętli (może po prostu w pętli nie zawsze trafiam na zakłócenie?)

    Ogólnie rzecz biorąc - nie jest idealnie, jak bym się spodziewał, ale odłączenie zasilania przez usb z komputera (z tego samego gniazdka, co lutownica) daje widoczne efekty poprawy. Więc może to przynajmniej nie jest błąd programistyczny z mojej strony, ani elektryczny.
  • #24 16569595
    lupin22
    Poziom 10  
    Kondensator 100nF nawet bez zewnętrznego pullupa (ale z wewnętrznym) i z zasilaniem USB w zasadzie załatwił sprawę. Jeszcze potem przetestuję to dokładnie, ale jestem już dobrej myśli.
  • Pomocny post
    #25 16569653
    czareqpl
    Poziom 33  
    lupin22 napisał:
    Kondensator 100nF nawet bez zewnętrznego pullupa (ale z wewnętrznym) i z zasilaniem USB w zasadzie załatwił sprawę. Jeszcze potem przetestuję to dokładnie, ale jestem już dobrej myśli.


    czareqpl napisał:
    Dodaj na pin kondensator 10nF lub nawet 100nF tak jak jest w układzie resetu.

    czareqpl napisał:
    Chodziło mi o to aby struktura była taka jak jest stosowana w układach resetu, czyli rezystor do zasilania, kondensator do masy obwodu. W ten sposób zmniejszasz podatność pinu na przypadkowe zmiany stanu (obniżasz impedancję wejściową).


    Superancko ;)
  • #26 16570681
    lupin22
    Poziom 10  
    Nowe płytki już się produkują na dalekim wschodzie, dodałem kondensatory i mam nadzieję, że to wystarczy. Tzn. jeżeli problem nie wynika z szalejących w układzie zakłóceń albo błędów programistycznych, to i tak pół biedy, bo jest opanowany, ale kto wie, co innego mogłoby się zepsuć z jego powodu.

    Serdecznie dziękuję za wszystkie odpowiedzi :)
REKLAMA