Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

BASCOM AVR - Zasilanie bateryjne, coś do wybudzania AVR-a co godzinę

12 Dec 2012 07:21 5163 25
  • Level 36  
    Witam.

    Potrzebuję zrobić urządzenie zasilane bateryjnie, wybudzające się co godzinę, wykonujące operację i ponownie zasypiające. Już wiem, że nie zrobię tego na wybudzającym się co 2s Attiny13 (to maksymalnie długi czas możliwy do uzyskania). Potrzebuję zewnętrzne źródło wybudzania. Może jakiś zegar PCF8583 z zaprogramowanym alarmem co godzinę? A może jakieś zwyklejsze odliczanie czasu na scalakach cyfrowych, ale tak, aby pobór prądu był porównywalny z poborem PCF8583 (50uA) lub mniejszym?

    Teoria z artykułu też w praktyce na niewiele się zdaje.
    http://mikrokontrolery.blogspot.de/2011/01/bateria-zasila-mikrokontroler-czesc-1.html

    Jakieś pomysły?
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Moderator of Microcontroller designs
    Możesz użyć RTC, one mają wyjście INT, które można aktywować o określonym czasie. Można też wyjść poza stare AVRy i użyć nowszych, XMEGA ma RTC z możliwością wybudzania przy określonym stanie licznika. Dla 32-bitowego RTC możesz wybudzanie ustawić w zakresie ponad 136 lat :)
  • Level 23  
    W trybie power down są zachowywane rejestry procka. Niech WDT budzi procka co 2 sekundy i zwiększa wartość wybranego/wybranych rejestrów.
  • Level 36  
    tmf wrote:
    Można też wyjść poza stare AVRy i użyć nowszych, XMEGA

    Potrzebuję mały tani uC, który wybudzi się dokona pomiaru na ADC, wyśle pomiar i znów się uśpi. XMEGA to przypuszczalnie strzelanie z armaty do muchy.

    akajarz wrote:
    W trybie power down są zachowywane rejestry procka. Niech WDT budzi procka co 2 sekundy i zwiększa wartość wybranego/wybranych rejestrów.

    Zmienne jako takie, przechowywane nie są, prawda?
  • Level 30  
    Dlaczego nie możesz budzić procka co 2 sekundy zliczając czas do pełnej godziny, a po 1800 wybudzeniach zrobić, co tam masz do wykonania?
  • Level 36  
    chudybyk wrote:
    Dlaczego nie możesz budzić procka co 2 sekundy zliczając czas do pełnej godziny, a po 1800 wybudzeniach zrobić, co tam masz do wykonania?

    Bo mam wrażenie, że zmienne przy wejściu w powerdown są tracone?
  • Helpful post
    Level 14  
    Witam

    MES Mariusz wrote:
    tmf wrote:
    Można też wyjść poza stare AVRy i użyć nowszych, XMEGA

    Potrzebuję mały tani uC, który wybudzi się dokona pomiaru na ADC, wyśle pomiar i znów się uśpi. XMEGA to przypuszczalnie strzelanie z armaty do muchy.


    Czy ja wiem czy taka armata, obejrzyj rodzinę Xmega D4 w TQFP44,
    wcale nie taka droga (w TME ~10zł),
    a ma wszystko co potrzebujesz (RTC odlicza do 65536 sek, a prąd w uśpieniu <5uA), do tego dostajesz ADC 12bit i wbudowany 32kHz oscylator dla RTC.
  • User removed account  
  • Helpful post
    Level 17  
    Aby Ci się zmienne nie kasowały po wyjściu z powerdown musisz je umieścić w sekcji NOINIT.

    Marek
  • Level 36  
    mmacura wrote:
    Aby Ci się zmienne nie kasowały po wyjściu z powerdown musisz je umieścić w sekcji NOINIT.

    Marek



    Czyli, że niby jednak pamięć jest podtrzymywana. Przy założeniu, że użyty zostanie Bascom AVR pewnie sprawdzi się $NORAMCLEAR.

    Opis:
    Normalnie pamięć SRAM jest kasowana podczas inicjalizacji. Gdy zawartość pamięci nie powinna być kasowana (zapisywana zerami), można użyć tej dyrektywy.
    Ponieważ podczas kasowania pamięci zawartość wszystkich zmiennych jest ustawiana jako 0 lub "" (dla zmiennych String), umieszczenie dyrektywy $NORAMCLEAR spowoduje, że ich zawartość będzie nieznana. Prawdopodobnie będą one wypełnione wartością &H0FF, choć nie jest to pewne.

    Zobaczymy czy zadziała.
  • Helpful post
    Level 17  
    Jak to wygląda w Bascom to nie mam pojęcia.
    W C deklaruje się sekcję NOINIT i wszystkie zmienne przypisane do niej podczas startu procesora (czyli np. po resecie od WDT) nie są inicjalizowane, więc mają swoją poprzednią wartość.
    Trzeba je za to niestety zainicjalizować ręcznie podczas startu procesora po włączeniu zasilania (trzeba analizować jaka była przyczyna resetu procesora: czy power up czy reset od WDT czy reset od pinu Reset).

    Marek
  • User removed account  
  • Level 17  
    W obu powyższych przypadkach trzeba dodatkowego sprzętu, więc i miejsca na płytce, a zabawa z pamięcią jest za free.

    Marek
  • Moderator on vacation ...
    MES Mariusz wrote:
    Potrzebuję zrobić urządzenie zasilane bateryjnie, wybudzające się co godzinę, wykonujące operację i ponownie zasypiające. Już wiem, że nie zrobię tego na wybudzającym się co 2s Attiny13 (to maksymalnie długi czas możliwy do uzyskania).

    Jak to policzyłeś?
  • Level 36  
    dondu wrote:
    MES Mariusz wrote:
    Potrzebuję zrobić urządzenie zasilane bateryjnie, wybudzające się co godzinę, wykonujące operację i ponownie zasypiające. Już wiem, że nie zrobię tego na wybudzającym się co 2s Attiny13 (to maksymalnie długi czas możliwy do uzyskania).

    Jak to policzyłeś?

    Kolega to sprawdzał, ja się nie zagłębiałem (poprosiłem, żeby odpisał). Ale czy to będzie 2s czy 8s to i tak niewiele to zmienia. Przypuszczalnie $NORAMCLEAR załatwi sprawę. Jak będzie sprawdzone dam znać.
  • Level 14  
    Jak pisze Mariusz wyżej, sprawdzałem. Wpisanie w watchdoga każdej innej liczby niż 2048 czyli 2 sekundy nie daje żadnego rezultatu. Nawet bym rzekł że wpisanie czegoś więcej wydłuża czas startu procesora. (sprawdzane na atmega8 i płytce ewaluacyjnej PROPOX'u)
    2048 to max co da się bujnąć. Jakby nie liczył wychodzi 2 sekundy.

    Co do samej dyrektywy $NORAMCLEAR to nie zauważyłem żadnego wpływu na działanie programu z tą dyrektywą i bez niej.
  • Level 37  
    matrix0606 wrote:
    Jak pisze Mariusz wyżej, sprawdzałem. Wpisanie w watchdoga każdej innej liczby niż 2048 czyli 2 sekundy nie daje żadnego rezultatu.


    Watchdog timer, podobnie jak inne timery posiada prescaler, który konfiguruje się edytując bity WDP3:0 w WDTCR – Watchdog Timer Control Register, co pozwoli ustawic max 'time out' na 8sec. dla Attiny13.
    Inne m-processory mogą się różnic pod tym względem.

    e marcus
  • Level 36  
    Się wgłębię, żeby nie było wątpliwości.

    Kod:

    Code: basic4gl
    Log in, to see the code


    Do wybudzania uC z powerdown używany watchdog.

    Wg helpa Bascom:

    Quote:
    CONFIG WATCHDOG = czas
    gdzie:
    czas czas w milisekundach po jakim układ WATCHDOG uaktywni
    sygnał reset procesora. Możliwe są wartości: 16 , 32, 64 , 128 ,
    256 , 512 , 1024 oraz 2048.


    Więc rzeczywiście mamy 2s. Jak teraz oszukamy procka i ustawimy wolniejszy kwarc to owszem, może i rzadziej się wybudzi, ale inne wbudowane funkcje zależne czasowo przestaną działać.

    Żeby jeszcze $NORAMCLEAR chciała zadziałać (dłuższe czasy wysnaczane przez inkrementację zmiennej do wyznaczonej wartości), tak jak założyłem (po wyjściu z powerdown zmienne nie będą kasowane). Ale niestety tak to działać nie chce.
    [/quote]



    ---edit---

    Z helpa najnowszej wersji:

    Quote:
    The interval constant in mS the watchdog timer will count to before it will reset your program.





    Possible settings :

    16 , 32, 64 , 128 , 256 , 512 , 1024 and 2048.

    Some newer chips : 4096, 8192.



    The XMEGA has a 1 KHz clocked watchdog. For Xmega the following value in millisecond need to be used :

    8 ,16,32,64,125,250,500,1000,2000,4000,8000

    So 2000 will sets a timeout of 2 seconds.


    Note that some new AVR's might have additional reset values such as 4096 and 8192.



    When the WD is started, a reset will occur after the specified number of mS.

    With 2048, a reset will occur after 2 seconds, so you need to reset the WD in your programs periodically with the RESET WATCHDOG statement.



    Some AVR's might have the WD timer enabled by default. You can change this with the Fuse Bits.



    After the CONFIG WATCHDOG statement, the watchdog timer is disabled. You can also use CONFIG WATCHDOG to change the time out value. This will stop the watchdog timer and load the new value.

    After a CONFIG WATCHDOG, you always need to start the Watchdog with the START WATCHDOG statement.



    Most new AVR chips have an MCUSR register that contains some flags. One of the flags is the WDRF bit. This bit is set when the chip was reset by a Watchdog overflow. The CONFIG WATCHDOG will clear this bit, providing that the register and bit is available in the micro.

    When it is important to examine at startup if the micro was reset by a Watchdog overflow, you need to examine this MCUSR.WDRF flag before you use CONFIG WATCHDOG, since that will clear the flag.



    For chips that have an enhanced WD timer, the WD timer is cleared as part of the chip initialize procedure. This because otherwise the WD timer will only work once. If it is important that you know the cause of the reset, you can read the register R0 before you run other code.


    Z resztą czy to będzie 2s czy 8s to w sumie kwestia na tę chwilę drugorzędna. Procek musi wykonać akcję raz na godzinę. Problem jest na razie taki, że nie za bardzo wiem jak nie utracić zawartości inkrementowanej zmiennej po wyjściu z powerdown (po zadziałaniu watchdoga, który w zasadzie nie robi nic innego jak właśnie generuje reset...)
  • VIP Meritorious for electroda.pl
    matrix0606 wrote:
    Wpisanie w watchdoga każdej innej liczby niż 2048 czyli 2 sekundy nie daje żadnego rezultatu.
    Takie kwiatki to tylko w sprytnej wiedzy użytkowników Bascom wyskakują... W rejestrze Watchdog-a, który jest 8-bitowy nie wpiszesz większej liczby niż 255. Można jedynie ustawić konkretne, zaprojektowane z góry przez twórców mikrokontrolera czasy licznika. Ale po co nam nota katalogowa, skoro jest wygodnie być programistycznym kaleką, posługującym się tylko protezami w rodzaju Bascom Help.
    MES Mariusz wrote:
    Potrzebuję zrobić urządzenie zasilane bateryjnie, wybudzające się co godzinę, wykonujące operację i ponownie zasypiające
    Pragnę przypomnieć, ze watchdog w ATtiny13 nie musi resetować układu. W odpowiednim trybie pracy może wywoływać odpowiednie przerwanie, w którym można sobie coś zliczać i usypiać ponownie do odpowiedniego momentu.
    Szczegóły ustawiania rejestru w Tabeli 8-1 na 42 stronie noty katalogowej (doc2535.pdf).
  • Level 36  
    tmf wrote:
    XMEGA ma RTC z możliwością wybudzania przy określonym stanie licznika. Dla 32-bitowego RTC możesz wybudzanie ustawić w zakresie ponad 136 lat :)


    W nocie http://www.atmel.com/Images/doc8135.pdf jest napisane

    Quote:
    10.3.3 Power-save Mode
    Power-save mode is identical to power down, with one exception. If the real-time counter (RTC) is enabled, it will keep running during sleep, and the device can also wake up from either an RTC overflow or compare match interrupt.


    W dokumencie
    http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=248 na stronie 28 jest przykład użycia RTC dla BASCOM AVR.

    Teraz wystarczy jeszcze zorientować się w jaki sposób wybudzać uC po odliczeniu skonfigurowanego czasu.


    --- edit ---

    Hmm... Mark napisał mi, że wykorzystywanie RTC niestety nie będzie użyteczne, ponoć lepszym pomysłem będzie użycie zewnętrznego RTC. Z prostego powodu, RTC wbudowane w XMEGA nie jest w rzeczywistości żadnym zegarem, nie przechowuje informacji o godzinie. Owszem jest możliwość podłączenia odrębnego oscylatora, ale ma to służyć wciąż wyznaczeniu pojedynczego "tiku" zegarowego. Nie jest możliwe ustawienie alarmu, a zatem i wybudzenie przez alarm. Ponoć najlepszym pomysłem pozostaje rzeczywiście zastosowanie zewnętrznego PCF-a z programowanym alarmem, zupełnie nieazleżnego od uC.
  • Level 14  
    LordBlick wrote:
    akie kwiatki to tylko w sprytnej wiedzy użytkowników Bascom wyskakują... W rejestrze Watchdog-a, który jest 8-bitowy nie wpiszesz większej liczby niż 255. Można jedynie ustawić konkretne, zaprojektowane z góry przez twórców mikrokontrolera czasy licznika.

    A gdzie ja napisałem że wpisuję to do rejestru? 2048 to liczba którą Mark Alberts przepisuje do rejestru. Dla ułatiwenia w bascomie reprezentuje ona liczbę ms jakie są odliczane do następnego przerwania.
  • Level 14  
    MES Mariusz wrote:
    tmf wrote:
    XMEGA ma RTC z możliwością wybudzania przy określonym stanie licznika. Dla 32-bitowego RTC możesz wybudzanie ustawić w zakresie ponad 136 lat :)


    W nocie http://www.atmel.com/Images/doc8135.pdf jest napisane

    Quote:
    10.3.3 Power-save Mode
    Power-save mode is identical to power down, with one exception. If the real-time counter (RTC) is enabled, it will keep running during sleep, and the device can also wake up from either an RTC overflow or compare match interrupt.


    W dokumencie
    http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=248 na stronie 28 jest przykład użycia RTC dla BASCOM AVR.

    Teraz wystarczy jeszcze zorientować się w jaki sposób wybudzać uC po odliczeniu skonfigurowanego czasu.


    --- edit ---

    Hmm... Mark napisał mi, że wykorzystywanie RTC niestety nie będzie użyteczne, ponoć lepszym pomysłem będzie użycie zewnętrznego RTC. Z prostego powodu, RTC wbudowane w XMEGA nie jest w rzeczywistości żadnym zegarem, nie przechowuje informacji o godzinie. Owszem jest możliwość podłączenia odrębnego oscylatora, ale ma to służyć wciąż wyznaczeniu pojedynczego "tiku" zegarowego. Nie jest możliwe ustawienie alarmu, a zatem i wybudzenie przez alarm. Ponoć najlepszym pomysłem pozostaje rzeczywiście zastosowanie zewnętrznego PCF-a z programowanym alarmem, zupełnie nieazleżnego od uC.


    tylko że RTC możesz wykorzystać do odmierzania godziny: wewnętrzny generator RC daje f 1024Hz, do tego prescaler np 1024 i już masz zegar 1Hz, okres ustawiasz na odmierzenie 3600sek i po wybudzeniu wykonać swoje operacje wyzerować RTC i znowu uśpić
  • Level 23  
    MES Mariusz wrote:
    tmf wrote:
    Można też wyjść poza stare AVRy i użyć nowszych, XMEGA

    Potrzebuję mały tani uC, który wybudzi się dokona pomiaru na ADC, wyśle pomiar i znów się uśpi.



    Witam,

    Już dawno przekonałem się że jeśli chodzi o energooszczędność to nie ma nic lepszego niż msp430.

    W projekcie radiowego czujnika/rejestratora temperatury pobór prądu przy wybudzaniu z częstotliwością 32Hz, sprawdzaniu klawiszy, działającym LCD, RTC wynosi ~30uA (MSP430F4152).
    Oczywiście radio działa tylko raz na minutę.

    Układy z nowej serii MSP430G to koszt poniżej dolara za układ.

    LaunchPad MSP430 Value Line to programator/debugger z 2 procesorami DIP20 to koszt 16zł netto. Środowisko CCS ma ograniczenie kodu do 16kB... ja się zmieściłem :)

    Niestety w tym przypadku tylko C.

    Być może przekonasz się do innego procesora :)

    Pozdrawiam
  • User removed account  
  • Level 23  
    Oczywiście że się da :) jednak przesiadka z bascoma na asm brzmi gorzej niż na C.
  • Level 31  
    matrix0606 wrote:
    ...Co do samej dyrektywy $NORAMCLEAR to nie zauważyłem żadnego wpływu na działanie programu z tą dyrektywą i bez niej.


    Bo gdy tą dyrektywę dodamy w programie to kompilator nie umieści na początku programu procedury czyszczącej pamięć i jeszcze paru innych drobiazgów inicjalizujących, np. LCD... Przydaje się zazwyczaj w małych prockach typu Attiny13 gdzie czasem trwa walka o każdy wolny bajt.