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

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.