\chapter{Teoretická čast študentskej práce}

\subsection{Základná koncepcia konštrukcie\cite{sem}}
Prípravok je určený najmä na testovanie funkčnosti periférií z výukového kitu. Zároveň má byť rozšíriteľné na úlohu automatizovaného testovania pre software. Táto skutočnosť musí byť braná v úvahu od začiatku procesu návrhu dosky plošného spoja.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/Modularita}
  \end{center}
  \caption{Modularita riešenia}
  \label{fig:mod}
\end{figure}

Z praktických dôvodov je dobré voliť modulárny design. Spôsob akým je modularita rozvrhnutá je znázornení na ukážke \ref{fig:mod}, prípravok samotný zabezpečuje prepojenia modulov, ochrany a ovládacie prvky. Oddelenie systémového jadra umožňuje zmenu riadiacej platformy bez nutnosti upravovať samotný PCB prípravku. Systémové jadro plní úlohu testovania a ovládania prípravku, môže to byť mikrokontrolérový obvod, alebo iné embedded riešenie. Prípravok obsahuje v sebe konektorové sloty na jednotlivé testované periférie. Slot pre modul LCD displeju je zároveň aj slotom pre vývojový kit, zapojenie vývojového kitu umožňuje využiť prípravok aj na testovanie funkčností programu vývojového kitu. To otvorí možnosti v automatizácií testovania výukových zadaní.

\section{Štruktúra testovacej úlohy \cite{sem}}
Úloha testovania a jej realizácia musí byť praktická pre koncového užívateľa. Testy je vhodné rozdeliť na jednotkové procedúry, z ktorých každá overuje nedeliteľnú funkcionalitu, alebo funkcionalitu prakticky nedeliteľnú. Napríklad u kláves a tlačidiel sa dá takto ich funkcionalita rozdeliť na tri testy:
\begin{itemize}
\item Otestovanie prítomnosti správnej logickej úrovne na vstupe pre stlačené tlačidlo.
\item Otestovanie absencie zmeny logickej úrovne na vstupoch nestlačených tlačidiel.
\item Otestovanie doby \textit{bouncingu} pri stlačení a uvoľnení tlačidla.
\end{itemize}
Cieľom užívateľa je zistiť či testované zariadenie prešlo úspešne všetkými testami, to je primárna úloha prípravku. Ak zariadenie neprešlo všetkými testami, tak zistiť ktorými jednotlivými testami prešlo a ktoré z nich zlyhali je druhotná úloha zariadenia. Predpokladá sa, že vo väčšine prípadov budú zariadenia prechádzať testami a prípadné zisťovanie podrobností o zariadeniach ktoré testom neprešli, má menšiu prioritu čo sa týka rýchlosti a užívateľskej príhodnosti.

Z praktických dôvodov je vhodné, aby zariadenie vykonávalo svoju primárnu úlohu s minimálnym zásahom užívateľa. Musí byť možné testovať zariadenia jednotlivo bez vzájomných závislostí. Zároveň túto primárnu funkcionalitu by malo byť možné vykonať bez nutnosti pripojenia virtuálneho sériového portu, ktorý by pre túto funkcionalitu bol nadbytočný. Vhodný spôsob ako prípravok ovládať za účelom využívania jeho primárnej funkcionality je priradiť ovládacie a indikačné prvky naň. Matica tlačidiel sa javí ako efektívny spôsob na ovládanie spúšťaniu testov zariadení, čo sa hodí ale v prípade že sú zariadenie testované jedno po druhom. V prípade že úloha testovania je určená skôr na testovanie celej sady modulov naraz, je vhodnejšie spustiť testy naraz jedným tlačidlom. Tlačidlo je možné nahradiť dokonca aj iným modulom a tak prípravok môže ušetriť ďalší pin.

 Indikáciu úspešnosti je vhodné vykonávať LED indikátorom, ktorý indikuje úspešnosť testu. Jeho výstup bude ukazovať výsledok posledného testu a indikátor zmení svoj výstup začiatkom vykonávania testu. Takéto ovládanie je praktické pre vykonávanie primárnej úlohy zariadenia. 

Druhotná úloha zariadenia vyžaduje komplikovanejšie komunikačné rozhranie. Vhodným kandidátom je virtuálna sériová linka, tá by slúžila ako výstup pre detailné informácie z jednotlivých vstupov. Zariadenie môže vykonávať svoju primárnu úlohu aj bez nutnosti pripojiť toto rozhranie a užívateľ tak nie je zbytočne brzdený pri používaní zariadenia na jeho primárny účel.

\section{Periférie a rozhrania kitu \cite{sem}}
Testovaný kit obsahuje: 
\begin{itemize}
\item ATmega328P Xplained mini,
\item LCD keypad shield 1602A,
\item Relé modul,
\item Enkodér s tlačidlom,
\item Modul RTC + EEPROM,
\item Modul s termistorom,
\item Reproduktor 8$\Omega$ 0.5W,
\item Maticová klávesnica.
\end{itemize}

Reproduktor je zariadenie ktoré nie je používané vo výuke a tak bude práca s nim vynechaná aj v tejto práci.

\subsection{ATmega328P Xplained mini}
ATmega328P Xplained mini je vývojový kit využívajúci mikrokontrolér ATmega328P. Zahrňuje integrovaný debugger z rozhraním USB. Vývody PCB sú kompatibilné s arduinom a rad pinov portu \textit{C} je dlhší o dva piny.

Predvolené operačné napätie kitu je 5 \unit{V}, ktoré je získavané priamo z \textit{USB} rozhrania. Napájacie napätie je možné zmeniť na 3.3 \unit{V}, tým že sa zaspájkuje na dosku plošného spoja príslušný rezistor a \textit{jumper} slúžiaci na prepínanie zdrojov napätia. Použitie napájacieho napätia 3.3 \unit{V} limituje frekvenciu procesoru na 8 \unit{MHz}. Pri konštrukcií prípravku sa preto berie ohľad na to, že vývojový kit bude pracovať s 5 \unit{V} napájaním.
\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.45\textwidth]{obrazky/AVR}
  \end{center}
  \caption{ATmega328P Xplained Mini}
\end{figure}

\subsection{LCD keypad shield 1602A}
Ide o shield, ktorý má pevne dané vstupy. Kombinuje tlačidlá a LCD maticový display, tlačidlá môžu reagovať len na stlačenie jedného z nich. Stlačenie tlačidla je indikované napäťovou úrovňou spoločného vývodu, ich používanie vyžaduje použitie Analógovo-digitálneho-prevodníku.

Samotný display je ovládaný cez množinu \textit{General Purpose Input Output}. Prenos dát môže fungovať v štvor alebo osem pinovom režime. Jedná sa o paralelnú komunikáciu. 

Testovacia procedúra pre overenie plnej funkčnosti by mala overiť opakovaný, dynamický výpis na display a zároveň testovanie stlačení tlačidiel. Zároveň by testovacie procedúry pre jednotlivé zariadenia nemali byť závislé na sebe navzájom, vypisovanie stlačení tlačidiel z lcd modulu na display je vhodný spôsob ako to docieliť. Podstatným problémom testovania užívateľských rozhraní je nutnosť zásahu užívateľa.

\textit{LCD} modul je určený pre napájacie napätie 5 \unit{V}, čo v prípade použitia 3.3 \unit{V} platformy vyžaduje ošetrenie rozdielu napäťových úrovní. Dokumentácia dohľadateľná k tomuto modulu je neadekvátna a nezmieňuje napätia logických úrovní. Bežne zariadenia fungujúce na úrovni 5 \unit{V} pracujú obdobnými úrovňami ako sú tie u \textit{Transistor-to-Transistor Logic}, čo umožňuje čítať signály z 3.3 \unit{V} zariadení, ale v tomto prípade to nie je potvrdené. Pre bežné užívanie a tým aj testovanie postačí použiť vstupy lcd modulu len na zápis do zariadenia, tak stačí ošetriť napäťový rozdiel v jednom smere pre prípad použitia 3.3 \unit{V} platformy. 

Analógový výstup slúžiaci na čítanie stlačení tlačidla je tiež v rozsahu 0 - 5 \unit{V}, v prípade použitia 3.3 \unit{V} platformy je možné napäťový rozdiel ošetriť deličom napätia.

\subsection{Zariadenia pripájané cez GPIO}
Niekoľko zariadení vo výukovom kite využíva na pripojenie len samotné \textit{General Purpose Input Output}, prípadne \textit{Interrupt on change} modul. Medzi tieto jednoduché zariadenia patria ovládacia prvky ako:
\begin{itemize}
\item Relé modul,
\item Enkodér s tlačidlom,
\item Maticová klávesnica.
\end{itemize}

\subsubsection{Maticová klávesnica}
Používaná maticová klávesnica pozostáva zo štyroch riadkov a štyroch stĺpcov. V laboratórnych úlohách sú využité len 3 stĺpce ktoré ovládajú číslicovú časť. Táto skutočnosť naznačuje, že napájanie stĺpcov a čítanie riadkov je výhodnejší postup. Pre praktické využitie zariadenia funkcionalita \textit{interrupt on change} nie je nutná, hodnoty riadkov v prípade voľby vhodnej skenovacej frekvencie je možné čítať pred výmenou napájaného stĺpcu a postupné skenovanie riadku spolu s obmedzenou rýchlosťou človeka je adekvátny filter.

Pre plné otestovanie klávesnice je nutné použiť 4 digitálne vstupy a 4 digitálne výstupy.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.50\textwidth]{obrazky/Keypad}
  \end{center}
  \caption{Používaná maticová klávesnica}
\end{figure}

Testovanie vyžaduje postupné stlačenie všetkých tlačidiel užívateľom, čo je úkon zvládnuteľný do 10 sekúnd. Vhodné je testovať aj dĺžku okna v ktorom dochádza k bouncingu.

\subsubsection{Enkodér s tlačidlom}
Enkodér s integrovaným tlačidlom mimo napájania vyžaduje použitie 3 digitálnych vstupov. Charakter používania enkodéru v praxi bežne vyžaduje použitie \textit{Interrupt on change} modulu, keďže vyhodnocovanie jeho akcií je na časovanie náročnejší úkon než u klávesníc a tlačidiel.

\subsubsection{Relé modul}
Obsahuje dva relé spínače. Jeho plné otestovanie je možné bez participácie užívateľa. Potrebné sú dva digitálne výstupy a štyri vstupy. V prípade testovania správnosti fungovania výstupov \textit{normally open} a \textit{normally closed}. V tomto prípade sa na spoločný kontakt privedie napätie zodpovedajúce logickej úrovni 1 a otestuje sa logická úroveň na výstupoch pre oba stavy vstupu. 

Relé modul je určený pôvodne pre arduino platformu, ktorá pracuje na úrovni 5 \unit{V} a zároveň je známa vysokými prúdmi, ktoré môžu tiecť cez jej \textit{GPIO}. To môže byť nevhodné pre niektoré platformy, ktoré nie sú schopné dosahovať také prúdy na  výstupoch. Pri riešení je nutné  brať do úvahy spínací prúd, ktorého uvádzaná hodnota je do 20 \unit{mA}.

\subsection{Zariadenia s I2C zbernicou}

Modul RTC(DS1307) a EEPROM(AT24C32) pamäť sú I2C zariadenia na jednej doske plošného spoja. RTC modul má definovanú rýchlosť \textit{I2C} zbernice 100 \unit{kHz} a tým určuje frekvenciu zbernice. \textit{I2C} zbernica zakladá svoju funkcionalitu na vysielaní, ktoré pripojené zariadenia vykonávajú stiahnutím napätia zbernice na zemniace napätie. Zbernica je cez \textit{pull-up} rezistory pripojená na napájacie napätie. 5 \unit{V} zariadenia sú schopné čítať logickú jednotku vysielanú zariadeniami s napájaním 3.3 \unit{V} pre spôsob, akým je na zbernici vysielané býva možné pripájať 5 \unit{V} zariadenie na 3.3 \unit{V} \textit{I2C} zbernicu. Pre možnosť výberu napätia logickej jednotky zbernice \textit{I2C} je  vhodné pridať jumper, čo umožní voľbu napájacieho napätia v prípade použitia len 5 \unit{V} zariadení.

V prípade že testovaný modul obsahuje v sebe zabudované \textit{pull-up} rezistory na 5 \unit{V}, je nutné ošetriť zmenu kľudového napätia na zbernici pri použití 3.3 \unit{V} zariadenia. 

RTC modul nevyužíva len I2C zbernicu na komunikáciu. Má digitálny výstup, ktorým vysiela svoje hodinové pulzy. Prípravok by mal testovať prítomnosť týchto pulzov a zároveň aj ich približnú presnosť. Funkčnosť samotnej I2C zbernice je možné otestovať zápisom a čítaním z pamäte zariadenia.


\section{Možné problémy a ich riešenia pri návrhu \cite{sem}}
\subsection{Prevody napäťových úrovní analógových}
\subsubsection{Pasívny napäťový delič}
Najjednoduchší  prvok, ktorým je možné jednosmerne znižovať napäťovú úroveň je pasívny napäťový delič. V prípravku sa nachádzajú dva prípady, kde je možné ho použiť. Výstup tlačidla lcd shieldu a výstup modulu termistoru. Veľkou nevýhodou pasívneho napäťového deliča je jeho nepoužiteľnosť v prípade neadekvátnych výstupných odporov.

Takéto zapojenie je použiteľné aj pre digitálne signály. V tom prípade je možné použiť polovodičové prvky ako zenerové diódy pre väčšiu spoľahlivosť.

\subsubsection{Aktívny napäťový delič}
Aktívny napäťový delič je spôsob ako vyriešiť problém pasívneho napäťového deliča s jeho závislosťou na vysokom výstupnom odpore. Jeho zapojenie je zobrazené na ukážke \ref{AktivDelic} , je realizovateľný aj s jedným operačným zosilňovačom. Zosilňovač U1A predradený pred napäťový delič slúži na impedančné oddelenie zdroja signálu a napäťového deliča, kde rieši problém závislosti na vysokom výstupnom odpore. Zosilňovač U1B tvorí aktívny zosilňovač. Nie je úplne nutný, ale ide o dobrý spôsob, ako zúžitkovať operačný zosilňovač, ktorý je v púzdre navyše.

Pri výbere súčiastok je dôležité, aby použitý operačný zosilňovač bol \textit{unity-gain stable} a bolo ho tak možné zapojiť do obvodu s jednotkovým zosilnením.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.45\textwidth]{obrazky/AktivDelic}
  \end{center}
  \caption{Aktívny napäťový delič}
  \label{AktivDelic}
\end{figure}

\subsubsection{Neinvertujúci zosilňovač}
Najjednoduchší spôsob ako previesť analógové napätie na vyšší rozsah je použiť neinvertujúci zosilňovač zobrazený na ukážke \ref{NonInvertAmp} . Je to jednoduché zapojenie z negatívnou spätnou väzbou, ktorá je vedená cez napäťový delič. 
\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.45\textwidth]{obrazky/NonInvertAmp}
  \end{center}
  \caption{Neinvertujúci zosilňovač}
  \label{NonInvertAmp}
\end{figure}
Problémom využitia neinvertujúceho zosilňovača je spôsob jeho ovládania, používa analógový vstup a tak vyžaduje, aby použitý mikrokontrolér obsahoval digitálne analógový výstup. Digitálno-analógové prevodníky nie sú úplne bežné v dostatočnom počte pre túto aplikáciu.

\subsubsection{Externý Analógovo digitálny prevodník}
Využitie externého analógovo-digitálneho prevodníku je spôsob, ako obísť problém rôznych napäťových úrovní. Analógovo-digitálne prevodníky sú dostupné zo širokým výberom rozhraní od rôznych paralelných a sériových vrátane \textit{uart},\textit{usb},\textit{spi} a \textit{i2c}. Pri použití rôznych napájacích napätí je i2c výhodnou možnosťou.

Ďalšia výhoda externého analógovo-digitálneho prevodníku sa prejaví v aplikáciach vyžadujúcich presnosť alebo rýchlosť. To najmä v aplikáciach kde využitie analógovo digitálneho prevodníku s postupnou sériovou aproximáciou, ktorý je v mikrokontroléroch najrozšírenejší nie je vhodné. Použitie externého prevodníku umožňuje vyberať medzi princípmi prevodu bez ohľadu na použitú platformu. 
%TODO možno rozpísať princípy prevodu pre viac textu

Ďalšou výhodou externého prevodníku je možnosť odľahčiť nároky pre návrh dosky plošného spoja s mikrokontrolérom, keďže analógové vlastnosti prestanú byť dôležité pre časť PCB s mikrokontrolérom a tieto nároky na kvalitný analógový design sa presunú na oddelenú analógovú časť, ktorá môže byť zároveň aj viac vzdialená od ostatných signálov a zberníc. 

\subsubsection{Externý Digitálne analógový prevodník}
Zatiaľ, čo analógovo-digitálne prevodníky sú v niekoľkých kanáloch bežne integrované v bežných mikrokontrolérových platformách, digitálne-analógové prevodníky nie sú samozrejmosťou a ich počet kanálov býva obmedzený na jeden.

Oba typy prevodníkov zdieľajú výhody a komunikačné rozhrania.

\subsection{Prevody napäťových úrovní digitálnych}
\subsubsection{zapojenie s otvoreným kolektorom a open drain circuit}
Digitálne signály je možné jednosmerne prevádzať na vyššie úrovne pomocou relatívne jednoduchého zapojenia jedného tranzistoru a pullup rezistoru. Tranzistor môže byť bipolárny, alebo unipolárny. Keď je tranzistor zatvorený na výstupe je napätie logickej jednotky, jeho otvorením je úroveň výstupu stiahnutá na zem. Veľkosť pullup rezistoru znižuje rýchlosť nábehu signálu a kľudový prúd tečúci cez tranzistor.
\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.50\textwidth]{obrazky/OpenDrain}
  \end{center}
  \caption{Open drain zapojenie}
  \label{OpenDrain}
\end{figure}

\subsubsection{Obojstranné zapojenie s unipolárnym tranzistorom}

Unipolárny tranzistor je možné použiť aj na obojstranné prevádzanie napäťových úrovní. Spôsob zapojenie pre obe signálové linky i2c obvodu je zobrazená na ukážke \ref{I2CShift}.
Fungovanie tohoto obvodu sa dá zhrnúť nasledovných bodoch:
\begin{itemize}
\item Ak žiadne zariadenie nevysiela, napätia oboch zberníc sú vytiahnuté ich \textit{pull-up} rezistormi na ich kľudové napätia. Tranzistor je zatvorený, keďže napätie \textit{gate-source} je nulové. Zabudovaná dióda tranzistoru neprepúšťa prúd, keďže je polarizovaná v závernom smere.
\item Ak vysiela zariadenie na 5 \unit{V} strane, stiahne napätie na nulu, zabudovaná dióda sa tým stáva polarizovaná v otvorenom smere pre prúd tečúci z 3.3 \unit{V} strany.
\item Ak vysiela zariadenie na 3.3 \unit{V} strane, napätie \textit{source} elektródy je stiahnuté na nulu, zatiaľ čo napätie hradla tranzistoru je 3.3 \unit{V}.
\end{itemize}

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/I2CShift}
  \end{center}
  \caption{Obvod pre prepojenie I2C zberníc s rôznym napätím}
  \label{I2CShift}
\end{figure}

\subsubsection{Jednosmerné prevodníky digitálnych napäťových úrovní}
Existujú integrované obvody, ktoré slúžia na prevod napäťových úrovní v jednom smere. Existujú fixné varianty alebo varianty, kde sa smer prevodu prepína pomocou digitálneho vstupu. Využitie jednosmerných prevodníkov v aplikáciach kde kombinácia vstupov a výstupov nie je pevne daná vedie k redundancií a dodatočnému prepájaniu.

\subsubsection{Obojsmerné prevodníky digitálnych napäťových úrovní}
Sú dostupné rôzne prevodníky digitálnych napäťových úrovní, ktoré pre každý kanál detekujú smer. Jedným takým je aj TXB0108 od texas instrument. Jedná sa o 8 bitový obojsmerný prevodník napäťových úrovní s automatickým detekovaním smeru a $\pm$15 \unit{kV} ESD ochranou.

Spôsob akým tento obvod zaisťuje obojsmernosť je  vysielaním slabých logických signálov (\textit{weak logic low/high}. To znamená, že logická úroveň je zabezpečená pomocou slabého prúdu. Slabú logickú úroveň je vysielajúce zariadenie na pripojenej linke schopné stiahnuť na svoju požadovanú vysielanú úroveň. V tejto situácií sa vysielač prevodníka napäťovej úrovne správa ako pullup, alebo pulldown rezistor, na ktorého zbernici začalo vysielať zariadenie jemu protichodný signál. Zapojenie akým je tento spôsob vysielania realizovaný je zobrazený na ukážke \ref{TXB0108_Cell}, kde je zobrazená časť prevodníku pre jednu signálovú linku. Na ukážke vidieť, ako je prevod napäťovej úrovne na slabú  zabezpečený 4k rezistorom na výstupe. Pre zlepšenie vlastností signálu a odstránenie jedného z nepriaznivých následkov použitia slabej signálovej úrovne je tento obvod v \textit{TXB0108} rozšírený o takzvaný \textit{one-shot}, nazývaný tiež ako hranový akcelerátor. Tento obvod  reaguje na zmenu vysielanej logickej úrovne vstupu a na krátku dobu pripojí výstup priamo na napájacie napätie alebo zem. Toto krátke napojenie zásobuje silnú logickú úroveň tým, že funkčne obchádza výstupný 4k rezistor. \textit{One-Shot} obvod je aktívny po dobu približne 10\unit{ns} , nevýhodou tohoto obvodu je jeho nevhodnosť pri veľkých kapacitných záťažiach, pri ktorých napäťová úroveň nestihne dosiahnúť požadovanú logickú úroveň, kým funguje \textit{one-shot} obvod.
\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/TXB0108_Cell}
  \end{center}
  \caption{Schéma jednej bunky prevodníku TXB0108 \cite{datasheetTXB0108}}
  \label{TXB0108_Cell}
\end{figure}

\subsubsection{GPIO expandér}
\textit{General purpose input output expander} je externý integrovaný obvod, ktorý funguje ako digitálne vstupy a výstupy v mikrokontroléri.

Pri použití na premostenie rôznych napäťových úrovní sa použije rovnaký postup ako pri analógovo-digitálnom a digitálno-analógovom prevodníku, zariadenie sa zapojí na požadované napätie a zvolí sa \textit{i2c} ako komunikačné rozhranie.

\subsection{Zdieľanie vstupov}
Prípravok na vykonávanie svojej úlohy vyžaduje značné množstvo vstupov aj výstupov. Nie všetky funkcie prípravku ktoré zaberajú vstupy a výstupy pracujú nevyhnutne súčasne čo umožňuje viacerým funkciám zdieľať rovnaké piny mikrokontroléru a tým znížiť ich počet.

Existujú rôzne metódy takéhoto zdieľania vstupov a výstupov, ktoré sa líšia vo svojej rozšíriteľnosti, limitáciách a iných vlastnostiach.

\subsubsection{Multiplexer}
Využitie multiplexeru je spôsob, ako jedným digitálnym vstupom čítať hodnotu z $n$ vstupov na prepínanie medzi vstupmi je využitých $m$ digitálnych výstupov, kde $n = 2^m$, v prípade že prepínanie vstupov nie je časovo kritické, je možno zredukovať počet potrebných výstupov na prepínanie pripojením počítadla pred riadiace vstupy multiplexeru. To zníži počet potrebných výstupov na dva inkrement a reset.

Existujú aj analógové multiplexeri na trhu, čo umožňujú použiť túto metódu na analógové signály. Tento prístup umožňuje vysielať analógový signál len na jeden vstup.

Použitie multiplexeru znemožňuje získavať presné časovanie a spoľahlivo spúštať \textit{interrupt on change} pre jednotlivé vstupy. To neplatí pre situácie, kde je nutné detektovať len zmenu jedného zo vstupných signálov.

\subsubsection{dekodér}
Využitie dekodéru umožňuje pomocou $n$ vstupov ovládať $2^n$ výstupov takým spôsobom, že kombináciou vstupov sa určuje na ktorom  výstupe je logická jednotka, zatiaľ čo na ostatných je logická nula. Využitie dekodéru je vhodné na ovládanie stĺpcov maticovej klávesnice.

Dekodér je možné doplniť obvodom s pamäťou, čo umožňuje mať na viacerých vstupoch naraz logickú jednotku, reset môže byť vykonávaný jedným z výstupov dekodéru alebo zvlášť, v prípade prítomnosti hodinového vstupu na registry. Je však nutné použiť prídavný výstup zo systému na jeho ovládanie. Takéto riešenie je vhodné pre ovládanie signálnych LED diód.

\subsubsection{Integrovaný spínač}
Existujú integrované obvody, ktoré sa správajú ako spínač s unipolárnym tranzistorom. Jedným konkrétnym príkladom je TMUX721x. Schéma popisujúca jeho správanie je na ukážke \ref{TMUX721x}. Jeden takýto obvod je možné použiť na zdvojnásobenie akejkoľvek kombinácie vstupov a výstupov. Na to je najvhodnejší TMUX7213, pri ktorom zapojenie zahrňuje zapojenie vstupov po dvoch a prepojenie všetkých ovládacích vstupov v jeden.

Dostupné sú aj varianty vhodné pre použitie na analógové účely. Ich zopnutý odpor sa pohybuje v rozmedzí stoviek až jednotiek $\Omega$ a spínací čas môže dosahovať až jednotky nanosekúnd. Najrýchlejšie varianty nie sú práve tie s najmenším odporom a dosahujú minimálne hodnoty 15 $\Omega$.

 \begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.95\textwidth]{obrazky/TMUX721x}
  \end{center}
  \caption{Logická schéma spínacích obvodov TMUX721x \cite{datasheetTMUX721x}}
  \label{TMUX721x}
\end{figure}

 \begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/ZdielanieVstupov}
  \end{center}
  \caption{Zapojenie rôznych riešení zdieľania pinov.}
  \label{ZdielanieVstupov}
\end{figure}

\subsection{Získavanie a stabilizácia napájacích napätí}
Poskytovanie napájacích napätí \textit{5V} a 3.3 \unit{V} je úlohou, ktorú je vrámci modularity a univerzality modulov lepšie riešiť vrámci modulu systémového jadra. Ako zdroj napájania je vhodný \textit{USB} port. Jeho napätie sa pohybuje v rozmedzí 4.75 \unit{V} až 5.25 \unit{V}, čo znemožňuje jeho priame prepojenie na 5 \unit{V} a vyžaduje reguláciu. s reguláciou je možné dosiahnúť adekvátnu kvalitu napájania pre analógové účely.

Z dôvodu energetickej efektivity sú najvhodnejšie dve voľby princípov regulátorov LDO regulátor, alebo Spínací regulátor.

\subsubsection{LDO regulátory}
Jedná sa o \textit{Low Dropout} regulátory. Tieto regulátory mávajú nízke stratové prúdy v jednotkách od stoviek \textit{nA} do jednotiek \textit{uA} a závisí od výstupného zaťaženia regulátora. 

Trvalý výstupný prúd sa pohybuje u 3.3 \unit{V} do 300 \unit{mA}a u 5\unit{V} do 150 \unit{mA}. Výhodou LDO regulátorov je aj nízky výstupný šum. Ich funkčný princíp ich predurčuje pre znižovanie napätia, čo ich robí vhodným na získavania 3.3 \unit{V} z USB napätia.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/TPS7B81}
  \end{center}
  \caption{Typické zapojenie LDO regulátoru}
  \label{TPS7B81}
\end{figure}

\subsubsection{Spínacie regulátory}
Spínacie regulátori využívajú ako akumulátor energie kombináciu kondenzátoru a cievky. Sú schopné zvyšovať aj znižovať napäťovú úroveň automatickým prepínaním medzi režimom \textit{step-down} a \textit{boost-mode}.

Výhodou spínacích regulátorov je robustnosť, efektivita a vysoký trvalý výstupný prúd. Nevýhodou môže byť spínací šum.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.95\textwidth]{obrazky/TPS6300x}
  \end{center}
  \caption{Typická aplikácia spínaného regulátoru TPS6300x.}
  \label{TPS6300x}
\end{figure}

\subsection{Vedenie dráh plošného spoja}
Vodiče a dráhy  na doske plošného spoja majú parazitické vlastnosti, ktoré je nutné zohľadniť pre funkčnosť a spoľahlivosť systému. Parazitické vlastnosti ktoré vo väčšine situácií prevládajú sú zobrazené na ukážke \ref{TraceParasitic}
\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/TraceParasitic}
  \end{center}
  \caption{Ukážka vybraných parazitických vlastností vodičov: 1. rezistivita, 2. vzájomná kapacita, 3. indukčnosť, 4. vzájomná indukčnosť.}
  \label{TraceParasitic}
\end{figure}
Vzťah pre približný výpočet indukčnosti dráhy plošného spoja je vzorec \ref{TraceL}, ukážka \ref{vodic} dovysvetluje význam premenných z nasledujúcich vzorcov. Vzorec naznačuje bežný spôsob potlačenia indukčnosti vedenia bežne odporúčaný v katalógových listoch, zväčšením šírky dráhy $W$.

Zo vzťahov \ref{TraceL}, \ref{TraceR} a \ref{Cap} vidieť, že dosahovanie optimálnych parametrov dráh plošného spoja je hľadanie kompromisu. Znižovanie indukčnosti a odporu zvyšuje kapacitu a naopak. 
\begin{equation}
L \approx \frac{\mu_0 \cdot \mu_r \cdot (H + T/2)\cdot \ell}{W} \quad [\unit{H}]
\label{TraceL}
\end{equation}

\begin{equation}
R = \rho \cdot \frac{\ell}{W \cdot T} \quad [\Omega]
\label{TraceR}
\end{equation}

\begin{equation}
C = \epsilon \cdot \frac{W \cdot \ell}{H} \quad [\unit{F}]
\label{Cap}
\end{equation}

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/vodic}
  \end{center}
  \caption{Ukážka rozmerov pre výpočtové vzťahy \ref{TraceL}, \ref{TraceR} a \ref{Cap}.}
  \label{vodic}
\end{figure}

Ďalšia dôležitá parazitická vlastnosť zapojení je prítomnosť slučiek, na ktorých sa môže indukovať napätie. Tieto slučky sa môžu vyskytnúť s osou kolmou k doske plošného spoja, alebo z osou v ploche. Takéto slučky sú tvorené prekovmi. Negatívny vplyv slučiek je možné eliminovať znížením ich plochy. To sa dosahuje vedením vodičov, ktoré tvoria slučku v tesnej blízkosti. Ak slučka pozostáva zo zemniaceho vodiča, tak jej negatívny vplyv je potlačený použitím rozliatej zeme.

Signálové vodiče sa ovplyvňujú kapacitnými a indukčnostnými väzbami. Tieto väzby sú najsilnejšie v prípade paralelne vedených vodičov a najnižšie v prípade vodičov vedených kolmo k sebe. V prípade kapacitnej väzby je tento jav ovplyvnení najmä efektívnou vzdialenosťou. V prípade indukčnostných väzieb je závažným faktorom uhol medzi vodičmi. Vedenie vodivých dráh na rôznych vrstvách  dosky plošného spoja často vedie k použitiu 45° uhlov medzi vodičmi na rôznych vrstvách, v takom prípade sa zníži zároveň priebeh funkcie efektívnej vzdialenosti medzi vodičmi a zároveň aj ich uhol zoslabí indukčné väzby na $sin(\alpha)$ násobok pôvodnej veľkosti kde $\alpha = 45°$ tento princíp používajú aj rezolvery na meranie uhlu natočenia.

\subsubsection{Diferenciálne vedenia}

Prípravok a riadiaci modul používajú niekoľko komunikačných rozhraní, u ktorých je nutné dbať na zníženie rozdielu medzi vzdialenosťami ich vodičov a ich kapacít. Takúto povahu majú rozhrania ako \textit{I2C}, \textit{SPI} a \textit{UART}. Viesť tieto rozhrania ako diferenciálny pár s väčším rozostupom a menšou šírkou vodičov je praktický spôsob ako to zaručiť.

\textit{USB} je rozhranie, ktoré je nutné viezť ako diferenciálny pár. Elektrické vlastnosti stanovené v štandarde \textit{USB} sú prísne a vedú k veľkej robustnosti. \textit{USB} zbernicu je možné realizovať aj subštandardne, čo uľahčuje jej implementáciu.

\textit{USB} zbernica je v literatúre bežne označovaná ako diferenciálna zbernica, hoci to nie je úplne pravda. Väčšina komunikácie je diferenciálna a pozostáva zo stavov zbernice J a K, existuje ešte jeden stav využívaný na komunikáciu \textit{SE0}(Single ended zero). Tento stav zbernice sa používa pri indikácií konca paketu, odpojenia zariadenia a reset zariadenia. Tabuľka \ref{usbSig} obsahuje prehlad povolených stavov usb zbernice pre full-speed komunikáciu.
\begin{table}[!h]
\begin{center}
\begin{tabular}{|c|c|c|}
\hline 
Stav & D+ & D- \\ 
\hline 
J & H & L \\ 
\hline 
K & L & H \\ 
\hline 
SE0 & L & L \\ 
\hline 
\end{tabular} 
\end{center}
\caption{Tabuľka povolených stavov USB zbernice pre full-speed režim.}
  \label{usbSig}
\end{table} 

Rýchlosť signálov na USB zbernici je vysoká a štandard diktuje diferenciálnu impedanciu vedenia 90 $\Omega$. Dosahovanie tejto hodnoty na dvojvrstvovej doske plošného spoja je obtiažne a pre jej dosiahnuteľnosť s praktickou šírkou vodičov a ich medzerou vyžaduje použitie koplanárneho vlnovodu. Dosiahnutie štandardom predpísaných parametrov nie je nevyhnutné pre funkciu rozhrania, mnohý výrobcovia skúšobných kitov na parametre nedbajú a dokonca vedú zbernice cez prekovy.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.60\textwidth]{obrazky/Vlnovody}
  \end{center}
  \caption{Ukážka zjednodušených možností vedenia diferenciálneho páru, možnosti sú zoradené zhora nadol podľa diferenciálnej impedancie vzostupne Spodná konštrukcia je koplanárny vlnovod.}
  \label{Vlnovody}
\end{figure}

\subsection{Ochrana pred ESD}

Mnohé elektronické súčiastky integrujú do seba ochranu pred elektrostatickým výbojom, aj \textit{TXB0108} implementuje v sebe ochranu pred \textit{ESD}.

Najjednoduchšou a najkompaktnejšou formou ochrany pred ESD je použitie \textit{TVS} diódy. TVS diódy sa zapájajú v závernom smere čo najbližšie k vstupom do plošného spoja, v prípade že napätie na dióde prekročí úroveň $V_{BR}$, dióda sa otvára a skratuje napätie elektrostatického výboja. Schematická značka a ekvivalentný obvod TVS diódy sú zobrazené na ukážke \ref{TVSsch}, \textit{V-A} charakteristika TVS diódy je zobrazená na ukážke \ref{TVSchar}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.40\textwidth]{obrazky/TVSsch}
  \end{center}
  \caption{Schematické značenie v datasheete ESD diódy ESD9101. \cite{datasheetESD9101}}
  \label{TVSsch}
\end{figure}

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/TVSchar}
  \end{center}
  \caption{\textit{V-A} charakteristika ESD diódy ESD9101. \cite{datasheetESD9101}}
  \label{TVSchar}
\end{figure}
\FloatBarrier
\section{Softvérová architektúra}
Softvérová architektúra systému by mala mať nasledovné vlastnosti:
\begin{itemize}
\item Modularita,
\item Migrovateľnosť,
\item Rekonfigurovateľnosť,
\item Rozsah použiteľnosti.
\end{itemize}

Vo svojom účely aj v spôsobe ich dosiahnutia sa spomenuté vlastnosti prelínajú. Tak snaha dosiahnutia jednej vedie k dosiahnutiu ostatných.

Modularita zvyšuje migrovateľnosť, pri dobrej architektúre umožňuje vymeniť jadro systému za akúkoľvek adekvátnu platformu. To všetko pri minimálnych zmenách kódu ktoré sú obmedzené na kód ktorý obsluhuje periférie jadra ktoré interagujú s prípravkom.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.70\textwidth]{obrazky/Mod1}
  \end{center}
  \caption{Zobrazenie zásahu nutného pri migrácií na iné jadro.}
  \label{Mod1}
\end{figure}

Migrácia systémového jadra na inú platformu pri architektúre podobnej ako na ukážke \ref{Mod1} umožňuje minimálne zmeny v kóde. Tak v prípade migrácie je nutné len zmeniť kód, ktorý obsluhuje periférie zariadenia, kde spôsob fungovania potrebných funkcií je definovaný návrhom prípravku. Pri migrácií je vďaka tomu možné využiť starý .h súbor, ktorý definuje funkcie obsluhy HW jadra, ktoré kód pre obsluhu HW prípravku potrebuje. 

Rekonfigurovateľnosť umožňuje množstvo prepojek, vďaka ktorým je možné meniť spôsob prepojenia spojov vedúcich do slotu na výukový kit/lcd display a zároveň aj ostatných testovaných súčastí. Rekonfigurovatľnosť HW dodáva zároveň prípravku rezilienciu voči návrhovým chybám a môže umožniť ich jednoduché riešenie. 

Súčasťou rekonfigurovateľnosti je aj spôsob riešenia otázok testovania SW bežiaceho na kite. To vyžaduje možnosť meniť a spúštať rôzne testovacie scenáre neznáme v čase a tvorbe tejto práci. 

Úloha testovania HW kitu je zjednodušená tým, že sa nepredpokladajú zmeny v ich fungovaní po dokončení zariadenia, tak je možné vyriešiť ju hard-code riešením, v ktorom sa celá implementuje v programe samotnom.

Úloha testovania SW nie je už tak jednoduchá, keďže zadania pre SW nie sú nemenné, čo vyžaduje rekonfigurovateľnosť. Užitočnosť zariadenia je do značnej miery určená tak, aby bolo  užívateľovi umožnené meniť procedúru testu SW.

V prípade niektorých platforiem použitých ako jadro je to jednoduché a hard-code prístup je dostačujúci. To platí pre prípady z integrovaným riešením programovania mikrokontrolérovej platformy. V prípade platforiem, ktoré sa spoliehajú na externé programátory ako P\&E micro, je nutné implementovať dodatočné riešenie v prípade, že užívateľ externým programátorom nedisponuje.

Spôsobov ako meniť testovací scenár existuje široké spektrum, mnohé sú si navzájom veľmi podobné a jedná sa skôr o varianty rovnakého prístupu. Najzaujímavejšie možnosti sú:
\begin{itemize}
\item Sprostredkovanie udalostí
\item Realizácia testov pomocou Lua
\item Vytvorenie kódovacieho jazyka na mieru
\item Hard-Code riešenie(Správanie programované priamo C, zmena preprogramovaním SW jadra.)
\end{itemize}

\subsection{Sprostredkovanie udalostí}

Tento spôsob riešenia spočíva v sledovaní udalostí, ktoré nastávajú na prepojení medzi jadrom systému a testovaným kitom.

Sledované by boli udalosti, ale aj stavy digitálnych výstupov kitu. Rovnako by bolo pracované s I2C zbernicou a každým výstupným rozhraním kitu. Zaznamenané údaje spolu z ich potrebnými údajmi by boli štruktúrovane posielané cez pripojené rozhranie do PC. V tomto riešení vyhodnocovanie správania testovaného kitu je vykonávané programom bežiacom na PC, ktorý komunikuje zo zariadením.

Vhodný spôsob komunikácie je sériová linka virtuálna, skutočná, alebo sprostredkovaná, ako to na dnešných vývojových platformách vrátane Xplained mini býva. Obslužný program by vyhodnocoval prichádzajúce udalosti, prípadne ich absenciu a vyvolával udalosti, na ktoré má testovaný kit reagovať. Program by za účelom vyvolávania týchto udalostí posielal do zariadenia príkazy v podobe štrukturovaných dát.

\subsection{Realizácia testov pomocou Lua}
 Jazyk Lua je výkonný, efektívny, ľahký a zabudovateľný skriptovací jazyk. Podporuje procedurálne programovanie, objektovo orientované programovanie, funkcionálne programovanie, programovanie založené na údajoch a popis údajov.\cite{Lua}

Jazyk Lua kombinuje jednoduchú procedurálnu syntax s výkonnými konštrukciami na opis údajov založenými na asociatívnych poliach a rozšíriteľnej sémantike. Jazyk Lua je dynamicky typovaný, beží na základe interpretácie bajt-kódu pomocou virtuálneho stroja založeného na registroch a má automatickú správu pamäte s inkrementálnym garbage collection systémom, vďaka čomu je ideálny na konfiguráciu, skriptovanie a rýchle prototypovanie.\cite{Lua} 

Lua je rýchly a malý jazyk, ktorý možno ľahko vložiť do rôznych aplikácií. Lua má jednoduché a dobre zdokumentované API, ktoré umožňuje silnú integráciu s kódom napísaným v iných jazykoch. Jazyk Lua je možné ľahko rozšíriť o knižnice napísané v iných jazykoch. Pomocou jazyka Lua možno tiež ľahko rozširovať programy napísané v iných jazykoch. Lua sa používa na rozšírenie programov napísaných nielen v jazykoch C a C++, ale aj v jazykoch Java, C\#, Smalltalk, Fortran, Ada, Erlang a dokonca aj v iných skriptovacích jazykoch, ako sú Perl a Ruby.\cite{Lua}

Lua je v praxi používaná najmä spôsobom, ktorý umožňuje v Lua kóde uživatelovi prepisovať callback funkcie, ktoré sú volané z vývojárskeho kódu. Užívateľ píše kód v ktorom môže volať funkcie implementované v C, ktoré vývojáry sprostredkovali. Takto je uživatelovy poskytnuté rozhranie, ktoré mu umožňuje meniť správanie aplikácie. Lua sa v tejto forme preslávila najviac v hernom priemysle, kde bola použitá v mnohých tituloch. V embedded je Lua menej známa, využíva ju napríklad Lego Mindstorms, ktoré používa používa pbLua. Ďalším zaujímavým užívateľom je Acrios Systems, ktorý vo svojich Internet of Things prevodníkoch implementuje eLua.

Kód v jazyku C, ktorý implementuje virtuálny stroj pre Lua, pracuje s premennou typu lua\_state*, ktorá reprezentuje kontext Lua. Detaily sa môžu líšiť medzi verziami Lua. Implementácia Lua v jazyku C pozostáva z nasledujúcich častí:

\begin{itemize}
\item Inicializáciu Lua kontextu.
\item Načítanie nutných Lua knižníc.
\item Vytvorenie Lua knižnice na volanie aplikačných C funkcií.
\item Volanie Lua funkcií z C kódu.
\end{itemize}

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.70\textwidth]{obrazky/Lua1}
  \end{center}
  \caption{Ukážka kódu pre inicializáciu Lua virtuálneho stroja pre verziu Lua5.4.4 .}
  \label{Lua1}
\end{figure}

\begin{verbatim}
	lua_State *lua = luaL_newstate()';
\end{verbatim}
Inicializuje lua kontext, ten sa používa ako argument každej funkcie čo pracuje s Lua virtuálnym strojom.

\begin{verbatim}
	luaL_openlibs(lua);
\end{verbatim}
Nahrádza otvára štandardné knižnice pre daný stav. V starších verziách Lua ako 5.1 a tým pádom aj eLua ktorá z verzie 5.1 vychádza sa postupne otvárajú knižnice nasledovným spôsobom:
\begin{verbatim}
	luaopen_base(L);             /* opens the basic library */
      luaopen_table(L);            /* opens the table library */
      luaopen_io(L);               /* opens the I/O library */
      luaopen_string(L);           /* opens the string lib. */
      luaopen_math(L);             /* opens the math lib. */
\end{verbatim}

Definícia pola štruktúr \textit{luaL\_reg} slúži na previazanie funkcií napísaných v C s ich menami, ktorými majú byť volané v Lua kóde. Štruktúra \textit{luaL\_reg} má v prvom člene reťazec, ktorým bude funkcia volaná z Lua kódu a v druhom ukazateľ na volanú funkciu. Pole končí nulovou štruktúrov, ktorej obe polia sú NULL. Následne volaná funkcia berie toto pole ako argument a slúži na registráciu funkcií.
\begin{verbatim}
	luaL_setfuncs(lua, hwapi_lib, 0);
\end{verbatim}

Lua 5.1 a eLua používajú namiesto predošlej funkcie nasledovnú:
\begin{verbatim}
	luaL_register(lua, "api" , hwapi_lib);
\end{verbatim}
Kde druhý argument slúži ako meno knižnice a funkcie sú v Lua kóde volané pomocou api.meno\_funkcie().

Funkcie jazyka C takto sprístupnené do Lua majú správanie ktoré sa dá zhrnúť nasledovne:
\begin{itemize}
\item Sú statické funkcie.
\item Nemali by používať statické a globálne premenné v C kóde.
\item Majú návratovú hodnotu typu int.
\item Majú jediný argument typu lua\_state* reprezentujúci Lua kontext.
\item Cez lua\_state pristupujú k zásobníku z ktorého berú argumenty funkcie dodané z Lua prostredia.
\item Návratové hodnoty do Lua prostredia pridávajú prostredníctvom spomenutého zásobníku.
\item Ako C funkcia majú návratovú hodnotu ktorá reprezentuje počet hodnôt ktoré vrátili za behu do Lua prostredia cez zásobník.
\end{itemize}

C funkcia môže získavať hodnoty argumentov s ktorými bola volaná z Lua kódu zo zásobníka pomocou funkcií ako:
\begin{verbatim}
int lua_toboolean(lua_State *L, int index);
double lua_tonumber(lua_State *L, int index);
const *lua_tostring(lua_State *L, int index);
\end{verbatim}
Overiť typ hodnoty v zásobníku je možné funkciami ako:
\begin{verbatim}
int lua_isinteger(lua_State *L, int index);
int lua_isnumber(lua_State *L, int index);
int lua_isstring(lua_State *L, int index);
\end{verbatim}
Na získanie dĺžky objektu v zásobníku na danom indexe, tak aj na získanie dĺžky reťazcov, slúži nasledovná funkcia:
\begin{verbatim}
lua_Unsigned		lua_rawlen(lua_State *L, int index);
\end{verbatim}
Návratové hodnoty do Lua kódu sú riešené pomocou funkcií ako:
\begin{verbatim}
void lua_pushnil(lua_State *L);
void lua_pushboolean(lua_State *L, int bool);
void lua_pushnumber(lua_State *L, double n);
void lua_pushlstring(lua_State *L, const char *s, size_t length);
void lua_pushstring(lua_State *L, const char *s);
\end{verbatim}
Pri používaní týchto funkcie je nutné dbať na to, aby zásobník nebol veľkostne prekročený. Zásobník Lua funkcia má minimálnu definovanú veľkosť nastavenú na 20, táto veľkosť sa dá meniť definíciou LUA\_MINSTACK, ktorá sa nachádza v súbore lua.h. V prípade že je nutné zabezpečiť väčšiu veľkosť zásobníku, je možné volať nasledovnú funkciu:
\begin{verbatim}
int lua_checkstack(lua_State *L, int n);
\end{verbatim}
Táto funkcia zabezpečí v zásobníku ďalších n miest. Návratová hodnota je nenulová, ak sa operácia podarila, v prípade že zásobník nebolo možné zväčšiť, návratová hodnota je nula.

Beh Lua programu môže byť zabezpečený dvoma spôsobmi.
\begin{itemize}
\item Just-in-time kompiláciou kódu za behu.
\item Predkompilovaným binárnym súborom.
\end{itemize}
Pre embedded platformy je vhodnejší druhý spôsob a to najmä pre jednoduchosť a šetrenie výpočtovým výkonom. Binárny súbor pre Lua virtuálny stroj má pôvodnú príponu .out a je tvorený pomocou nástroja luac. Ide o Lua kompilátor, ktorý je súčasťou súborov projektu Lua. Lua kód je možné skompilovať na desktope a jeho binárny súbor preniesť do mikrokontrolérovej platformy a je následne spustený. Luac nemá informácie o tom aké Lua funkcie virtuálny stroj v mikrokontrolérovej platforme implementuje, problematika kompilovania užívateľom definovaných funkcií je riešená zaujímavým spôsobom, ktorý je zjavný z ukážky \ref{LuanOut}, na ktorej je zobrazený Lua kód a obsah výsledku jeho kompilácie.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.80\textwidth]{obrazky/LuanOut}
  \end{center}
  \caption{Porovnanie Lua kódu s obsahom jeho skompilovaného binárneho súboru.}
  \label{LuanOut}
\end{figure}

Využitie jazyka Lua je vhodným spôsobom, ako pridať upraviteľnosť do správania systémov. Lua prináša mnoho možností na relatívne jednoduchú aplikáciu, ktorá je predmetom tejto práce  ale aj mnoho týchto možností nadbytočných a tie dokážu skôr prinášať problémy s implementáciou a stabilitou. Ďalšou nevýhodou Lua je to, že je nevyhovuje MISRA smerniciam, čo môže byť nevýhodou v embedded platformách. Lua do veľkej miery pracuje s dynamicky alokovanými hodnotami a reťazcami znakov, čo je suboptimálne pre jednoduché úlohu fungujúce na jednoduchých platformách.

\subsection{Jazyk implementovaný na mieru}
Niektoré myšlienky na ktorých je predošlý prístup založený je možné využiť jednoduchším spôsobom než implementovať Lua. 
Na plnenie úlohy zariadenia stačí jednoduchší systém, ktorý nepotrebuje pracovať s dynamicky alokovanou pamäťou a funguje na podstatne jednoduchšom virtuálnom stroji. Pre plnenie úlohy zariadenie je nutné len niekoľko úkonov, ktoré sú jednoduché:
\begin{itemize}
\item Volať funkcie na prácu s HW.
\item Vyhodnocovať návratové hodnoty.
\item Vykonávať základné operácie s premennými.
\item Implementovať funkcie ktoré budú slúžiť na spracovanie udalostí.
\end{itemize}

Tento virtuálny stroj by pracoval len zo statickou pamäťou. Na fungovanie by mu vystačil jeden, prípadne viac rozdelených zásobníkov na prácu s pamäťou a jeden zásobník, ktorý by slúžil na uloženie inštrukcií.

Inštrukcie by boli interpretované s úrovňou abstrakcie rovnakou ako C funkcie a rezervované slová. Logické, binárne a matematické operácie by mali svoje inštrukcie, tak ako vetvenia a cykly. Takto by každý operátor, funkcia či rezervované slovo mali svoju inštrukciu. Inštrukcie ako číselné hodnoty je možné interpretovať pomocou switch štruktúry, alebo indexovaním pola ukazovateľov na funkcie.
Argumenty a návratové hodnoty je možné riešiť pomocou zásobníku.

Takýto binárny kód by bol vo výsledku jednoduchší a kratší než ten, ktorý je výsledkom kompilácie Lua kódu. Prináša otázky ohľadne riešenia niektorých implementačných problémov, jedným z nich je spôsob ako rozlišovať či je argument inštrukcie konštanta, alebo premenná. Ide o pravdepodobne najzaujímavejšiu otázku architektúry virtuálneho stroja a kódu pre neho.


\subsection{Výsledná architektúra spomenutých riešení}
SW architektúra spomenutých riešení má spoločné prvky, ale aj rozdiely, ktoré vyplývajú z rozdielnosti prístupu. Ukážka \ref{SWarch} zobrazuje SW architektúru, farebné bloky rôznych farieb znázorňujú rôzne varianty, ktorých názov je uvedený v najvyššie umiestnených blokoch, zobrazených prerušovanou čiarou. Prepoje diagramu symbolizujú volanie funkcií, či sprostredkovanie funkcionality. Riešenie využívajúce jazyk Lua, alebo vlastný jazyk na mieru, obe pracujú s kompilovaným binárnym súborom. V oboch prípadoch je tento súbor načítaný a spustený vo virtuálnom stroji. Virtuálny stroj interpretuje binárny kód a pritom pracuje s HW tým, že volá funkcie najnižšej abstraktnej vrstvy. Túto najnižšiu abstraktnú vrstvu tvorí wrapper, ktorý slúži na volanie funkcií a tie sú špecifické pre HW použitého jadra.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.95\textwidth]{obrazky/SWarch}
  \end{center}
  \caption{Porovnanie variant a ich výslednej architektúry systému.}
  \label{SWarch}
\end{figure}

Voľba varianty je tiež podmienená použitým jadrom. Spôsob, akým je jadro programované môže robiť Hard Code riešenie najideálnejším. Možnosť behu Lua virtuálneho stroja je tiež rozhodujúcim faktorom, jeho implementácia môže v závislosti od platformy prinášať rôzne problémy, ktoré môžu mať za následok výhodnosť iného riešenia.

Statická povaha testovania HW modulov navádza ku kombinácií hard code riešenia, prípadne jeho kombinácie s ktorýmkoľvek iným riešením. V prípade použitia Lua jazyka na mieru, alebo sprostredkovania udalostí, je možné vyriešiť úlohu testovania  HW pomocou funkcie implementovanej v C.

\subsubsection{COM rozhranie PC - jadro}

Na splnenie úlohy zariadenia je nutné umožniť praktickým spôsobom ho ovládať, získavať z neho údaje a prípadne posielať do neho súbory. To všetko je najjednoduchšie dosiahnuteľné prepojením zariadenia s PC a to spôsobom, ktorý umožní komunikovať cez konzolové aplikácie. Toto riešenie je zároveň vhodným pre jeho multiplatformovosť, jednak z pohľadu na jadro systému a zároveň na operačný systém PC. Kvalitné konzolové aplikácie sú dostupné na všetky bežne používané operačné systémy. Rôzne systémy ktoré je možné použiť ako jadro systému, majú možnosť jednoduchej implementácie sériovej komunikácie, či sa jedná u priamy VCOM medzi použitým MCU a PC, alebo o systém kde je na PCB vedená sériová linka z MCU do komunikačného systému, ktorý túto linku sprostredkováva ako VCOM. Toto riešenie majú platformy ako Arduino a rôzne podobné vývojové kity.

Sériová linka umožňuje jednoducho aj posielať súbory. Cez konzolové aplikácie ako TeraTerm je možné posielať súbory rôznymi spôsobmi. Spôsob ako posielať súbory cez Tera Term je naznačený ukážkou \ref{teraTerm}. Tlačidlo transfer slúži na posielanie pomocou protokolov ako Xmodem, Ymodem, Zmodem... Tieto protokoly vyžadujú ich implementáciu na strane jadra systému, čo komplikuje ich použitie. Správanie týchto protokolov nie je ale pre túto aplikáciu vhodné, napr. Xmodem používa checksum v prípade jeho modernejšej varianty CRC, ktoré sú obe nadbytočné pre väčšinu jadier systému, keďže komunikujú cez VCOM kde USB protokol rieši bezchybnosť dát. Prípadne sériová linka je krátka a je vedená na PCB. Väčším problémom Xmodem protokolu je preddefinovaná veľkosť paketu 128 B, to vedie k problémom s kompatibilitou, keďže USB periférie majú obmedzenú veľkosť vyrovnávacej pamäte pre interrupt endpoint, ktorý VCOM rozhranie využíva na príjem dát na mkl27z tak, ako aj ostatných kinetis platformách a je táto veľkosť pre full-speed USB perifériu maximálne 64 B. 

Jednoduchším spôsobom ako poslať obsah súboru cez konzolovú aplikáciu je využiť možnosť \textit{Send file...}. Tá umožňuje posielať súbor spôsobom ,ktorý sa z pohľadu príjmajúceho zariadenia javí ako postupné posielanie znakov, ktoré sú obsahom súboru. Je to jednoduché riešenie, ale prináša problémy s tým, že takto je možné posielať len určité hodnoty, ktoré zodpovedajú znakom, ktoré je možné posielať cez konzolu. Napríklad nie je možné poslať byte, ktorého hodnota je 0 alebo reprezentuje nezobraziteľný znak (non-printable). Riešenie tohoto problému je relatívne priamočiare. Stačí konverzia súboru, ktorý má byť poslaný na postupnosť hexadecimálnych hodnôt jednotlivých znakov, tak je možné poslať aj nezobraziteľné znaky. Potom všetky hodnoty, ktoré môže jeden byte nadobudnúť sú reprezentované dvojicou alfanumerických znakov, ktorými sa hexadecimálne hodnoty píšu.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[width=0.66\textwidth]{obrazky/teraTerm}
  \end{center}
  \caption{Možnosti posielania súborov cez TeraTerm}
  \label{teraTerm}
\end{figure}