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

Dlaczego ATTiny24A pobiera 20uA w trybie Power Down zamiast <0.1uA?

15 Lip 2015 16:54 3033 35
  • #1 14850510
    Konto nie istnieje
    Poziom 1  
  • #3 14850661
    excray
    Poziom 41  
    Jak słusznie kolego zauważyłeś 0,1uA jest przy 1,8V. Przy 5V pobór jest dużo większy.
  • #4 14850761
    Konto nie istnieje
    Poziom 1  
  • #5 14850821
    Wirnick
    Poziom 30  
    AdamZad napisał:

    Wygląda również na to że do wymuszania stanu niskiego na linii portu procek zużywa dodatkowo prąd i średnio wychodzi na to że przy skonfigurowanych portach jako wejścia procek pobiera o 232uA więcej co daje średnio 20uA na każdą linię portu (jak to się ma do prawa Ohma : czytałem że rezystor podciągający może być max.50kOhm więc : 5/50k=0.5mA na linię... ?
    Nic z tego nie kapuję...
    Z prawa Ohma wychodzi 0,1mA na linię z + do -.
    Znając oporność wejściową portu, Kirchhoff i Ohm powiedzieli by coś innego.
  • #6 14850872
    Konto nie istnieje
    Poziom 1  
  • #7 14851220
    dondu
    Moderator na urlopie...
    Lektura:
    - 3 części artykyłu: http://mikrokontrolery.blogspot.com/2011/01/bateria-zasila-mikrokontroler-czesc-1.html
    - oraz kilka na przykładzie: http://mikrokontrolery.blogspot.com/2011/04/S...PIP-elektroniczny-dreczyciel-spis-tresci.html

    W dokumentacji przeczytaj rozdział: 7.4 Minimizing Power Consumption
  • #8 14851436
    Konto nie istnieje
    Poziom 1  
  • #9 14851525
    dondu
    Moderator na urlopie...
    AdamZad napisał:
    Jednak nie obraź się ale nie odpowiadają mi na moje pytania:

    Jak najlepiej skonfigurować porty jak się idzie spać do power down mode (AtTiny24A) i dlaczego ?
    Są dwie opcje które zgodnie z treściami z przekazywaną przez Ciebie wiedzą oraz zgodnie z dokumentacją biorę pod uwagę:
    1. Skonfigurowanie jako wyjścia przed pójściem spać i wymuszenie stanu zerowego
    2. Skonfigurowanie jako wejścia z załączonym pull up.

    Pytanie jednak brzmi:
    Co z pinami całkowicie nieużywanymi...

    Odpowiadają na wszystkie Twoje pytania: Należy sprawdzać empirycznie.

    Innymi słowy w zależności od procesora efekt może być różny, chociażby przez rozrzut parametrów upływności pinów oraz rozrzutu wartości rezystorów pull-up, pull-down w poszczególnych mikrokontrolerach z tej samej lub różnych partii.

    Innymi słowy jeśli różnica jest np 1µA i nie ma to dla Ciebie większego znaczenia, to wybierasz co zechcesz. Jeśli natomiast tak jak ja w PIC-ach walczysz o każdy nA, to:
    - projektujesz układ pod tym kątem od samego początku - patrz link do SmartPIP,
    - testujesz, testujesz ... i testujesz.

    ATmega8 datasheet napisał:
    Port Pins
    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
    the 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. Refer to the section “Digital Input Enable and Sleep Modes” on page 55 for
    details on which pins are enabled. If the input buffer is enabled and the input signal is left floating
    or have an analog signal level close to VCC/2, the input buffer will use excessive power.


    AdamZad napisał:
    Pytanie brzmi:
    Czy po wybudzeniu z trybu power down rejestry portów DDR i PORT pozostają takie jak przed pójściem spać ?

    Łatwo się o tym przekonać wykonując prosty test oraz czytając dokumentację:

    Cytat:
    The I/O ports of the AVR are immediately reset to their initial state when a reset source goes
    active. This does not require any clock source to be running.

    czyli tylko reset powoduje ustawienie wartości domyślnych portów I/O.

    Generalnie projekty wyciskające maksymalną oszczędność energii to mój "konik" :)
    i cieszę się, gdy takie tematy jak Twój pojawiają się na forum. Warto o tym pisać, bo w tym przypadku należy szukać oszczędności w całym projekcie nie tylko mikrokontrolerze, a to już wyższa szkoła jazdy, gdy walczysz o to, by urządzenie pracowało np. kilkanaście lat na jednej baterii :)
  • #10 14851659
    Konto nie istnieje
    Poziom 1  
  • #11 14851799
    dondu
    Moderator na urlopie...
    AdamZad napisał:
    Chciałbym zapytać zatem na jakiej podstawie twierdzisz że tylko reset powoduje ustawienie wartości domyślnych portów I/O. To że reset to pewne ale może coś jeszcze... ? Chyba jednak będę musiał wykonać test...

    W dokumentacji w każdym rejestrze są podane wartości inicjujące "Init value" dla poszczególnych bitów. Wartości inicjujące oznaczają wartości po resecie. W związku z tym, że uśpienie i wybudzenie przez INT0 nie jest resetem, wartości rejestrów nie są zmieniane. Test oczywiście możesz wykonać jak sugerowałem.


    AdamZad napisał:
    I jeszcze jedno: Załóżmy że śpi w power downie i załóżmy że ma tak poustawiane że przerwanie od INT0 jest skonfigurowane na poziom niski i dodatkowo INT0 na wejście podciągnięte pull upem. Czy w tym wypadku będzie te moje wyliczone 20uA na ten pin ?

    Upływność pinów masz podaną w dokumentacji parametry IIL oraz IIH i wynoszą dla ATmega8 max 1µA przy 5,5V.


    AdamZad napisał:
    I ostatnie : czy ktoś z tutaj obecnych może mi to dziadostwo przetłumaczyć dokładniej :

    If a logic high level (“one”) is present on an asynchronous external interrupt pin configured as “Interrupt on Rising Edge, Falling Edge, or Any Logic Change on Pin” while the external interrupt is not enabled, the corresponding External Interrupt Flag will be set when resuming from the above mentioned Sleep mode, as the clamping in these sleep mode produces the requested logic change.

    Faktycznie ciężko to zrozumieć :)

    Generalnie chodzi o to, że flaga INTFx przerwania INTx (ustawionego dla przypadków zbocza opadającego, narastającego lub dowolnego zbocza) zostanie ustawiona niezależnie, czy przerwanie jest włączone, czy też nie. Pozwala to na programowe sprawdzanie flagi bez definicji i wykonywania funkcji przerwania.

    Wynika to także z tego fragmentu:

    Cytat:

    GIFR

    When an event on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the Ibit
    in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corresponding
    Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag
    can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured
    as a level interrupt.

    Wytłuszczony fragment pokazuje, że ustawienie flagi przerwania INTF0 następuje po wykryciu odpowiednio wybranej (za pomocą ISC01 i ISC00) sytuacji niezależnie od ustawienia INT0 w GICR, czyli nawet przy wyłączonym przerwaniu INT0. Analogicznie dla INT1.
  • #12 14868579
    Konto nie istnieje
    Poziom 1  
  • #13 14868997
    excray
    Poziom 41  
    PCINT0 to PA0 a INT0 to PB2 więc co to ma ze sobą wspólnego? To są 2 różne piny o ile tego nie zauważyłeś. Gdybyś użył INT0 oraz PCINT10 to o kolejności przerwań (bo wystąpią oba) decyduje priorytet przerwań czyli pierwsze będzie od INT0.
  • #14 14869523
    Konto nie istnieje
    Poziom 1  
  • #15 14870362
    excray
    Poziom 41  
    A jak mam się odnosić? Przecież już kolega @dondu opisał o co chodzi. Nie rozumiem w czym masz problem. PCINT jak sama nazwa wskazuje jest przerwaniem od zmiany stanu więc utrzymywanie na takim wejściu niskiego czy wysokiego stanu nic nie zmienia. Więc jeśli trzymasz linię PCINT w stanie niskim/wysokim i w takim momencie zmienisz stan wejścia INT (oczywiście w zależności od tego jak jest ustawione to przerwanie) to nastąpi przerwanie INT. Może po prostu napisz co zaobserwowałeś i co wzbudziło Twoje wątpliwości.
  • #16 14871078
    Konto nie istnieje
    Poziom 1  
  • #17 14871332
    excray
    Poziom 41  
    Kolego a dlaczego miałoby Ci się ustawić flaga od przerwania INT0 skoro takie nie nastąpiło? Jak słusznie zauważyłeś są to wewnętrzne operacje procesora a co za tym irracjonalne by było gdyby z ich powodu procesor ustawiał jakieś flagi.
  • #18 14871492
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #19 14871513
    excray
    Poziom 41  
    Tam jest jeszcze synchronizer który do działania potrzebuje zegara clk i/o który jest aktywny tylko w trybie sleep iddle więc może ten tryb autor miał na myśli pisząc tamtą notkę a w pozostałych trybach ze względu na brak clk i/o flaga się nie ustawia? Niemniej Twój dylemat może rozwiązać chyba tylko support atmela bo to już są dyskusje czysto akademickie nie mające dla programisty praktycznie żadnego znaczenia.
  • #20 14871551
    dondu
    Moderator na urlopie...
    Jest dokładnie tak jak opisał to excray. Flaga będzie ustawiona ale tylko w trybie, w którym działają synchronizatory np. IDLE. W trybie Power Down flaga INT0 nie zostanie ustawiona pomimo, że z dokumentacji wnioskować można że jest inaczej. Jedynym możliwym wytłumaczeniem jest właśnie synchronizator.

    Jestem przekonany, że gdy uśpisz do trybu IDLE, flaga INT0 będzie ustawiana.

    Może więc należałoby faktycznie zgłosić to supportowi (błąd w dokumentacji), ale to dotyczy chyba wszystkich mikrtokontrolerów AVR. Może więc to błąd tłumaczenia i przysięgły tłumacz techniczny, by się przydał :)

    Z ciekawości co robiłeś, że taki problem znalazłeś?
  • #21 14871601
    Konto nie istnieje
    Poziom 1  
  • #23 14871648
    Konto nie istnieje
    Poziom 1  
  • #24 14871812
    dondu
    Moderator na urlopie...
    Test dla ATtiny13

    PB3 dioda LED INT0
    PB4 dioda LED PCINT0

    PB0-wejście przerwania PCINT0
    PB1-wejście przerwania INT0
    oba pull-upy włączone

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


    Wynik testu:

    Dla trybów INT0 innych niż The low level of INT0 generates an interrupt request:
    - gdy włączony jest tryb sny IDLE układ poprawnie zapamiętuje przerwanie INT0.
    - gdy włączony jest POWER DOWN, flaga INT0 nie jest zapamiętywana.

    Dla INT0 ustawionego w tryb The low level of INT0 generates an interrupt request flaga nie jest zapamiętywana w żadnym trybie snu, co wydaje się zgodne z tym, że we fragmentach dokumentacji które wskazałeś tego trybu nie wymieniono:

    Cytat:
    If a logic high level (“one”) is present on an asynchronous external interrupt pin configured as “Interrupt on Rising Edge, Falling Edge, or Any Logic Change on Pin” while the external interrupt is not enabled, the corresponding External Interrupt Flag will be set when resuming from the above mentioned Sleep mode, as the clamping in these sleep mode produces the requested logic change


    Wyniki są więc zgodne z tym co napisaliśmy razem z kol. excray.
  • #25 14871857
    Konto nie istnieje
    Poziom 1  
  • #26 14871876
    dondu
    Moderator na urlopie...
    Dlaczego miałbym się obrazić ? :)

    1. Opisałem wyżej. Testuj dowolny przypadek - rezultaty są te same z wyjątkiem low level of INT0.
    2. i 3. Słusznie - mało precyzyjnie:

    dondu napisał:
    ... układ poprawnie zapamiętuje przerwanie INT0.

    poprawiam więc: ... układ poprawnie zapamiętuje flagę INTF0 przerwania INT0.
  • #27 14871923
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #28 14872028
    dondu
    Moderator na urlopie...
    2. Och te upały - oczywiście ustawia, a nie zapamiętuje :)

    1.
    W teście powyżej INT0 nie ma włączonej obsługi przerwań (fragment jest zakomentowany), ale dla testów funkcję obsługi przerwania zostawiłem.

    Oba przerwania mają na swoich pinach włączone pull-up więc operowanie nimi odbywa się przez podanie stanu niskiego na pin, czyli przez zwarcie do masy. Reakcja na stan pinu danego przerwania następuje w momencie zależnym od ustawień poszczególnych przerwań (zbocze, poziom, dowolna zmiana stanu).

    3.

    AdamZad napisał:
    3. Czy robisz może tak że przed faktycznym wybudzaniem zmianą na PCINT0 zmieniasz pin na INT0 (co na skutek tego że nie jest odblokowane nie wybudza procka) ? Ale już po jego wybudzeniu późniejszą zmianą na PCINT0 mamy sytuację że flaga INTF0 się ustawiła ? Rozumiem że to tak będzie dla trybu IDLE to logiczne bo w tym trybie bufory wejściowe działają.

    Dokładnie tak. Można więc powyższym programem testować, czy w danym trybie snu INTF0 będzie ustawiona, czy też nie, oraz jak zależy to od ustawień rodzaju wyzwolenia INT0.



    AdamZad napisał:
    ... czyli o trybie Power Down i "doziemieniu" (ang. clamping to ground) które "wyprodukuje" zmianę stanu w buforze wejściowym (za Schmidtem) na skutek tego że z początku była tam jedynka logiczna (podciągnięte wejście).

    Czy teraz już rozumiesz o co mi chodzi właściwie w tych postach ?


    Pominąłeś tę część:

    Cytat:
    SLEEP is overridden for port pins enabled as external interrupt pins. If the external interrupt
    request is not enabled, SLEEP is active also for these pins.

    która mówi, że sygnał SLEEP z rysunku Figure 10-2 jest nadpisywany (traci znaczenie) w przypadku każdego pinu, dla którego funkcja przerwania zewnętrznego jest włączona.

    Dlatego też jeśli (przykład dla pinu INT0):
    - nie włączysz przerwań INT0, to dla tego pinu SLEEP wyłącza "zawór" o którym pisałeś i włącza pull-down przed schmittem.
    - gdy włączysz przerwanie INT0, to dla tego pinu "zawór" jest włączany, a pull-down nie, przez co INT0 może działać normalnie.

    Edit:

    Podsumowując, jak napisał excray pytanie należałoby zadać supportowi, bo z opisu wynika, że flaga INT0 powinna być ustawiana w trybie power-down, a nie jest co ja pokazałem i sprawdziłem na przykładzie ATtiny13, a Ty na ATtiny24.
  • #29 14872113
    Konto nie istnieje
    Poziom 1  
  • #30 14872128
    dondu
    Moderator na urlopie...
    Nie pytałem po co chcesz to wiedzieć tylko:

    dondu napisał:
    Z ciekawości co robiłeś, że taki problem znalazłeś?

    Teraz już wiem - po prostu dokładnie czytasz dokumentację i się uczysz :)

    Do supportu napiszę pytanie osobiście, bo bardzo mnie ciekawi co odpowiedzą

    Tematu nie zamykaj, bo jest ciekawy i ktoś inny może mieć jeszcze jakieś pytania.
REKLAMA