ATtiny25: změna frekvence oscilátoru za běhu programu

Zdravím,
potřebuji snížit odběr jednoduchého zapojení ATTINY85 na minimum.
Jaké jsou možnosti snížení SW-rem, používám programování skrze USB a Arduino 1.6.10, kdyby nebylo zbytí, zkusím i něco jiného.
Tiny po zapnutí udělá impuls 1 sec na výstupu a pak se natrvalo uspí do dalšího vypnutí a zapnutí napájení, čili nic složitého.
Jaký je minimální dosažitelný odběr? Pasovalo by mi tak okolo 100 microampér.
Děkuji.
mpcz, 31.07.2016

Pokud ATtiny85 udělá 1 sek. impulz a pak jde až do vypnutí spát, pak nemusíš vůbec řešit žádné hodiny. Po provedení impulzu nastavíš sleep mode na Power-down, zakážeš veškerá přerušení, eventuálně deaktivuješ všechny výstupy atd. a přepneš do sleep módu. Tím se ATtiny dostane do Power-down režimu s odběrem cca 0,1uA při 1,8V napájení (podle datasheetu). Při 5V bude odběr malinko vyšší, ale myslím si, že do 1uA by ses měl vejít i tak.

OK,
dík, jenomže já potřebuji, aby hned po startu měla TINY85 odběr řádu desítek až stovek mikroampér, zdrojem pro těch pár sekund provozu je pouze velký nabitý kondenzátor. A také, vzhledem k tomu, že programuji v ARDUINO Windows 10 jen nárazově, je pro mě i váš popis operací bohužel příliš všeobecný.
Děkuji za pomoc, mpcz, 01.08.2016

Nastavit Sleep Mode na Power-down, zakázat veškerá přerušení, deaktivovat všechny výstupy (= nastavit jako vstupní bez pull-up) a přepnout do Sleep módu. Co je na tom příliš všeobecného ? To je konkrétní sled operací, které uděláš po ukončení pulzu. Co je k tomu potřeba se dočteš v datasheetu.

Zdravím,
z mého pohledu amatéra (v tomto oboru) všechno. V běžné praxi jsem se s těmito operacemi nesetkal, nevím, jak je v IDE zadat.
Pokud se tyto operace provádí PO ukončení pulzu, znamená to, že po celou dobu těch cca 5 sec. bude odběr těch klasických 10 mA?
Děkuji, mpcz, 01.08.2016

Nevím, jaký odběr má mcu v aktivním stavu při 8 MHz a nevím, jaký napětím ho napájíš. V datasheetu píšou, že v aktivním režimu při 1 MHz a napětí 1,8V má odběr 300uA = 0,3mA. Z toho mi vyplývá, že při 5V by měl mít cca 0,8mA, při 8 Mhz kmitočtu to bude o něco víc, ale nedokážu říci kolik. Podle mně nebude odběr mcu hrát na celkový odběr tak velkou roli. Budu trošku hádat, protože jsi sem nedal zapojení : Podstatnější bude odběr proudu zařízením z pinu (NPN tranzistor potřebuje na otevření proud do báze, lepší je použít nějaký FET), pokud napájíš procesor přes 7805-ku, pak největším žroutem proudu bude právě ta 7805-ka. A na to, abys přepnul mcu do Sleep módu nebo využil časovače se musíš podívat do datasheetu. -UINO Ti v tomhle pomůže jenom zapsat hodnoty do registrů. Jaké hodnoty a kam je zapsat musíš najít v datasheetu. To ostatně platí pro programování mcu vždy a je zcela lhostejné, jestli použiješ nějaké -UINO nebo ne. To, že Tě -UINO odřízne od hardwaru je jenom záležitost knihoven. Napájíš-li MCU z nabitého kondenzátoru bez stabilizátoru, pak máš šanci s odběrem něco udělat. Jestli tam máš 7805-ku, pak ne.

Pokud chceš během těch 5 vteřin minimalizovat odběr, tak v žádném případě nesmíš použít delay_ms(5000);, protože v tomto případě je mcu celou dobu v aktivním režimu.

Nejlepší je použít jednu z následujících variant :

Použití timeru :

  1. po zapnutí mcu jsou všechny IO jako vstupy bez pull-up => nastav požadovaný pin jak potřebuješ.
  2. nastav čítač do režimu CTC tak, aby dočítal za 5 vteřin a vyvolal přerušení (obslužná rutina může zůstat prázdná)
  3. povol přerušení
  4. nastav Sleep mode na Idle
  5. povol a aktivuj Sleep mode (program se zastaví a mcu se uspí do okamžiku vyvolání přerušení od čítače)
  6. zastav čítač, zakaž přerušení
  7. nastav Sleep mode na Power-Down
  8. povol a aktivuj Sleep mode
  9. jdi na bod 7 - sem by se program už nikdy neměl dostat, ale jistota je jistota …

Tímto způsobem bude mcu během celé doby v aktivním režimu jen pár mikrosekund, zbytek času stráví v Idle, na konci přejde do Power-down. Pokud potřebuješ 5 sek. a ne jinak, musíš použít tento způsob. Nejdelší dosažitelný čas čítače pro 8 MHz mcu je cca 8,4 sek. Změnou prescaleru systémových hodin mcu se samozřejmě dá docílit i mnohem delších časů. Pokud použiješ prescaler 256, dostáváš se s Fmcu na 31250 Hz a dosažitelný čas timeru je pak cca 2147,5 sek.


Nejnižší možnou spotřebu docílíš použitím WatchDog timeru :

  1. po zapnutí mcu jsou všechny IO jako vstupy bez pull-up => nastav požadovaný pin jak potřebuješ.
  2. WatchDog timer na 4 sek (pak je až 8 sek.) a přepni ho tak, aby jen vyvolal přerušení a ne reset mcu
  3. povol přerušení
  4. nastav Sleep mode na Power-Down
  5. povol a aktivuj Sleep mode (program se zastaví a mcu se uspí do okamžiku vyvolání přerušení od WatchDog čítače)
  6. zastav čítač, zakaž přerušení
  7. nastav Sleep mode na Power-Down
  8. povol a aktivuj Sleep mode
  9. jdi na bod 7 - sem by se program už nikdy neměl dostat, ale jistota je jistota …

Tímto způsobem bude mcu během celé doby v aktivním režimu jen pár mikrosekund, zbytek času stráví v Power-down.
Dosažitelné časy najdeš v tabulce. Tento timer má své vlastní hodiny a nezáleží tedy na Fmcu.

A zapomeň na to, že když budeš používat -UINO, tak nepotřebuješ datasheety…

kľúčové bude, čo má byť tých pár sekúnd akltivované. LED? Motorček? Čo?
Ak to má byť tiež napájané z toho kondenzátoru, tak s pánom bohom :slight_smile:
Ako písal Balú, vlastná spotreba MCU bude najmenší problém.

Zdravím,
těch pět sekund není aktivované nic, jen ATTINA. Takže tam problém nevidím.
Proč by ten stabilizátor měl způsobit neprůchodnost řešení? Že L05 je dost žravý vím, ale existují jiné typy, které mají odběr řádově menší, snad se to s nimi podaří. Odzkouším, uvidím.
Samozřejmě oceňuji rozsáhlý popis od kolegy Balů, bohužel díky mým chabým znalostem mi to není moc platné.
Asi kromě bodu jedna to totiž neumím v IDE napsat. Přesto děkuji.
Našel jsem knihovnu narcoleptic.h, její použití sníží odběr ATMELu na potřebnou míru. Bohužel je natvrdo napsaná na 328-ku, tam to funguje, odběr je neměřitelný. Při použití na ATTINY to samozřejmě naháže spoustu chybových hlášek o chybějícím sériovém portu atd. Pokusím se to z kódu vyházet, snad to pojede. Popř. zkusím pohledat, jestli to někdo neupravil i pro TINu. Nebo tam ten 328 nechám místo TINy. Uvidíme.
mpcz, 01.08.2016

Netvrdil jsem, že stabilizátor způsobí neprůchodnost řešení. Jenom to, že s lineárním stabilizátorem nemusíš nijak významně řešit odběr mcu, protože stabilizátor bude mít vždy mnohem větší a neovlivnitelný odběr, než procesor jako takový. Chtěl jsem Tě navést na to, kam a do který části datasheetu se podívat. Nejsme tady neochotni pomoct, občas najít chybu v kódu, kousek kódu napsat/poskytnout apodobně, jenže musíme vidět snahu i z druhé strany a ne jenom “neumím, neznám, nejde”. To, že tvrdíš, že neumíš v IDE napsat REGISTR = HODNOTA svědčí o tom, že se prostě do datasheetu odmítáš podívat a radši budeš trávit mraky hodin prohledáváním Internetu, hledáním cizích řešení a lepením cizích kódů dohromady. Můžeš mi věřit, že tohle není cesta k tomu se něco naučit a donutit procesor “skákat, jak Ty pískáš”. Odtud pak plynou dotazy typu “Už dva dny hledám knihovnu pro rozblikání LEDky a nemůžu nic najít …”. Zapomeň na -UINO a ber ho jenom jako nějaký Cčko s určitou podporou. Jeho výhodou je možnost použít ho jako programátor. Mám externí programátor a programy píšu v AVR Studiu - assembler nebo Cčko - podle druhu aplikace. Veškeré knihovny, které používám jsem si psal sám a vím tudíž, co dělají a jak to dělají a není pro mně problém použít 6-nožičkový miniaturní ATtiny10 ani velký 64-nožičkový ATmega64/128. Nikdy jsem nebyl líný jít krok po kroku podle datasheetu a zkoušet, co to dělá. Jenže to už dneska poněkud není IN. Dneska letí -UINO a knihovny. Bez toho už mnozí nejsou schopní napsat jediný řádek programu… Například takový UART není jenom Serial.begin(BaudRate), ale nastavení a možností má víc. Jenže bez podívání se do datasheetu tohle z -UINA nezjistiš a nevyužiješ.

To je také vtipné.
5 sekúnd je aktivovaná iba ATtiina :slight_smile:
A čo robí? Ako sa “vidí”, že zariadenie žije? To nemá jeho aktivácia žiaden “viditeľný” dopad na okolie?

Tak v takom prípade najmenší odber dosiahneš, keď bude celé zariadenie odpojené od napájania :slight_smile:

Inak, viem sa podpísať pod všetko čo napísal Balu.
Ale chápem aj to, že rôzne -UINA nalákajú kde akých adeptov, ktorí by inak k MCU ani nečuchli a potom sa divia (ak vôbec zistia), že to nie je iba o predžutých knižniciach.

Je skvelé, že Ťa to baví. Je skvelé, že sa môžeš toho ešte veľa naučiť :slight_smile:

Zdravím,
tak jste se pánové vzájemně pochválili a jiné pokritizovali, jen si poslužte.
Moje krátká rada, pokud by někdo něco podobného řešil a neměl tolik času na studium manuálů a výuku C++ pro tento jeden, ojedinělý projekt:
Použijte HT stabilizátor pro regulaci napětí, má mnohem menší spotřebu, než 78L05. V Arduinu použijte knihovnu narcoleptic.h, použití je triviální. Ta zařídí minimalizaci spotřeby TINY na potřebnou míru.
V této kombinaci vykoná TINA potřebnou operaci = po zapnutí 5 sec. čeká a pak hodí impuls cca 1 sec. Kondenzátor 2G je schopen napájet tuto sestavu okolo 15 sec., rezerva je dostatečná. Co jsem potřeboval, obvod dělá. Na samotný závěr mě napadlo, zda by se to nedalo vyřešit i legendární 2x 555-kou.
mpcz, 02.08.2016

No vidíš, tak až teprve teďka jsi pořádně popsal, co má ta ATtina přesně dělat. Jinak použití časovače mě taky napadlo. Buď 2x 555 nebo 556 (což jsou 2 555-ky v jednom pouzdru). Jen ta 555-ka se neumí “vypnout” jako ATtina a má odběr trvalý. A s tou výukou Cčka (Arduino NENÍ C++) - pokud používáš k programování prostředí Arduina, pak Cčko používáš, tudíž šlo jenom o to nebýt líný a podívat se do datasheetu ATtiny (co tam konkrétně máš hledat jsem Ti psal). Práce pro začátečníka cca na 2 hodiny a když tady ukážeš snahu, tak není problém poradit a pomoct.

V každým případě Ti přeju hodně úspěchů a nenech se odradit. A hlavně - nespoléhej jenom na to, že na všechno, co potřebuješ najdeš na Internetu knihovny. Postupně začni pracovat také na vlastních řešeních. Věř mi že Ti to dá více a ve finále Ti to zabere daleko méně času, než strávit dlouhé dny hledáním něčeho, co můžeš mít za pár hodin napsané sám. Datasheetům se nevyhneš. Kontrolery programuju už dlouho, ale datasheety k mcu (a nejenom k nim) používám stále. Ne kvůli instrukční sadě. Tu v Cčku nepotřebuješ v podstatě vůbec (i když je dobré vědět, jaké má procesor možnosti a tudíž máš daleko větší šanci napsat program efektivně), ale právě kvůli tomu, abys věděl co nasypat do registrů, když to má dělat, co chceš/potřebuješ. Není důležité si pamatovat, co do kterého registru zapsat. Důležité je vědět, že to jde a kde najdeš, jak to udělat (datasheet). A samozřejmě potřebuješ datasheety k zařízením, které k mcu budeš připojovat (čidla, displeje, převodníky atd.), protože nikdo si nemůže pamatovat všechno. Je důležité vědět, kde se to dá najít. A v tomhle případě to jsou právě datasheety.

Zdravím,
po čase se vracím k tomuto tématu. Nároky vzrostly a je nutné použít MP.
Požadavek na spotřebu zůstává, max. 300 microA, raději co nejméně, po zapnutí delay cca 10 sec, pak impuls cca 1 sec na digivýstupu. Požadavky na přesnost minimální. Krásně to šlo na udělat na PIC i bez krystalu, (známý dodal PIC komplet hotový), ale Atmel jsem nezvládl, stále to leze v řádech mA.
Rád bych zůstal u ATTINY85, Arduino IDE, (nyní 1.8.5) a programátoru:
ispshop.cz/index.php?main_pa … d=attiny44
nebráním se ničemu jinému, pokud tato kombinace bude technicky nevyhovující.
Problém působí přepnutí ATTINY85 na 128kHz nebo i méně. ( Z důvodu očekávané menší spotřeby). Pokud se to podaří, (což neumím ověřit), nefunguje delay(), vypadá to, jako by se program na tomto příkazu zasekl a nejde dál. Kompilace a upload probíhá OK. Prodloužení času při dalay() oproti standardnímu CLK jsem si vědom. Mód uspání nelze použít.
Jen pro úplnost podotýkám, že programování není mým hlavním zájmem, ani očekávanou předností, tento miniprojekt je pouze nutným malým doplňkem k něčemu jinému.
Děkuji za případnou radu.
mpcz, 03.oct.2017

Ahoj,
proč by jako nešlo uspání, pokud to uděláš podle instrukcí Balů, není problém dát za sebe tu 4-5s čekačku ve sleep modu X krát - prostě jen zopakuješ body 2-5, u toho čítače si dokonce můžeš ty časy nastavit celkem přesně klidně třeba 2x 4s + 1x 2s = 10s (nebo 8s + 2s).

Děkuji za reakci. V prvé řadě musím začít přepnutím ATMELu HNED po startu do low power módu. To umí jen některé, jak jsem zjistil. Max. odběr nesmí NIKDY překročit cca 300 mikroA. U PICu jsem to dotáhl na 20 mikroA, vše funguje OK.
To se mi u TINY85 nějak nedaří. Zatím jsem na 2-3 mA. Pomohl by osvědčený postup nebo alespoň info, že to vůbec někomu šlo. Vzhledem k mým chabým zkušenostem by bylo ideální .ino, které tím mým programátorem zkompiluji v 1.8.5 s podporou TINY a pošlu do MPU, ten mám zatím na zkušební destičce.
Děkuji za případné info.
mpcz, 03.oct.2017

Vidím, že jsi se ani za rok příliš s datasheetem nezabýval… No nic - hodím Ti sem kód z AVR Studia. Uino si kvůli Tobě opravdu instalovat nebudu, do uina si to přepiš sám. Předpokládám, že CTRL-Cizí → CTRL-Vlastní umíš a přežvýkat to tak, aby to uino zkouslo zvládneš. Druhá možnost je nainstalovat si AVR Studio, zkompilovat to v něm a uino použít jenom jako programátor. Kód je odzkoušený pouze v simulátoru AVR Studia, ale šlapat by měl tak, jak jsi psal : Po zapnutí 10s pauza, pak 1s impulz a po něm Power-down sleep až do nového zapnutí. Výstup je na pinu B0 a pull-up nebo pull-down si u něj musíš ošetřit externím odporem. U ostatních jsou aktivované pull-upy - proč to tak je se dočteš v datasheetu. A abys neřek, tak jsem přiložil i zkompilovaný HEX. Můžeš to porovnat s těma “obecnýma” bodama, které jsem Ti psal v předchozích příspěvcích.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

ISR(TIM0_COMPA_vect, ISR_NAKED)
{
    reti();
}


int main()
{
// Prepnuti vystupu do neaktivniho rezimu
    PORTB = 0xFE;
    DDRB = 0;

// Prepnuti systemovych hodin na 31,25 kHz
    CLKPR = (1<<CLKPCE);
    CLKPR = (1<<CLKPS3);

// Nastaveni casovace na 5 sekund
    OCR0A = 152;
    TIMSK = (1<<OCIE0A);

// Povolit preruseni
    sei();

// Spustit casovac
    TCCR0A = (1<<WGM01);
    TCCR0B = (1<<CS02)|(1<<CS00);

// Aktivovat IDLE SLEEP MODE
    set_sleep_mode(SLEEP_MODE_IDLE);
    sleep_mode();   // 5 sekund poprve
    sleep_mode();   // 5 sekund podruhe

// Nastaveni casovace na 1 sekundu
    OCR0A = 30;

// Aktivovat vystup na B0
    PORTB |= 0x01;
    DDRB |= 0x01;

// Aktivovat IDLE SLEEP MODE
    sleep_mode();   // 1 sekunda

// Deaktivovat vystupy
    PORTB &= ~0x01;
    DDRB &= ~0x01;

// Zastavit casovac
    TCCR0B = (0<<CS02)|(1<<CS00);
    TCCR0A = (0<<WGM01);

// Zakazat preruseni
    cli();

// Aktivovat POWERDOWN SLEEP MODE
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    while (1)
    {
        sleep_mode();   // Sleep az do vypnuti
    }
}

Kompilováno v AVR Studio 4.19 + WinAVR.
mpcz.hex (500 Bytes)

Tady je pěkně popsaný postup při snižování odběru:
sites.google.com/site/dannychou … /low-power

Zdravím,
to Balů, AB: nějak jsem odpovědi přehléhl, děkuji za detailní popis postupu, určitě zabral kus času a práce.
Část z toho určitě použiji, jen jsem asi málo zdůraznil, že sleep mode nechci / nelze použít, v plánu jsou i další činnosti. Postupem času, po odladění zkusím přejít na "menší a levnější " TINU. Teď nechci bojovat s prostorem.

  • Lze snížit frekvenci na minimum, přesnost není postatná.
  • Lze povypínat vše nepotřebné, zůstat musí DIGI IN a DIGI OUT.
  • Po přepnutí frekvence musí jít TINA znovu programovat, při nějakých pokusech mi pár kusů umřelo a již nejdou naprogramovat, netuším proč, ale zničené dle mého nejsou. (Je nějaký zaručený oživovací proces?).
    Stabilizátor 3,3V jsem dostal od kolegů z Číny, je to malý prcek, odebírá 2 microA do země z 12V i při napájení TINY85, takže to slabé místo nebude. Na PICU jsem se dostal poměrně rychle na 15 microA při chodu, všechno funguje, snad se to podaří i na ATMELU osekání žravých modulů.
    Ten ATMEL je pro pololaiky velmi dobrý pro možnost programování v ARDUINO IDE, to chci zachovat. HEX exportovaný z IDE už uploadovat není tak velký problém - mám odzkoušený USBASP.
    mpcz, 14.oct.2017

A neodporuješ si tak nějak trochu ?

Pokud potřebuješ co nejnižší spotřebu a k tomu ještě i něco dělat, pak se bez sleep módu neobejdeš. Samozřejmě nelze použít PowerDown, ale musíš použít Idle, aby zůstaly v provozu časovače a pomocí přerušení od časovače, případně od jiných přerušení (nemusí jít jenom o časovač), provádět cyklicky činnost, kterou potřebuješ. Použití delay je cesta do pekel. Sleep mód používám ve všech svých programech, ale při delších operacích (například stiskem tlačítka nahodit hranu, počkat 10ms, shodit) je třeba použít flagy pro jednotlivé části operace.

Například :

Procesor je ve sleep módu a timer ho budí každých 100us.

  1. krok - kontrola tlačítka
  2. krok - nahodím hranu a nastavím CountDownPuls na 100.
  3. krok - Po aktivaci FlagPuls hranu shodím.

Čítač každých 100us udělá následující :
Zkontrolovat, jestli je CountDownPuls > 0
Pokud ano, odečíst 1 od CountDownPuls a pokud jsem právě dočítal na 0, nastavit FlagPuls na TRUE.

Provedení :

[code]
.
.
.

Interrupt Timer/Counter
{
if (CountDownPuls > 0)
{
if (–CountDownPuls == 0) FlagPuls = TRUE;
}
}

.
.
.
.

main
{
InicializaceProcesoru;
NastaveniTimeru;
.
.
.
set_sleep_mode(SLEEP_MODE_IDLE);
.
.
.
while(1)
{
sleep_mode();
if ((Tlacitko == AKTIVNI) && (TlacitkoMinule == NEAKTIVNI))
{
Vystup = TRUE;
CountDownPuls = 100;
}
if (FlagPuls = TRUE)
{
FlagPuls = FALSE;
Vystup = FALSE;
}
TlacitkoMinule = Tlacitko;
}
}[/code]

Když to navíc zkombinuješ s informacema z odkazu, co psal AB výše. Zapomeň na delay, během delay je procesor trvale v plně aktivním režimu.

Zdravím,
děkuji za odpověď, cením si její obšírnosti.
Zkusil jsem nahrát vytvořený HEX od kolegy Balů do TINY85, verze sleep, vše proběhlo OK, až na:
TINA85 odebírá 50 microA, což je více, než PIC v “plném” provozu. Zde je asi nějaká chybka, klidně i u mě. Podle odkazu výše by se měla TINA dostat až na cca 7,2 microA (v chodu), pokud jsem to pochopil správně. Ten postup na sražení spotřeby verze 7,2 microA z odkazu
sites.google.com/site/dannychou … /low-power
jsem použil, spotřeba byla ovšem okolo 200 microA.
Upload skrzevá AVRdude 5.8 proběhl OK, opakovaný upload se však již nedařil, TINA byla mrtvá. To se naštěstí vyřešilo HV resetem. Možná někdo umí nastavit AVRdude tak, aby uploadoval i do TINY s mini frekvencí, já jsem to nikde nenašel.
mpcz, 14.oct.2017
p.s. možná si v něčem odporuji, (i když si toho vědom nejsem), to bude asi tím delším časovým úsekem, kdy se na spoustu nových vlivů okolí ještě přijde