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

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…