SAM D10 Xplained Mini - 01 Onboard button and LED

Zápisník experimentátora

Hierarchy: SAM D10 Xplained Mini

V tomto článku upravíme pôvodný vzorový projekt do podoby, ktorá viac vyhovuje užívateľovi Arduina. Množstvo nič nehovoriacich definícií nahradíme za ľahšie pochopiteľné funkcie. Upravíme aj štruktúru programu tak, aby viac pripomínal Arduino.

Súbory

V projekte budú použité nasledovné súbory:

  • main.c - Hlavný program.
  • arduino.h - Deklarácie funkcií.
  • arduino.c - Telá funkcií.

main.c

Funkcia system_init() je generovaná a nemôžeme ju odstrániť, ak chceme, aby fungovali interné tlačidlo a LED.

Za ňu som doplnil funkciu rurInit(), čo je funkcia, ktorá nám umožní inicializovať si vlastné periférie. V tomto prípade nebude robiť nič, ale využijeme ju v neskorších pokračovaniach. Zámerne som použil iný názov funkcie než zaužívaný init, aby sme si uvedomili, že v Arduine je dvojica funkcii init a loop iba výsledkom rozhodnutia vývojárov a aj keď to na prvý pohľad nevidno, niekde v pozadí je ukrytá aj funkcia main.

Okrem toho sa tam nachádza nekonečná slučka, ktorá volá funkciu rurLoop. Vďaka tomu sa program nikdy neskončí, čo je typické správanie v prípade mikrokontrolérov.

#include <asf.h>
#include "arduino.h"

int main (void)
{
system_init();
rurInit();
while(1)
  rurLoop();
}

arduino.h

V tomto hlavičkovom súbore sa nachádzajú definície všetkých funkcií nášho programu. V programe Atmel Studio ich musíme používať. Kto sa s tým ešte nestretol, je to pohodlný spôsob v c++, ako formálne definovať funkcie, aby boli známe aj počas kompilácie ostatných súborov zdrojových textov. Počas kompilácie to kompilátoru stačí, pretože dostane informáciu o všetkých parametroch a návratových hodnotách. Na konci kompilácie to linker spojí všetko dokopy a dostaneme výsledný program, ktorý sa nahrá do mikrokontroléra. Pre užívateľa Arduina to môže byť trošku prekvapujúce, ale je to len ďalšia vec, kde mu IDE Arduina trošku uľahčuje prácu.

void rurInit(void);
void rurLoop(void);
bool isOnboardButton(void);
void digitalWriteOnboardLed(bool value);

arduino.c

Celý program sa nachádza v tomto súbore. Obsah funkcie rurLoop() je samovysvetľujúci. Ak je tlačidlo stlačené, svieti aj LED. Ak je nestlačené, LED nesvieti.

Funkcie isOnboardButton() a digitalWriteOnboardLed(bool) obsahujú všetok pôvodný kód, ktorý je pre smrteľníka tažko zapamätateľný.

///
/// Local setup
///
void rurInit(void)
{
//struct port_config pin_conf;
//port_get_config_defaults(&pin_conf);
}

///
/// Main loop
///
void rurLoop(void)
{
if(isOnboardButton())  
  digitalWriteOnboardLed(true);
else
  digitalWriteOnboardLed(false);
}

///
/// Onboard button
///
bool isOnboardButton(void)
{
return port_pin_get_input_level(BUTTON_0_PIN) == BUTTON_0_ACTIVE;
}

///
/// Onboard LED on/off
///
void digitalWriteOnboardLed(bool value)
{
port_pin_set_output_level(LED_0_PIN, value ? (LED_0_ACTIVE) : (!LED_0_ACTIVE));
}


Download

02.02.2016


Menu