ATtiny85 - Blik

Zápisník experimentátora

Hierarchy: ATtiny85

Naše dítě mělo nedávno dva roky a jeho nejoblíbenější slova jsou auto a blik. Pojďme si takovýto blik vyrobit pomocí mikrokontroléru ATtiny85. Program Blik je nejzákladnějším programem pro Arduino, na kterém se naučíte základy ovládání vývodů z mikrokontroléru. V tomto článku si probereme tyto základy a přidáme k nim i cosi navíc.

Blik - klasika

Jednoduchý příklad basic-blink.ino, který bliká LED diodou každou sekundu na pinu 0. Pin 0 je nastaven jako výstup, který je jednu sekundu ve stavu logické jednotky a jednu sekundu ve stavu logické nuly. Protože máme na výstup připojenou LED diodu s rezistorem, budeme vidět logickou jednotku jako svítící LED diodu a logickou nulu jako vypnutou LED diodu.

Bude to tak proto, že nastavení logické jednotky nastaví na pinu napětí blízké napájecímu napětí Vcc. Proud bude téct z pinu do rezistoru a přes LED diodu na GND. V případě logické nuly bude na pinu napětí blízké GND a proto nebude přes LED diodu téct žádný proud. Hodnota rezistoru se stanoví tak, abyste nepřekročili maximální proud na pinu. Přesnou hodnotu si můžete najít v datasheetu v části Absolute Maximum Ratings. Pro ATtiny85 je maximum 40 mA. Na rozsvícení LED diody tolik nepotřebujeme a proto použijeme rezistor 1k a modrou LED diodu. Nemusíte se trápit s tím, proč jsem použil právě takové hodnoty. Zapamatujte si, že to na tento typ experimentů stačí a že je to daleko pod povoleným limitem.

Příklad sice nepředstavuje nic objevné, ale při vývoji některých obvodů i takové jednoduché zapojení usnadní život. Pokud se podíváme blíže na přeložen program, zjistíme, že má sice jen pár řádků, ale zabírá 898 bajtů (IDE 1.8.5). Je jasné, že je v tom skrytá i režie na spuštění programu a nějaké nastavení, které je před námi díky Arduinu skryté, ale i tak se to jeví být dost v porovnání s celkovým množstvím cca 8000 bajtů, které máme k dispozici. Dá se s tím něco udělat? Možné řešení najdete v následující kapitole.

const int led = 0;
const int sleep = 1000;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever
void loop() {
  digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
  delay(sleep);            // wait for a second
  digitalWrite(led, LOW);  // turn the LED off by making the voltage LOW
  delay(sleep);            // wait for a second
}

Blik - úsporně

V předchozí kapitole jsme blikali LED diodou a spotřebovali jsme na jednoduché blikání 10% dostupné paměti. Nyní použijeme program basic-blink-pin.ino. Po jeho přeložení zjistíte, že zabírá 468 bajtů. Rozdíl je 430 bajtů.

const int led = 0;
const int sleep = 1000;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  bitSet(DDRB, led);
}

// the loop routine runs over and over again forever
void loop() {
  bitSet(PINB, led);
  delay(sleep);
}

Rozdíly:

  • Nahradil jsem funkci pinMode za přímou manipulaci portu.
  • Nahradil jsem vícenásobné volání digitalWrite za přímou manipulaci na portu. Kromě toho jsem využil, že v mikrokontroléru lze zápisem bitu na port PINx dosáhnout negaci HIGH nebo LOW, čímž jsem ušetřil také trochu místa.
  • Mohl bych ještě optimalizovat volání funkce delay, ale to už by nepřineslo výrazný efekt.

Na příkladech jsem chtěl ukázat, že když je to potřeba, máme prostor na zkracování kódu. Pochopitelně je třeba používat zdravý selský a rozum a používat to jen tehdy, když to má smysl. Je třeba si uvědomit, že:

  • V mikrokontroléru váš kód nikdo nevidí a tudíž ho nemá kdo obdivovat. Zato vidí výsledek jeho práce a bude-li chyba tam, někdo vám to opleskne o hlavu.
  • Přehlednost a srozumitelnost druhého zápisu je výrazně nižší.
  • Kolik mi asi tak může trvat, než celý program přepíšu do nízkoúrovňových operací a kolik chyb tam mohu nadělat?
  • V mikrokontroléru se váš kód nedělí o prostor s žádným jiným kódem. Veškerý prostor je jen pro vás. Tak ho využijte. A když je už mikrokontrolér zabudovaný v obvodu, zůstane tam pracovat navěky, nebo do doby kdy se vaše dílo uživateli omrzí, nebo dokud ho nějaký elektrický problém nepošle na věčný odpočinek.

Programování

Abyste mohli mikrokontrolér naprogramovat, potřebujete mít:

Programujete pomocí Arduina, nebo přes USBasp.

Obvod můžete zapojit na nepájivém poli, nebo si na to poskládáte vlastní vývojovou desku, která vám ušetří spoustu práce při opakovaném zapojování obvodu.

Výpočet rezistoru pre LED diódu

Vzorec na výpočet rezistoru je R = (Usrc - ULED) / I.

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.

Aktualizace 02/2021 

Po několika letech jsem zkontroloval, zda kód stále funguje i pro IDE 1.8.12. Oba programy pracují spolehlivě. Změnila se jen velikost zkompilovaného kódu v prvním příkladu. Kód má nyní jen 880 bajtů. Velikost druhého kódu zůstala nezměněna. Z toho, že se trochu zmenšila velikost zkompilovaného kódu můžeme usoudit, že došlo nebo k vylepšení kompilátoru, nebo je Arduino jádro lépe navrženo a spotřebuje trochu méně paměti.



Video



09.02.2021


Menu