ATtiny85 - Blik (76 bajtov)

Zápisník experimentátora

Hierarchy: ATtiny85

Pred niekoľkými rokmi som napísal článok ATtiny85 - Blik. Vtedy som napísal niekoľko príkladov a najmenší z programov mal po skompilovaní dĺžku 468 bajtov. Teraz si ukážeme program, ktorý sa správa rovnako a má len 76 bajtov. Poďme si tento 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ýstupných pinov mikrokontroléra. Na pin je pripojená LED s rezistorom a táto LED v pravidelných intervaloch bliká.

Typický blik

Pre Arduino (a všetky rôzne klony) sa tento program objavuje na tisíckach stránok v prakticky nezmenenom tvare, ktorý je uvedený v nasledujúcom príklade. Pre ATtiny85 je potrebné urobiť iba zmenu v zdrojovom kóde a nastaviť výstupný pin z čísla 13 na niektorý pin, ktorý tento miniatúrny mikrokontrolér obsahuje. Obvykle je to pin 0. V programe sa používa typický kód pre ovládanie výstupného pinu. Vybraný pin sa nastavi ako výstup a potom sa stále dookola pin prepne na hodnotu HIGH alebo LOW a pomocou funkcie delay sa počká niekoľko milisekúnd, aby bolo blikanie viditeľné. Zdrojový kód má po skompilovaní s IDE 1.8.12 a jadre ATTinyCore 1.1.5 veľkosť 880 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.
  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
}

Optimalizovaný program blik

Ak prepíšeme tento kód podľa nasledujúceho príkladu, po skompilovaní bude veľkosť programu 76 bajtov. Ako som to dosiahol? Ak si preštudujete zdrojový kód, vidíte, že sa skoro vôbec nepodobá na pôvodný zdrojový kód. Úplne zmizli funkcie setup a loop a nahradila ich jediná funkcia main. Táto zdanlivo malá zmena má ale veľké dôsledky. Tým, že sme odstránili zo zdrojového kódu všetky funkcie jadra ATTinyCore, kompilátor automaticky zredukoval veľkosť výsledného kódu. Používa sa funkcia _delay_ms, ktorá je naprogramovaná ako niekoľko inštrukcií v assembleri. Je úspornejšia než obvykle používaná funkcia delay. Presná je len do 262 ms, potom sa automaticky prepne na menej presný variant. Na účely nášho programu je to dostatočné.

Posledná dôležitá zmena je v použití funkcie main. Naša funkcia nahradí inú funkciu a úplne vypne úvodné inicializácie systémových registrov, ktoré sa obvykle pri štarte Arduina vykonajú. Výsledkom je úspora kódu, ale žiaden register nie je nastavený, takže si na to treba dať pozor, ak by ste chceli používať niektoré ďalšie funkcie, ktoré sú na nastavení registrov závislé. Príklad originálnej funkcie main nájdete v nasledujúcej kapitole.

#include <util/delay.h>

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

int main() {
  // initialize the digital pin as an output.
  bitSet(DDRB, led);
  for (;;) {
    bitSet(PINB, led);
    _delay_ms(sleep);
  }
}

ATTinyCore funkcia main

Takto vyzerá originálna funkcia main v jadre ATTinyCore. Volá funkciu init, ktorá vykoná veľa rôznych nastavení registrov. Daňou za to je ale zväčšenie veľkosti výsledného programu po skompilovaní.

#include <WProgram.h>

int main(void)
{
    init();

    setup();
    
    for (;;)
        loop();
        
    return 0;
}

Zdrojový kód

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



Video



10.02.2021


Menu