Zápisník experimentátora
Hierarchy: SAM D10 Xplained Mini
Úvodné oboznámenie sa s vývojovou doskou SAM D10 Xplained Mini. Doska umožňuje otestovať možnosti 32-bitového mikrokontroléra ATSAMD10. Oboznámime sa s možnosťami dosky a vygenerujeme si základný projekt.
Doska sa pripája k počítaču cez USB konektor. Je to ten istý typ, ktorý je aj na mobilných telefónoch. Jeden USB kábel je aj pribalený ku doske.
Komunikáciu s programom Atmel Studio zabezpečuje ten väčší mikrokontrolér, ktorý obsahuje mEDBG program. Pomocou neho je možné ATSAMD10 programovať a debuggovať. V skutočnosti je to ATmega32U4, ktorý je použitý na niektorých doskách Arduino.
Malý mikrokontrolér v strede je ATSAMD10. Jeho piny sú pripojené na otvory pre odlamovacie lišty, ktoré dodržujú rozmiestnenie pinov na klasickom Arduino Uno. Pozor na to, že mikrokontrolér pracuje na 3,3 V.
Na doske sa nachádzajú ešte tri periférie:
Podrobnosti o doske sa možno dozvedieť na jej domovskej stránke. Nachádza sa na nej aj manuál so základným návodom. K dispozícii je aj schéma dosky.
V programe Atmel Studio 7.0 si projekt ku doske vygenerujeme nasledovne:
Vygenerovaný projekt sa skladá z množstva súborov, preto sa v tomto úvodnom článku zameriame na popis jednotlivých súborov, ktoré sú pre nás doležité.
Toto je úvodný súbor s funkciou main. Vidíme, že na začiatku sa volá funkcia system_init, ktorej úlohou je nastaviť všetky periférie dosky tak, ako sa nachádzajú zapojené na plošnom spoji. Funkcia sa nachádza v súbore system.c.
Nasleduje samotný program, ktorý podľa toho, či je tlačidlo stlačené, zapína alebo vypína LED na doske. Vidíme použitie niekoľkých funkcií s dlhými názvami a niekoľkých konštánt, ktoré sú uvedené veľkými písmenami. Konštanty sú definované v súbore samd10_xplained_mini.h.
#include <asf.h>
int main (void)
{
system_init();
/* Insert application code here, after the board has been initialized. */
/* This skeleton code simply sets the LED to the state of the button. */
while (1) {
/* Is button pressed? */
if (port_pin_get_input_level(BUTTON_0_PIN) == BUTTON_0_ACTIVE) {
/* Yes, so turn LED on. */
port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
} else {
/* No, so turn LED off. */
port_pin_set_output_level(LED_0_PIN, !LED_0_ACTIVE);
}
}
}
Funkcia system_init je určená len na to, aby pospúšťala iné inicializačné funkcie. Funkcia system_clock_init je v súbore clock.c a nastavuje hodiny na doske. Funkcia system_board_init je v súbore board_init.c a nastavuje periférie na doske. Ostatné funkcie nie sú pre naše pochopenie dôležité.
void system_init(void)
{
/* Configure GCLK and clock sources according to conf_clocks.h */
system_clock_init();
/* Initialize board hardware */
system_board_init();
/* Initialize EVSYS hardware */
_system_events_init();
/* Initialize External hardware */
_system_extint_init();
/* Initialize DIVAS hardware */
_system_divas_init();
}
Tento súbor nemusíme extrémne rozpitvávať. Stačí nám vedieť, že využíva súbor conf_clocks.h, ktorý obsahuje preddefinované nastavenie hodín podľa zapojenia na doske.
V tomto súbore sa nachádza obrovské množstvo definícií, ktoré nastavujú hodiny. Implicitne je to nastavené podľa dosky, ale nič nám nebráni experimentovať s nastaveniami a nastaviť to podľa seba. Treba ale vedieť, čo jednotlivé definície znamenajú a aká je vnútorná stavba hodín v mikrokontroléri. Náhodnými zmenami nedosiahnete nič.
V tomto súbore sa konfigurujú piny v mikrokontroléri tak, ako sú na doske k jednotlivým pinom pripojené tlačidlá a LED. Podobným spôsobom si môžete nastaviť aj vlastné piny, ktoré máte vyvedené na doske.
void system_board_init(void)
{
struct port_config pin_conf;
port_get_config_defaults(&pin_conf);
/* Configure LEDs as outputs, turn them off */
pin_conf.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(LED_0_PIN, &pin_conf);
port_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
/* Set buttons as inputs */
pin_conf.direction = PORT_PIN_DIR_INPUT;
pin_conf.input_pull = PORT_PIN_PULL_UP;
port_pin_set_config(BUTTON_0_PIN, &pin_conf);
}
Vybral som iba niekoľko podstatných definícií zo súboru. Vybral som len tie, ktoré sú používané v kóde funkcií system_board_init a main.
#define LED0_PIN PIN_PA09
#define LED0_ACTIVE true
#define LED0_INACTIVE !LED0_ACTIVE
#define SW0_PIN PIN_PA25
#define SW0_ACTIVE false
#define SW0_INACTIVE !SW0_ACTIVE
#define LED_0_PIN LED0_PIN
#define BUTTON_0_PIN SW0_PIN
Vidíte, že základný projekt pre 32-bitové mikrokontroléry, ktorý vygeneruje program Atmel Studio je dosť zložity, ale po bližšom skúmaní to má svoju logiku. Ak by ste si nechali vygenerovať projekty pre iné Xplained dosky, videli by ste, že tento základný princíp je zachovaný a že sa menia iba definície.
Vo videu je popísaná doska a je v ňom vidno aj program, ktorý sa dá stiahnuť na tejto stránke.
30.10.2015