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

Dip-switch podłączony do pinów wejściowych - tryb Power-down i przerwanie zewnętrzne PCINT0

robiw 27 Lut 2022 18:54 2196 81
  • #1 19907824
    robiw
    Poziom 26  
    Witajcie,
    Chciałem zweryfikować, czy dobrze myślę. Mam kilka pinów wejściowych podłączonych do dip-switcha, który może je zwierać do masy. Normalnie podciągnąłbym je do VCC rezystorami w strukturze procesora...jednak układ większość czasu ma być w trybie Power-down. Jeśli je podciągnę i wejście takie będzie zwarte do masy to w trybie Power-down będzie pobierany dodatkowy prąd, który według pomiarów wynosi ok. 85uA przy 3V. Wniosek z tego, żę w trybie power-down nie mogę włączać podciągania tylko ustawić je, jako wejścia bez podciągania nie martwiąc się pływaniem wejść, gdyż wewnętrzne struktury (tuż przed bramką Schmidta) są ściągane do masy sygnałem SLEEP. Nie mogę ich też ustawić, jako wyjścia ze stanem "0", bo one mogą być podłączone do masy poprzez dip-switch. Dobrze myślę?

    A co w takim razie z wejściem PCINT0 dla przykładu, które może wybudzać procesor? Jeśli aktywuję to przerwanie zewnętrzne to wejście muszę podciągać, jeśli mam na nim wybudzający switch, który może w spoczynku znajdować się w dowolnym stanie, w tym zwarty do masy... w takim razie nie da się ograniczyć poboru prądu dla tego wejścia w trybie power-down, tak? W takim razie lepiej zastosować jakiś rezystor zewnętrzny o dużej wartości, żeby ten prąd ograniczyć, niż te wewnętrzne? Robert
  • #2 19907962
    tmf
    VIP Zasłużony dla elektroda
    W trybie power down pull upy normalnie działają. Czyli jeśli je włączysz, a pin będzie zewnętrznie ściągany do masy, to przez nie będzie płynął prąd, zwiększając w ten sposób pobór prądu w tym trybie. Z kolei pozostawienie wejść jako pływających też zwiększy pobór prądu, bo powstaną stany przejściowe, w których oba tranzystory budujące wejście IO będa częściowo włączone.
    Jeśli wejście nie będzie ściągane do masy, to pull upy w niczym nie przeszkadzają. Czyli wejście int dajesz z pull upem, przycisk normalnie jest rozłączony, więc nie ma problemu. Jak go naciśniesz, to co prawda popłynie większy prąd, ale to przecież tylko chwilowa sytuacja, w dodatku wybudzasz procesor, więc to nie ma praktycznie znaczenia, że pociągniesz przez pull upa te dodatkowe uA.
  • #3 19908126
    robiw
    Poziom 26  
    Czyli jest w zasadzie tak, jak mówiłem.
    Nie mogę podciągnąć pinów wejściowych dip-switcha do VCC bo one mogą być zwierane na stałe do masy i wtedy w power-down "ciągnęłyby" prąd i to nie mały (85uA). Mogę je zostawić, jako floating i będą konsumowały w czasie normalnej pracy dodatkowy prąd (choć przecież wtedy mogę je podciągnąć) ale w trybie power-down bufory wejściowe są ściągane do masy sygnałem SLEEP, więc nie powinny generować większego obciążenia.

    Co do pinu PCINT0 to tutaj muszę go podciągnąć do VCC, żęby działało to przewidywalnie...ale nie rezystorem wewnątrz procesora. Pin PCINT0 może na stałę być połączony z masą lub VCC (w czasie uśpienia), więc w trybie power-down "ciągnąłby" dodatkowe 85uA (gdy byłby zwarty do masy). Muszę zastosować rezystor zewnętrzny i to duży, powiedzmy 1M (prąd 3uA). Ten pin ma wybudzać procek zmianą stanu... R
  • #4 19908227
    tmf
    VIP Zasłużony dla elektroda
    robiw napisał:
    ale nie rezystorem wewnątrz procesora.

    A dlaczego nie?
    robiw napisał:
    więc w trybie power-down "ciągnąłby" dodatkowe 85uA (gdy byłby zwarty do masy)

    Nie ciągnąłby. Rezystancja wejścia jest rzędu megaomów.
  • #5 19908235
    robiw
    Poziom 26  
    tmf napisał:
    Nie ciągnąłby. Rezystancja wejścia jest rzędu megaomów.


    Nie rozumiem. Podciągam PCINT0 do VCC rezystorem wewnątrz struktury. Przechodzę w tryb power-down a PCINT0 jest ściągnięty do masy i pobiera dodatkowe 85uA... Zauważ, że ten układ 99.99999% czasu jest w power-down. Wybudza się tylko przy zmianie stanu na PCINT0. Wewnętrzny rezystor pull-up wymusi spory dodatkowy prąd, przy PCINT0 zwartym do masy... R
  • #6 19908265
    excray
    Poziom 41  
    Zawsze możesz zrezygnować z PCINT i po prostu wybudzać uC co jakiś okres czasu i sprawdzać, czy się zmienił stan switcha.
  • #7 19908276
    robiw
    Poziom 26  
    Tak, mógłbym wybudzać go watch-dog'iem, ale przy założeniu, że zmiana stanu na PCINT0 występuje 15 razy na dobę to byłaby to niepotrzebna strata mocy baterii zasilającej. Podciągnę PCINT0 rezystorem 4.7M, co spowoduje dodatkowe 0.6uA poboru prądu (przy zwarciu do masy w power-down), przy poborze 0.2uA dla samego procka... R
  • #8 19908367
    jvoytech
    Poziom 21  
    Dla pinów wejściowych z włączoną funkcją alternatywną sygnał SLEEP jest nadpisywany i wejście bramki Schmitta nie jest zwierane i jedynie zewnętrzny rezystor o większej rezystancji zmniejszy zużycie prądu. Albo może inny procesor, w którym można włączać rezystor podciągający do zasilania albo do masy na zmianę?

    Jak u ciebie zachodzi sytuacja, że zewnętrzny układ mechaniczny włącza ci przycisk na bardzo długi okres to może zmiana rodzaju tego elementu pomoże:
    Dip-switch podłączony do pinów wejściowych - tryb Power-down i przerwanie zewnętrzne PCINT0
    W obu stanach przełącznika bramka portu w μC ma zdefiniowany stan i układ nie będzie pobierał prądu
  • #9 19908469
    excray
    Poziom 41  
    robiw napisał:
    Tak, mógłbym wybudzać go watch-dog'iem, ale przy założeniu, że zmiana stanu na PCINT0 występuje 15 razy na dobę to byłaby to niepotrzebna strata mocy baterii zasilającej. Podciągnę PCINT0 rezystorem 4.7M, co spowoduje dodatkowe 0.6uA poboru prądu (przy zwarciu do masy w power-down), przy poborze 0.2uA dla samego procka... R

    Przede wszystkim to trzeba się kierować zdrowym rozsądkiem zanim popadniemy w manię elektrooszczędności. Trzeba brać pod uwagę prąd self-discharge samej baterii, pobór urządzenia w czasie normalnej pracy i czas tej normalnej pracy. Może się okazać, że te 2-3uA wynikające z cyklicznego wybudzania uC zmienią czas pracy o jakieś mikroskopijne ilości. Używanie tak słabego zewnętrznego podciągania to proszenie się o kłopoty w sytuacji gdy urządzenie będzie pracować w środowisku zakłóconym, wilgotnym, czy po prostu z upływem czasu jak się zabrudzi.
  • #10 19908565
    robiw
    Poziom 26  
    Cykliczne wybudzanie nie sprawdzi się w tym temacie. Przycisk wybudzajacy może zmienić swój stan w dowolnej chwili i wybudzenie musi nastąpić natychmiast, więc w zasadzie musiałbym go wybudzać co 50ms. To bardzo często. R

    Dodano po 6 [minuty]:

    Też trochę się obawiam tak słabego podciągania, choć jest tam jeszcze kondensator 1n do masy...niemniej jednak chyba jedynym sensownym rozwiązaniem byłoby zmiana switcha na chwilowy...

    Dodano po 7 [godziny] 26 [minuty]:

    Witajcie...
    Wszystko działało dobrze poza poborem prądu przez podciąganie switcha wybudzającego... i nagle wszystko się zmieniło. Dotychczas procesor i podłączony do niego moduł RF pobierał około 0.3uA w trybie uśpienia...i nagle, kompletnie nie wiem z jakiej przyczyny, układ zaczął pobierać prawie 700uA w stanie uśpienia. Sam procesor 15uA zamiast 0.1uA a moduł RF ponad 650uA zamiast dotychczasowych 0.2uA. Skróciłem program do niezbędnego minimum dla testów i bez rezultatu:

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


    Schemat:
    Dip-switch podłączony do pinów wejściowych - tryb Power-down i przerwanie zewnętrzne PCINT0

    Jakieś pomysły? Najdziwniejsze jest to, że dotychczas to działało i szukałem wyłącznie rozwiązania pobierania prądu przez podciąganie... Robert
  • #11 19909494
    jvoytech
    Poziom 21  
    może coś zmieniłeś w ustawieniach kompilacji i jakiś parametr mógł wpłynąć na wygenerowany kod (wyciąć go, zoptymalizować, etc.). Jak masz kod pod systemem kontroli wersji np. git to mógłbyś się cofnąć w czasie i sprawdzić jaka zmiana wpłynęła na wzrost prądu. Czasami jakiś element systemu się automatycznie zupdatuje i wychodzą później różnice.
  • #12 19909586
    robiw
    Poziom 26  
    Nie mam takiej możliwości powrotu do starego kodu... niemniej jednak napisałem testowy, najprostszy kod jw. i pobór prądu jest duży. Zwiększył się zarówno po stronie procesora, jak i modułu RF. Nie mam pojęcia, co jest źle. Wylutuje zupełnie moduł RF (dotychczas odłączyłem mu tylko VCC w ramach testów) i zobaczymy. Wszystko naprawdę działało książkowo...??? R
  • #13 19909636
    StaryVirus_e_Wiarus
    Poziom 21  
    Cześć
    Tym wyłączasz spanie. [ sleep_disable(); ] W kodzie, który załączyłeś procesor jest w stanie spania przez kilka ns lub us. Czego nie zauważysz nawet.
  • #14 19909993
    robiw
    Poziom 26  
    Chodzi Ci o to, że po instrukcji sleep wykonywana jest jeszcze jedna instrukcja następującą po sleep, w tym przypadku sleep_disable()? Jak mogłem tego nie zauważyć, jakim cudem w poprzedniej wersji kodu to działało? Kolejność była taka sama. Ale, ale...makro sleep_disable to nie jest jedna instrukcja, więc czemu miałby nie wejść w tryb power-down? Nawet w dokumentacji avr-libc jest właśnie taką kolejność:

    https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html

    Robert
  • #15 19910123
    StaryVirus_e_Wiarus
    Poziom 21  
    Dla porządku, instrukcję [ set_sleep_mode(SLEEP_MODE_PWR_DOWN); ] przenieś po main() a przed PPR. Trudno coś doradzić bez Twojego kodu. Dla ćwiczenia instrukcję [ sleep_disable();
    ] wstaw do [ ISR(PCINT0_vect) {sleep_disable(); } ] i zobaczysz co będzie dopóki nie wywołasz przerwania SW.
  • #16 19910162
    robiw
    Poziom 26  
    StaryVirus_e_Wiarus napisał:
    Trudno coś doradzić bez Twojego kodu.


    To powyżej to jest właśnie cały, testowy kod... R
  • #17 19910182
    StaryVirus_e_Wiarus
    Poziom 21  
    Przykre ale on nie zadziała tak jak Ty oczekujesz. Zanim wywołasz sleep musisz przygotować uC do spania (tu porty). Wywołać sleep. Później po obudzeniu znów coś pomanewrować uC np. miganie LED. I pętlę while(1) proponuję zostawić pustą. Tak po szkolnemu: uC ma wykonywać zadania przez Ciebie zadane, a nie ściągane z internetu. Pomyśl zanim coś napiszesz na elektrodzie i przedstaw to nam. Na prawdę trudno jest pomóc.
  • #18 19910186
    excray
    Poziom 41  
    Ten kod nie ma prawa być ekonomiczny energetycznie. Choćby piny w stanie floating.
  • #19 19910188
    robiw
    Poziom 26  
    StaryVirus_e_Wiarus napisał:
    a nie ściągane z internetu


    Przykre jest to, co napisałeś. Nie są to kody ściągnięte z Internetu tylko takie, które już wykorzystywałem i działaby bez problemów. Są to zresztą kody proponowane przez dokumentację avr-libc. Nie muszę nic manewrować portami, bo poza portem PCINT, który jest podciągnięty zewnętrznie (schemat) pozostałe porty będą wisiały w powietrzu (kod testowy) i są ściągane do masy (bufory wejściowe przed bramką Schmidta) sygnałem SLEEP, by nie pobierać energii. Cytuję:

    "When entering a sleep mode, all port pins should be configured to use minimum power. The
    most important thing is then to ensure that no pins drive resistive loads. In sleep modes where
    both the I/O clock (clkI/O) and the ADC clock (clkADC) are stopped, the input buffers of the device
    will be disabled. This ensures that no power is consumed by the input logic when not needed. In
    some cases, the input logic is needed for detecting wake-up conditions, and it will then be
    enabled. See the section “Digital Input Enable and Sleep Modes” on page 58 for details on
    which pins are enabled."

    Nie mogę ich podciągnąć do VCC (np. te podłączone do dip-switcha), bo będą pobierać dodatkowy prąd, gdy dip-switch będzie załączony (ściągając port do masy)... R

    Dodano po 39 [sekundy]:

    excray napisał:
    Ten kod nie ma prawa być ekonomiczny energetycznie. Choćby piny w stanie floating.


    Jak wyżej... R
  • #20 19910194
    excray
    Poziom 41  
    Musisz poświęcić jeszcze jeden Pin, który będzie robił za masę dla świtcha.
  • #21 19910203
    robiw
    Poziom 26  
    excray napisał:
    Musisz poświęcić jeszcze jeden Pin, który będzie robił za masę dla świtcha.


    Po co? Już zdecydowałem, że switch SW bo będzie wyłącznik chwilowy, więc nawet podciągnięty pod VCC zewnętrznie będzie pobierał dodatkowy prąd tylko w chwili przyciśnięcia (zwarcia do masy). To jest akceptowalne. DIP-SWITCH musi pozostać floating, ale to nie problem w stanie Power-down (powyżej skrót z noty)... Niemniej program testowy i tak jest zminimalizowany a pobór prądu jest jednak spory. Najciekawsze jest to, że wierzcie mi, iż działało to prawidłowo...ale do czasu, nie pamiętam po jakiej zmianie przestało...dlatego wgrałem program testowy... R
  • #22 19910207
    excray
    Poziom 41  
    .... Dla świtcha opisanego jako addr
  • #23 19910212
    robiw
    Poziom 26  
    Ten adres odczytuję tuż po włączeniu zasilania jeszcze przed przejściem w power-down, potem piny są ustawiane bez podciągania i tyle... ale nie mówimy tu o sofcie docelowym a o tym, podanym przeze mnie, testowym, który jedyne co robi to uruchamia przerwanie PCINT0, zaś sam pin wywołujący to przerwanie jest zewnętrznie podciągany do VCC rezystorem 100k. Całą reszta wisi w powietrzu, co w trybie Active powoduje zwiększony pobór prądu, ale w trybie power-down nie powinno:

    "In sleep modes where both the I/O clock and the ADC clock are stopped, the input buffers of the device will be disabled. This ensures that no power is consumed by the input logic when not needed."

    R
  • #24 19910215
    excray
    Poziom 41  
    Bez podciągania czyli floating i ciągną prąd o czym pisał tmf
  • #25 19910224
    robiw
    Poziom 26  
    Podciągnę wszystkie porty do VCC i zobaczymy...niemniej jednak w układzie docelowym to nie jest możliwe, bo część pinów to wyjścia a część to wejścia. Swoją drogą nic nie piszą w jakim stanie zostawia wyjścia (IRQ, SDO) moduł RF, jak jest uśpiony, może tu jest "pies pogrzebany". Pewnie zostawia w ostatnim, znanym stanie... R
  • #26 19910336
    ex-or
    Poziom 28  
    robiw napisał:
    są ściągane do masy (bufory wejściowe przed bramką Schmidta) sygnałem SLEEP,

    Gdzie Ty to wyczytałeś? Jak widać w cytacie przytoczonym w #19 poscie porty wejściowe są całkowicie wyłączane, chyba że aktywne jest wybudzanie na pinie (czyli przerwanie) wtedy OIMW porty są pozostawione w stanie niezmienionym. Porty wyjściowe są pozostawione w stanie niezmienionym.
    Co do wyłączania peryferiów - coś mi się przypomina, że kolejność wyłączania ADC i komparatora ma znaczenie. W razie niewłaściwej kolejności ADC pozostanie włączony mimo zapisu do PRR! Szczegółów nie pamiętam bo dawno z tym walczyłem ale może w domu sobie przypomnę.
    Nie wiem z którym prockiem walczysz, ja mówię o m328/168
  • #27 19910359
    robiw
    Poziom 26  
    ex-or napisał:
    Gdzie Ty to wyczytałeś?


    "As shown in Figure 10-2 on page 55, the digital input signal can be clamped to ground at the input of the schmitt-trigger. The signal denoted SLEEP in the figure, is set by the MCU Sleep Controller in Power-down and Standby modes to avoid high power consumption if some input signals are left floating, or have an analog signal level close to VCC/2."

    Dip-switch podłączony do pinów wejściowych - tryb Power-down i przerwanie zewnętrzne PCINT0

    Tutaj to wyczytałem... także "left floating" w trybie Power-down nie powoduje dodatkowego zużycia prądu. Mylę się? Tmf pisał co prawda inaczej, ale skąd to wziął...

    Niemniej jednak uprościłem schemat do minimum, poniżej:Dip-switch podłączony do pinów wejściowych - tryb Power-down i przerwanie zewnętrzne PCINT0

    DIP-switch wyłączony. Cały program:

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


    Pobór prądu "gołego" MCU...300uA... R
  • #28 19910437
    ex-or
    Poziom 28  
    robiw napisał:
    Tutaj to wyczytałem..

    Niby tak, z tym że SLEEP steruje też czymś co ma nieznany mi symbol który jest pomiędzy podciąganiem a wejściem bramki schmita. Podejrzewam że to właśnie bufor który odcina pullup od masy przy aktywnym SLEEP. No dobra, nieważne, źle zrozumiałem (że pullup jest uziemiany) więc coś mi się nie zgadzało.
  • #29 19910500
    robiw
    Poziom 26  
    ex-or napisał:
    Niby tak


    No i zobacz... wszyscy autorytarnie wypowiadają się, że jest tak a nie inaczej, czasami nawet wyśmiewają (że biorę przykłady z Internetu) a dokumentacja mówi ta, nie inaczej. Nie twierdzę, że poprawnie to odczytuję...ale... ALE, dla samego procka ze schematu, jak powyżej i programu, jak powyżej...pobór 300uA. Coś jest nie tak... R

    Dodano po 5 [minuty]:

    ex-or napisał:
    Podejrzewam że to właśnie bufor który odcina pullup od masy przy aktywnym SLEEP


    Pull-up jest kompletnie niezależny od sygnału SLEEP, co widać na schemacie. Zależy między innymi od sygnału PUD. Od sygnału SLEEP zależny jest bufor WEJŚCIOWY... R

    Dodano po 39 [minuty]:

    Zmieniłem main na:

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


    Czyli, na piechotę z rejestrem MCUCR...bez zmian... 300uA w Power-down... R
  • #30 19910695
    StaryVirus_e_Wiarus
    Poziom 21  
    (3V/ 50k) * 4 dipsw = ~ 240uA
    A ten motylek przed schmitem to klucz analogowy, taki sterowany bufor.

Podsumowanie tematu

W dyskusji poruszono problem podłączania pinów wejściowych do dip-switcha w kontekście trybu Power-down mikrokontrolera. Użytkownik zauważył, że podciąganie pinów do VCC może prowadzić do niepożądanego poboru prądu (85uA przy 3V) w trybie Power-down, gdy pin jest zwarty do masy. Uczestnicy dyskusji wskazali, że w trybie Power-down wewnętrzne bufory wejściowe są ściągane do masy sygnałem SLEEP, co minimalizuje pobór prądu. Zasugerowano również użycie zewnętrznych rezystorów podciągających dla pinów, które mają wybudzać procesor, aby ograniczyć pobór prądu do akceptowalnych wartości. W końcu, po przeprowadzeniu testów na różnych mikrokontrolerach, potwierdzono, że piny wiszące w powietrzu nie generują dodatkowego poboru prądu w trybie Power-down, co jest zgodne z dokumentacją producenta.
Podsumowanie wygenerowane przez model językowy.
REKLAMA