ATtiny85 - Blik

Zápisník experimentátora

Hierarchy: ATtiny85

Naše dieťa malo nedávno dva roky a jeho najobľúbenejšie slová sú auto a blik. Poďme si takýto blik vyrobiť pomocou mikrokontroléra ATtiny85. Program Blik je najzákladnejším programom pre Arduino, na ktorom sa naučíte základy ovládania vývodov z mikrokontroléra. V tomto článku si preberieme tieto základy a pridáme k nim aj čosi navyše.

Blik - klasika

Jednoduchý príklad basic-blink.ino, ktorý bliká LED diódou každú sekundu na pine 0. Pin 0 je nastavený ako výstup, ktorý je jednu sekundu v stave logickej jednotky a jednu sekundu v stave logickej nuly. Pretože máme na výstup pripojenú LED diódu s rezistorom, budeme vidieť logickú jednotku ako svietiacu LED diódu a logickú nulu ako vypnutú LED diódu.

Bude to tak preto, lebo nastavenie logickej jednotky nastaví na pine napätie blízke napájaciemu napätiu Vcc. Prúd bude tiecť z pinu do rezistora a cez LED diódu na GND. V prípade logickej nuly bude na pine napätie blízke GND a preto nebude cez LED diódu tiecť žiaden prúd. Hodnota rezistora sa stanovuje tak, aby ste neprekročili maximálny prúd na pine. Presnú hodnotu si môžete nájsť v datasheete v časti Absolute Maximum Ratings. Pre ATtiny85 je maximum 40 mA. Na rozsvietenie LED diódy toľko nepotrebujeme a preto použijeme rezistor 1k a modrú LED diódu. Nemusíte sa trápiť s tým, prečo som použil práve takéto hodnoty. Zapamätajte si, že to na tento typ experimentov stačí a že je to ďaleko pod povoleným limitom.

Príklad síce nepredstavuje nič objavné, ale pri vývoji niektorých obvodov aj takéto jednoduché zapojenie uľahčí život. Ak sa pozrieme bližšie na preložený program, zistíme, že má síce iba pár riadkov, ale zaberá 898 bajtov (IDE 1.8.5). Je jasné, že je v tom skrytá aj réžia na spustenie programu a nejaké nastavenie, ktoré je pred nami vďaka Arduinu skryté, ale aj tak sa to javí byť dosť v porovnaní s celkovým množstvom cca 8000 bajtov, ktoré máme k dispozícii. Dá sa s tým niečo urobiť? Možné riešenie nájdete v nasledujúcej 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 - úsporne

V predchádzajúcej kapitole sme blikali LED diódou a spotrebovali sme na jednoduché blikanie 10% dostupnej pamäte. Teraz použijeme program basic-blink-pin.ino. Po jeho preložení zistíte, že zaberá 468 bajtov. Rozdiel je 430 bajtov.

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);
}

Rozdiely:

  • Nahradil som funkciu pinMode za priamu manipuláciu portu.
  • Nahradil som viacnásobné volanie digitalWrite za priamu manipuláciu na porte. Okrem toho som využil, že v mikrokontroléri možno zápisom bitu na port PINx dosiahnuť negáciu HIGH alebo LOW, čím som ušetril tiež trochu miesta.
  • Mohol by som ešte optimalizovať volanie funkcie delay, ale to už by neprinieslo výrazný efekt.

Na príkladoch som chcel ukázať, že keď je to potrebné, máme priestor na skracovanie kódu. Pochopiteľne treba používať zdravý sedliacky a rozum a používať to len vtedy, keď to má zmysel. Treba si uvedomiť, že:

  • V mikrokontroléri váš kód nik nevidí a teda ho nemá kto obdivovať. Zato vidia výsledok jeho práce a ak bude chyba tam, niekto vám to oplieska o hlavu.
  • Prehľadnosť a pochopiteľnosť druhého zápisu je výrazne nižšia.
  • Koľko mi asi tak môže trvať, kým celý program prepíšem do nízkoúrovňových operácií a koľko chýb tam môžem narobiť?
  • V mikrokontroléri sa váš kód nedelí o priestor so žiadnym iným kódom. Všetok priestor je len pre vás. Tak ho využite. A keď je už mikrokontrolér zabudovaný v obvode, ostane tam pracovať naveky, alebo do času kedy sa vaše dielo užívateľovi zunuje, alebo kým ho nejaký elektrický problém nepošle na večný odpočinok.

Programovanie

Aby ste mohli mikrokontrolér naprogramovať, potrebujete mať:

Programujete pomocou Arduina, alebo cez USBasp.

Obvod môžete zapojiť na breadboarde, alebo si na to poskladáte vlastnú vývojovú dosku, ktorá vám ušetrí veľa práce pri opakovanom zapájaní obvodu.

Výpočet rezistora pre LED diódu

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

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.

Aktualizácia 02/2021

Po niekoľkých rokoch som skontroloval, či kód stále funguje aj pre IDE 1.8.12. Oba programy pracujú spoľahlivo. Zmenila sa len veľkosť skompilovaného kódu v prvom príklade. Kód má teraz len 880 bajtov. Veľkosť druhého kódu ostala nezmenená. Z toho, že sa trochu zmenšila veľkosť skompilovaného kódu môžeme usúdiť, že došlo alebo k vylepšeniu kompilátora, alebo je Arduino jadro lepšie navrhnuté a spotrebuje trochu menej pamäte.



Video



21.12.2017


Menu