<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>https://senzor.robotika.sk/sensorwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=StudentMIPS</id>
	<title>SensorWiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="https://senzor.robotika.sk/sensorwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=StudentMIPS"/>
	<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/StudentMIPS"/>
	<updated>2026-05-22T17:31:27Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_I.&amp;diff=18781</id>
		<title>Zámok na kód I.</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_I.&amp;diff=18781"/>
		<updated>2026-05-20T10:14:19Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Čo by som urobil inak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Adam Čulák&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:KlonArduinoMega2560.jpg|400px|thumb|center|Vývojová doska Arduino MEGA CH340.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/resources/datasheets/A000067-datasheet.pdf Dokumentácia k doske Arduino Mega 2560]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákCelkovýPohladNaZapojenie.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákMIPSProjektShémaZapojenia.png|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva základné knižnice pre uart a lcd z cvičení, pričom knižnica pre lcd bola upravená tak, aby fungovala s doskou Arduino Mega 2560. Úprava spočíva najmä v zmene používaných portov, pretože porty požité pri mikrokontroléri ATmega2560 sa líšia od portov použitých pri mikrokontroléri ATmega328P.&lt;br /&gt;
&lt;br /&gt;
Pre obsluhu 4×3 maticovej klávesnice bola vytvorená vlastná knižnica klavesnica.h. Čítanie stlačeného tlačidla je realizované pomocou princípu skenovania klávesnice po riadkoch. Všetky riadky sú štandardne nastavené na logickú úroveň HIGH (+5 V), pričom aktuálne skenovaný riadok je nastavený na LOW (uzemnený). Následne sa načítava stav stĺpcov. Ak je niektoré tlačidlo stlačené, dôjde k spojeniu príslušného riadku a stĺpca, čo umožní identifikovať konkrétne tlačidlo.&lt;br /&gt;
&lt;br /&gt;
V inicializačnej funkcii keypad_init() sú piny 22 až 25 nastavené ako výstupy pre riadky klávesnice a piny 26 až 28 ako vstupy pre stĺpce. Na vstupných pinoch sú aktivované interné pull-up rezistory, aby bol zabezpečený stabilný logický stav pri nestlačených tlačidlách.&lt;br /&gt;
&lt;br /&gt;
Funkcia keypad_getkey() postupne skenuje jednotlivé riadky. Pre každý riadok nastaví všetky riadky do stavu HIGH a následne aktuálny riadok do stavu LOW. Po krátkej stabilizačnej pauze sa kontrolujú vstupy stĺpcov. Ak je detekované stlačené tlačidlo, funkcia vráti číselnú hodnotu reprezentujúcu jeho pozíciu v matici klávesnice. Táto hodnota je vypočítaná podľa vzťahu k = 3 * r + c kde:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;k je výsledný identifikátor tlačidla&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;r predstavuje index riadku&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;c predstavuje index stĺpca&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Tento spôsob nahrádza rozsiahle podmienky typu if-else jednoduchším a prehľadnejším výpočtom. Ak nie je stlačené žiadne tlačidlo, funkcia vracia hodnotu -1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 115200&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;klavesnica.h&amp;quot;&lt;br /&gt;
#include &amp;quot;lcd_ch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Macra na nastavenie a vynulovanie bitu z cičenia&lt;br /&gt;
#define set_bit(ADDRESS, BIT) (ADDRESS |= (1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
#define clear_bit(ADDRESS, BIT) (ADDRESS &amp;amp;= ~(1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
&lt;br /&gt;
// Funkcia delay z cvičenia&lt;br /&gt;
void delay(int delay)&lt;br /&gt;
{&lt;br /&gt;
	for (int i = 0; i&amp;lt; delay; i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenie pomomocov timeru na bliknutie LED&lt;br /&gt;
ISR(TIMER1_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
	TCCR1B = 0; // Vypnutie časovača &lt;br /&gt;
	clear_bit(PORTB, PB0);&lt;br /&gt;
	clear_bit(PORTB, PB1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    char password[] = &amp;quot;0159&amp;quot;; // Premenná ukladajúca nastavené heslo&lt;br /&gt;
    char guess[5] = &amp;quot;&amp;quot;; // Premenná ukladajúca hádané heslo&lt;br /&gt;
    int index = 0; // Index pola hádaného hesla&lt;br /&gt;
	int last_key = -1; // Premenná pre ulozenie posledného stlacenného tlacitka&lt;br /&gt;
	&lt;br /&gt;
	// Inicializácia knižníc&lt;br /&gt;
    uart_init();&lt;br /&gt;
    keypad_init();&lt;br /&gt;
	lcd_init();&lt;br /&gt;
	&lt;br /&gt;
    // Nastavenie pinou pre LED&lt;br /&gt;
	set_bit(DDRB, PB0);&lt;br /&gt;
	set_bit(DDRB, PB1);&lt;br /&gt;
	&lt;br /&gt;
	TIMSK1 |= (1 &amp;lt;&amp;lt; TOIE1);&lt;br /&gt;
	&lt;br /&gt;
	// Mapovanie cisel k znakom&lt;br /&gt;
    char keys[4][3] = {&lt;br /&gt;
        {&#039;1&#039;,&#039;2&#039;,&#039;3&#039;},&lt;br /&gt;
        {&#039;4&#039;,&#039;5&#039;,&#039;6&#039;},&lt;br /&gt;
        {&#039;7&#039;,&#039;8&#039;,&#039;9&#039;},&lt;br /&gt;
        {&#039;*&#039;,&#039;0&#039;,&#039;#&#039;}&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	sei(); // Zapnutie interuptov pre zhasnutie LED diod&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        int k = keypad_getkey(); // Premenná pre numerickú hodnotu navrátenú z knižnice klavesnica&lt;br /&gt;
        &lt;br /&gt;
        if (k != -1 &amp;amp;&amp;amp; last_key == -1)&lt;br /&gt;
        {&lt;br /&gt;
            _delay_ms(20);  // Debounce&lt;br /&gt;
            k = keypad_getkey();&lt;br /&gt;
&lt;br /&gt;
            if (k != -1)&lt;br /&gt;
            {&lt;br /&gt;
				// Dekódovanie číselnej hodnoty na znak&lt;br /&gt;
                char key = keys[k/3][k%3];&lt;br /&gt;
&lt;br /&gt;
                // BACKSPACE (*)&lt;br /&gt;
                if (key == &#039;*&#039; &amp;amp;&amp;amp; index &amp;gt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                    guess[--index] = &#039;\0&#039;;&lt;br /&gt;
					lcd_clear();&lt;br /&gt;
					lcd_print(guess);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Kontrola spravnosti hesla po stlaceni ENTER (#) alebo automaticky po 4 znakoch&lt;br /&gt;
                else if (key == &#039;#&#039; || index == 4)&lt;br /&gt;
                {&lt;br /&gt;
                    if (index == 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        guess[4] = &#039;\0&#039;; // Nastavenie posledného znaku na string end&lt;br /&gt;
&lt;br /&gt;
                        int same = 1; // Premenná pre kontrolu či sú heslá rovnaké&lt;br /&gt;
                        for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
                        {&lt;br /&gt;
                            if (guess[i] != password[i])&lt;br /&gt;
                            {&lt;br /&gt;
                                same = 0;&lt;br /&gt;
                                break;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
						if (same) &lt;br /&gt;
						{&lt;br /&gt;
							set_bit(PORTB, PB0); // Zasvietenie LED&lt;br /&gt;
							TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
							TCNT1 = 0xC2F7; // Nastavenie TCNT1 na hodnotu aby mi po 1s vyplo LED&lt;br /&gt;
							uart_puts(&amp;quot;Spravne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
							lcd_clear();&lt;br /&gt;
							lcd_print(&amp;quot;Spravne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
						}							&lt;br /&gt;
                        else&lt;br /&gt;
						{&lt;br /&gt;
							set_bit(PORTB, PB1); // Zasvietenie LED&lt;br /&gt;
							TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
							TCNT1 = 0x85EE; // Nastavenie TCNT1 na hodnotu aby mi po 2s vyplo LED&lt;br /&gt;
							uart_puts(&amp;quot;Nespravne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
							lcd_clear();&lt;br /&gt;
							lcd_print(&amp;quot;Nespravne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
						}							&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
						// Ak je stlacene # pred tým nez sa zadá úplne heslo&lt;br /&gt;
						set_bit(PORTB, PB1); // Zasvietenie LED&lt;br /&gt;
						TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
						TCNT1 = 0x85EE; // Nastavenie TCNT1 na hodnotu aby mi po 2s vyplo LED&lt;br /&gt;
                        uart_puts(&amp;quot;Neuplne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
						lcd_clear();&lt;br /&gt;
						lcd_print(&amp;quot;Neuplne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    // Reset hádaného hesla&lt;br /&gt;
                    for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
                        guess[i] = &#039;\0&#039;;	&lt;br /&gt;
                    index = 0;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Stlacene tlacitko 0-9&lt;br /&gt;
                else if (index &amp;lt; 4 &amp;amp;&amp;amp; key != &#039;*&#039; &amp;amp;&amp;amp; key != &#039;#&#039;)&lt;br /&gt;
                {&lt;br /&gt;
                    guess[index++] = key;&lt;br /&gt;
                    guess[index] = &#039;\0&#039;;&lt;br /&gt;
					// Vypis na LCD display&lt;br /&gt;
					lcd_clear();&lt;br /&gt;
					lcd_print(guess);&lt;br /&gt;
					// Vypis na uart&lt;br /&gt;
                    uart_puts(guess);&lt;br /&gt;
                    uart_putc(&#039;\n&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // Aby sa nám tlacitko nestlacilo viac ako 1 krat&lt;br /&gt;
        last_key = k;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;klavesnica.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
void keypad_init(void);&lt;br /&gt;
int keypad_getkey(void);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;klavesnica.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 115200&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void keypad_init(void)&lt;br /&gt;
{&lt;br /&gt;
    // Riadky ako výstupy&lt;br /&gt;
    DDRA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
&lt;br /&gt;
    // Stĺpce ako vstupy&lt;br /&gt;
    DDRA &amp;amp;= ~((1&amp;lt;&amp;lt;PA4)|(1&amp;lt;&amp;lt;PA5)|(1&amp;lt;&amp;lt;PA6));&lt;br /&gt;
&lt;br /&gt;
    // Pull-up na stĺpcoch&lt;br /&gt;
    PORTA |= (1&amp;lt;&amp;lt;PA4)|(1&amp;lt;&amp;lt;PA5)|(1&amp;lt;&amp;lt;PA6);&lt;br /&gt;
&lt;br /&gt;
    // Riadky default HIGH&lt;br /&gt;
    PORTA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int keypad_getkey(void)&lt;br /&gt;
{&lt;br /&gt;
    for (int row = 0; row &amp;lt; 4; row++)&lt;br /&gt;
    {&lt;br /&gt;
        // Všetky riadky HIGH&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
&lt;br /&gt;
        // Aktuálny riadok LOW&lt;br /&gt;
        PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; row);&lt;br /&gt;
&lt;br /&gt;
        // Stabilizácia bez tohto moze prestať funkovať prvý stĺpec prtože sa nestihnú nastaviť zmeny z PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; row);&lt;br /&gt;
        _delay_us(5);&lt;br /&gt;
&lt;br /&gt;
        // Čítanie stĺpcov&lt;br /&gt;
        if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA6))) return row*3 + 0;&lt;br /&gt;
		if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA5))) return row*3 + 1;&lt;br /&gt;
		if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA4))) return row*3 + 2;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return -1; // Ak je nič nestlačené&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákCelkovýPohladNaZapojenie.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;xE_nFb5u7DY&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.&lt;br /&gt;
&lt;br /&gt;
V programe by som použil funkciu na výpis Správne/Nesprávne/Neúplné heslo nech tam nemám toľko-kŕat ten istý dlhý blok kódu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_I.&amp;diff=18780</id>
		<title>Zámok na kód I.</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_I.&amp;diff=18780"/>
		<updated>2026-05-20T10:06:18Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Adam Čulák&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:KlonArduinoMega2560.jpg|400px|thumb|center|Vývojová doska Arduino MEGA CH340.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/resources/datasheets/A000067-datasheet.pdf Dokumentácia k doske Arduino Mega 2560]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákCelkovýPohladNaZapojenie.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákMIPSProjektShémaZapojenia.png|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva základné knižnice pre uart a lcd z cvičení, pričom knižnica pre lcd bola upravená tak, aby fungovala s doskou Arduino Mega 2560. Úprava spočíva najmä v zmene používaných portov, pretože porty požité pri mikrokontroléri ATmega2560 sa líšia od portov použitých pri mikrokontroléri ATmega328P.&lt;br /&gt;
&lt;br /&gt;
Pre obsluhu 4×3 maticovej klávesnice bola vytvorená vlastná knižnica klavesnica.h. Čítanie stlačeného tlačidla je realizované pomocou princípu skenovania klávesnice po riadkoch. Všetky riadky sú štandardne nastavené na logickú úroveň HIGH (+5 V), pričom aktuálne skenovaný riadok je nastavený na LOW (uzemnený). Následne sa načítava stav stĺpcov. Ak je niektoré tlačidlo stlačené, dôjde k spojeniu príslušného riadku a stĺpca, čo umožní identifikovať konkrétne tlačidlo.&lt;br /&gt;
&lt;br /&gt;
V inicializačnej funkcii keypad_init() sú piny 22 až 25 nastavené ako výstupy pre riadky klávesnice a piny 26 až 28 ako vstupy pre stĺpce. Na vstupných pinoch sú aktivované interné pull-up rezistory, aby bol zabezpečený stabilný logický stav pri nestlačených tlačidlách.&lt;br /&gt;
&lt;br /&gt;
Funkcia keypad_getkey() postupne skenuje jednotlivé riadky. Pre každý riadok nastaví všetky riadky do stavu HIGH a následne aktuálny riadok do stavu LOW. Po krátkej stabilizačnej pauze sa kontrolujú vstupy stĺpcov. Ak je detekované stlačené tlačidlo, funkcia vráti číselnú hodnotu reprezentujúcu jeho pozíciu v matici klávesnice. Táto hodnota je vypočítaná podľa vzťahu k = 3 * r + c kde:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;k je výsledný identifikátor tlačidla&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;r predstavuje index riadku&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;c predstavuje index stĺpca&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Tento spôsob nahrádza rozsiahle podmienky typu if-else jednoduchším a prehľadnejším výpočtom. Ak nie je stlačené žiadne tlačidlo, funkcia vracia hodnotu -1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 115200&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;klavesnica.h&amp;quot;&lt;br /&gt;
#include &amp;quot;lcd_ch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Macra na nastavenie a vynulovanie bitu z cičenia&lt;br /&gt;
#define set_bit(ADDRESS, BIT) (ADDRESS |= (1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
#define clear_bit(ADDRESS, BIT) (ADDRESS &amp;amp;= ~(1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
&lt;br /&gt;
// Funkcia delay z cvičenia&lt;br /&gt;
void delay(int delay)&lt;br /&gt;
{&lt;br /&gt;
	for (int i = 0; i&amp;lt; delay; i++) _delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenie pomomocov timeru na bliknutie LED&lt;br /&gt;
ISR(TIMER1_OVF_vect)&lt;br /&gt;
{&lt;br /&gt;
	TCCR1B = 0; // Vypnutie časovača &lt;br /&gt;
	clear_bit(PORTB, PB0);&lt;br /&gt;
	clear_bit(PORTB, PB1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    char password[] = &amp;quot;0159&amp;quot;; // Premenná ukladajúca nastavené heslo&lt;br /&gt;
    char guess[5] = &amp;quot;&amp;quot;; // Premenná ukladajúca hádané heslo&lt;br /&gt;
    int index = 0; // Index pola hádaného hesla&lt;br /&gt;
	int last_key = -1; // Premenná pre ulozenie posledného stlacenného tlacitka&lt;br /&gt;
	&lt;br /&gt;
	// Inicializácia knižníc&lt;br /&gt;
    uart_init();&lt;br /&gt;
    keypad_init();&lt;br /&gt;
	lcd_init();&lt;br /&gt;
	&lt;br /&gt;
    // Nastavenie pinou pre LED&lt;br /&gt;
	set_bit(DDRB, PB0);&lt;br /&gt;
	set_bit(DDRB, PB1);&lt;br /&gt;
	&lt;br /&gt;
	TIMSK1 |= (1 &amp;lt;&amp;lt; TOIE1);&lt;br /&gt;
	&lt;br /&gt;
	// Mapovanie cisel k znakom&lt;br /&gt;
    char keys[4][3] = {&lt;br /&gt;
        {&#039;1&#039;,&#039;2&#039;,&#039;3&#039;},&lt;br /&gt;
        {&#039;4&#039;,&#039;5&#039;,&#039;6&#039;},&lt;br /&gt;
        {&#039;7&#039;,&#039;8&#039;,&#039;9&#039;},&lt;br /&gt;
        {&#039;*&#039;,&#039;0&#039;,&#039;#&#039;}&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	sei(); // Zapnutie interuptov pre zhasnutie LED diod&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        int k = keypad_getkey(); // Premenná pre numerickú hodnotu navrátenú z knižnice klavesnica&lt;br /&gt;
        &lt;br /&gt;
        if (k != -1 &amp;amp;&amp;amp; last_key == -1)&lt;br /&gt;
        {&lt;br /&gt;
            _delay_ms(20);  // Debounce&lt;br /&gt;
            k = keypad_getkey();&lt;br /&gt;
&lt;br /&gt;
            if (k != -1)&lt;br /&gt;
            {&lt;br /&gt;
				// Dekódovanie číselnej hodnoty na znak&lt;br /&gt;
                char key = keys[k/3][k%3];&lt;br /&gt;
&lt;br /&gt;
                // BACKSPACE (*)&lt;br /&gt;
                if (key == &#039;*&#039; &amp;amp;&amp;amp; index &amp;gt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                    guess[--index] = &#039;\0&#039;;&lt;br /&gt;
					lcd_clear();&lt;br /&gt;
					lcd_print(guess);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Kontrola spravnosti hesla po stlaceni ENTER (#) alebo automaticky po 4 znakoch&lt;br /&gt;
                else if (key == &#039;#&#039; || index == 4)&lt;br /&gt;
                {&lt;br /&gt;
                    if (index == 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        guess[4] = &#039;\0&#039;; // Nastavenie posledného znaku na string end&lt;br /&gt;
&lt;br /&gt;
                        int same = 1; // Premenná pre kontrolu či sú heslá rovnaké&lt;br /&gt;
                        for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
                        {&lt;br /&gt;
                            if (guess[i] != password[i])&lt;br /&gt;
                            {&lt;br /&gt;
                                same = 0;&lt;br /&gt;
                                break;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
						if (same) &lt;br /&gt;
						{&lt;br /&gt;
							set_bit(PORTB, PB0); // Zasvietenie LED&lt;br /&gt;
							TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
							TCNT1 = 0xC2F7; // Nastavenie TCNT1 na hodnotu aby mi po 1s vyplo LED&lt;br /&gt;
							uart_puts(&amp;quot;Spravne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
							lcd_clear();&lt;br /&gt;
							lcd_print(&amp;quot;Spravne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
						}							&lt;br /&gt;
                        else&lt;br /&gt;
						{&lt;br /&gt;
							set_bit(PORTB, PB1); // Zasvietenie LED&lt;br /&gt;
							TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
							TCNT1 = 0x85EE; // Nastavenie TCNT1 na hodnotu aby mi po 2s vyplo LED&lt;br /&gt;
							uart_puts(&amp;quot;Nespravne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
							lcd_clear();&lt;br /&gt;
							lcd_print(&amp;quot;Nespravne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
						}							&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
						// Ak je stlacene # pred tým nez sa zadá úplne heslo&lt;br /&gt;
						set_bit(PORTB, PB1); // Zasvietenie LED&lt;br /&gt;
						TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); // Prescale na 1024&lt;br /&gt;
						TCNT1 = 0x85EE; // Nastavenie TCNT1 na hodnotu aby mi po 2s vyplo LED&lt;br /&gt;
                        uart_puts(&amp;quot;Neuplne heslo\n&amp;quot;); // Výpis na uart&lt;br /&gt;
						lcd_clear();&lt;br /&gt;
						lcd_print(&amp;quot;Neuplne heslo&amp;quot;); // Výpis na LCD&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    // Reset hádaného hesla&lt;br /&gt;
                    for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
                        guess[i] = &#039;\0&#039;;	&lt;br /&gt;
                    index = 0;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Stlacene tlacitko 0-9&lt;br /&gt;
                else if (index &amp;lt; 4 &amp;amp;&amp;amp; key != &#039;*&#039; &amp;amp;&amp;amp; key != &#039;#&#039;)&lt;br /&gt;
                {&lt;br /&gt;
                    guess[index++] = key;&lt;br /&gt;
                    guess[index] = &#039;\0&#039;;&lt;br /&gt;
					// Vypis na LCD display&lt;br /&gt;
					lcd_clear();&lt;br /&gt;
					lcd_print(guess);&lt;br /&gt;
					// Vypis na uart&lt;br /&gt;
                    uart_puts(guess);&lt;br /&gt;
                    uart_putc(&#039;\n&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // Aby sa nám tlacitko nestlacilo viac ako 1 krat&lt;br /&gt;
        last_key = k;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;klavesnica.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
void keypad_init(void);&lt;br /&gt;
int keypad_getkey(void);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;klavesnica.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 115200&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void keypad_init(void)&lt;br /&gt;
{&lt;br /&gt;
    // Riadky ako výstupy&lt;br /&gt;
    DDRA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
&lt;br /&gt;
    // Stĺpce ako vstupy&lt;br /&gt;
    DDRA &amp;amp;= ~((1&amp;lt;&amp;lt;PA4)|(1&amp;lt;&amp;lt;PA5)|(1&amp;lt;&amp;lt;PA6));&lt;br /&gt;
&lt;br /&gt;
    // Pull-up na stĺpcoch&lt;br /&gt;
    PORTA |= (1&amp;lt;&amp;lt;PA4)|(1&amp;lt;&amp;lt;PA5)|(1&amp;lt;&amp;lt;PA6);&lt;br /&gt;
&lt;br /&gt;
    // Riadky default HIGH&lt;br /&gt;
    PORTA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int keypad_getkey(void)&lt;br /&gt;
{&lt;br /&gt;
    for (int row = 0; row &amp;lt; 4; row++)&lt;br /&gt;
    {&lt;br /&gt;
        // Všetky riadky HIGH&lt;br /&gt;
        PORTA |= (1&amp;lt;&amp;lt;PA0)|(1&amp;lt;&amp;lt;PA1)|(1&amp;lt;&amp;lt;PA2)|(1&amp;lt;&amp;lt;PA3);&lt;br /&gt;
&lt;br /&gt;
        // Aktuálny riadok LOW&lt;br /&gt;
        PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; row);&lt;br /&gt;
&lt;br /&gt;
        // Stabilizácia bez tohto moze prestať funkovať prvý stĺpec prtože sa nestihnú nastaviť zmeny z PORTA &amp;amp;= ~(1 &amp;lt;&amp;lt; row);&lt;br /&gt;
        _delay_us(5);&lt;br /&gt;
&lt;br /&gt;
        // Čítanie stĺpcov&lt;br /&gt;
        if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA6))) return row*3 + 0;&lt;br /&gt;
		if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA5))) return row*3 + 1;&lt;br /&gt;
		if (!(PINA &amp;amp; (1&amp;lt;&amp;lt;PA4))) return row*3 + 2;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return -1; // Ak je nič nestlačené&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:AdamČulákCelkovýPohladNaZapojenie.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;xE_nFb5u7DY&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_II.&amp;diff=18779</id>
		<title>Zámok na kód II.</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Z%C3%A1mok_na_k%C3%B3d_II.&amp;diff=18779"/>
		<updated>2026-05-18T11:39:50Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Meno Priezvisko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ZADANIE ==&lt;br /&gt;
&lt;br /&gt;
Mojou úlohou bolo pracovať so vstupmi vo forme tlačidiel a na základe ich postupného stláčania vytvoriť sekvenciu, ktorú systém vyhodnocuje. Program sleduje poradie stlačených tlačidiel a po zadaní celej sekvencie ho porovná s vopred definovaným správnym kódom. V prípade správneho zadania sa rozsvieti žltá LED dióda, pri nesprávnom zadaní sa rozsvieti červená LED dióda.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Arduinoko.jpg|500px|thumb|center|Mapovanie pinov mikrokontroléra ATmega328P na vývojovej doske Arduino Uno]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Datasheet k Arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Moje riešenie bolo zamerané na spracovanie vstupov z tlačidiel a vyhodnotenie ich postupného stláčania vo forme sekvencie. Použité boli štyri tlačidlá pripojené na digitálne piny D12, D8, D5 a D2. Program zaznamenáva poradie stlačení a po zadaní štyroch hodnôt ho porovnáva s vopred definovanou sekvenciou.&lt;br /&gt;
&lt;br /&gt;
Na signalizáciu výsledku boli použité dve LED diódy. Žltá LED sa rozsvieti pri správnom zadaní, zatiaľ čo červená LED krátko zabliká pri nesprávnom zadaní. Tlačidlá sú nastavené ako vstupy s internými pull-up rezistormi.&lt;br /&gt;
Program obsahuje aj jednoduchú UART komunikáciu, ktorá po vyhodnotení vypíše &amp;quot;spravny kod&amp;quot; alebo &amp;quot;nespravny kod&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Použité súčiastky:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tlačidlá&lt;br /&gt;
[[Súbor:Tlacidla.jpg|400px|thumb|center|4x Tlačidlá]]&lt;br /&gt;
&lt;br /&gt;
LED Diódy&lt;br /&gt;
[[Súbor:Ledkys.jpg|400px|thumb|center|LED diódy červená a žltá]]&lt;br /&gt;
&lt;br /&gt;
Rezistor 220Ω&lt;br /&gt;
[[Súbor:Odpor.jpg|400px|thumb|center|6x Rezistor 220Ω]]&lt;br /&gt;
&lt;br /&gt;
== Opis schémy ==&lt;br /&gt;
&lt;br /&gt;
Základom obvodu je Arduino Uno. &lt;br /&gt;
V zapojení sa nachádzajú aj dve LED diódy. Každá LED dióda má v sérii zapojený rezistor s odporom 220 Ω. Tieto rezistory slúžia na obmedzenie elektrického prúdu, aby nedošlo k vypáleniu diód alebo poškodeniu pinov Arduina. LED diódy Slúžia nám ako výstupy.&lt;br /&gt;
&lt;br /&gt;
V obvode sú štyri tlačidlá (Tlačidlo 1 až 4), ktoré slúžia ako používateľský vstup. Sú pripojené k digitálnym pinom D12, D8, D5 a D2. Pri každom tlačidle vidíme rezistor s odporom 220 Ω pripojený k napájaniu. Toto zapojenie zabezpečuje definovanú logickú úroveň na pine Arduina (logickú 1), kým nie je tlačidlo stlačené. Po stlačení sa pin prepojí so zemou (GND) a hodnota sa zmení na logickú 0.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schematics.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Súbor main.c obsahuje hlavnú logiku programu, teda nastavenie vstupov a výstupov, čítanie tlačidiel, ukladanie zadanej sekvencie a jej vyhodnotenie. Program využíva funkciu read_button(), ktorá zisťuje, ktoré tlačidlo bolo stlačené, a funkciu wait_release(), ktorá zabezpečí, aby sa jedno stlačenie nezapočítalo viackrát.&lt;br /&gt;
&lt;br /&gt;
Súbory uart.h a uart.c tvoria jednoduchú knižnicu pre sériovú komunikáciu. V hlavičkovom súbore uart.h sú deklarované funkcie pre UART komunikáciu. Ich samotná implementácia sa nachádza v súbore uart.c. Funkcia uart_init() nastavuje UART komunikáciu na rýchlosť 9600 baud, funkcia uart_putc() odosiela jeden znak a funkcia uart_puts() odosiela celý textový reťazec.&lt;br /&gt;
&lt;br /&gt;
V hlavnom programe sa po zadaní štyroch stlačení porovná zadaná sekvencia so správnym poradím. Ak sa sekvencie zhodujú, rozsvieti sa žltá LED dióda na 4 sekundy a cez UART sa vypíše text správny kód. Ak je sekvencia nesprávna, krátko zabliká červená LED dióda a vypíše sa text nesprávny kód.&lt;br /&gt;
Výpis kódu je nižšie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Hlavný kód&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart_P.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// tlačidlá&lt;br /&gt;
#define BTN_D12 PB4&lt;br /&gt;
#define BTN_D8  PB0&lt;br /&gt;
#define BTN_D5  PD5&lt;br /&gt;
#define BTN_D2  PD2&lt;br /&gt;
&lt;br /&gt;
// LED&lt;br /&gt;
#define LED_YELLOW PB5   // D13&lt;br /&gt;
#define LED_RED    PB3   // D11&lt;br /&gt;
&lt;br /&gt;
int read_button(void)&lt;br /&gt;
{&lt;br /&gt;
    if (!(PINB &amp;amp; (1 &amp;lt;&amp;lt; BTN_D12))) return 12;&lt;br /&gt;
    if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; BTN_D5)))  return 5;&lt;br /&gt;
    if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; BTN_D2)))  return 2;&lt;br /&gt;
    if (!(PINB &amp;amp; (1 &amp;lt;&amp;lt; BTN_D8)))  return 8;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void wait_release(void)&lt;br /&gt;
{&lt;br /&gt;
    while (read_button() != 0);&lt;br /&gt;
    _delay_ms(150);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    uart_init();&lt;br /&gt;
&lt;br /&gt;
    int correct[4] = {12, 5, 2, 8};  //správny kód&lt;br /&gt;
    int entered[4];&lt;br /&gt;
    int index = 0;&lt;br /&gt;
    int button;&lt;br /&gt;
    int i;&lt;br /&gt;
    int ok;&lt;br /&gt;
&lt;br /&gt;
    // LED výstupy&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; LED_YELLOW);&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; LED_RED);&lt;br /&gt;
&lt;br /&gt;
    // tlačidlá vstupy&lt;br /&gt;
    DDRB &amp;amp;= ~(1 &amp;lt;&amp;lt; BTN_D12);&lt;br /&gt;
    DDRB &amp;amp;= ~(1 &amp;lt;&amp;lt; BTN_D8);&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; BTN_D5);&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; BTN_D2);&lt;br /&gt;
&lt;br /&gt;
    // pull-up rezistory&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; BTN_D12);&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; BTN_D8);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; BTN_D5);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; BTN_D2);&lt;br /&gt;
&lt;br /&gt;
    // LED vypnúť&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_YELLOW);&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_RED);&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        button = read_button();&lt;br /&gt;
&lt;br /&gt;
        if (button != 0)&lt;br /&gt;
        {&lt;br /&gt;
            _delay_ms(80); // odstránenie zákmitov&lt;br /&gt;
&lt;br /&gt;
            if (read_button() == button)&lt;br /&gt;
            {&lt;br /&gt;
                entered[index] = button;&lt;br /&gt;
                index++;&lt;br /&gt;
&lt;br /&gt;
                wait_release();&lt;br /&gt;
&lt;br /&gt;
                if (index == 4) //vyhodnotenie až po 4 stlačeniach&lt;br /&gt;
                {&lt;br /&gt;
                    ok = 1;&lt;br /&gt;
&lt;br /&gt;
                    for (i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
                    {&lt;br /&gt;
                        if (entered[i] != correct[i])&lt;br /&gt;
                        {&lt;br /&gt;
                            ok = 0;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    if (ok == 1)&lt;br /&gt;
                    {&lt;br /&gt;
                        uart_puts(&amp;quot;spravny kod\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                        PORTB |= (1 &amp;lt;&amp;lt; LED_YELLOW);&lt;br /&gt;
                        _delay_ms(4000);&lt;br /&gt;
                        PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_YELLOW);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        uart_puts(&amp;quot;nespravny kod\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                        PORTB |= (1 &amp;lt;&amp;lt; LED_RED);&lt;br /&gt;
                        _delay_ms(700);&lt;br /&gt;
                        PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; LED_RED);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    index = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart_P.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart_P.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    UBRR0H = 0;&lt;br /&gt;
    UBRR0L = 103;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0); // povolene RX TX&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00); // 8-bit data&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_putc(char c)  //sluzy na vypis spravny/nespravny&lt;br /&gt;
{&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0)));&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s)  //nepouzivam v main&lt;br /&gt;
{&lt;br /&gt;
    while (*s)&lt;br /&gt;
    {&lt;br /&gt;
        uart_putc(*s);&lt;br /&gt;
        s++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart_P.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
void uart_putc(char c);  //vypis spravny/nespravny kod&lt;br /&gt;
void uart_puts(const char *s); // chcel som pridať este  ak kliknem D12 tak mi vypise ake tlacidlo som stlacil ale v main kode som to nepouzil&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:LukasHegedus_zamok_na_kod.zip|LukasHegedus_zamok_na_kod.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkciu riešenia som overil dvomi spôsobmi. &lt;br /&gt;
&lt;br /&gt;
1. Najskôr som zadal správny kód a pozeral na žltú LED diódu ako sa rozsvieti na 4 sekundy a pozoroval som terminál či vypisuje &amp;quot;spravny kod&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. V druhom kroku som zadal nesprávny kód a sledoval blikanie červenej LED diódy a pozoroval výpis terminálu &amp;quot;nespravny kod&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Zapojenieeeee.jpg|400px|thumb|center|Zapojenie na doske Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;https://youtu.be/aHdixdCj9_c&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Alarm_s_PIR_detektorom_pohybu&amp;diff=18778</id>
		<title>Alarm s PIR detektorom pohybu</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Alarm_s_PIR_detektorom_pohybu&amp;diff=18778"/>
		<updated>2026-05-17T13:32:18Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Filip Hreha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Mojou úlohou bolo zapojiť a naprogramovať Alarm, ktorý využíva PIR detektor pohybu&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Alarm_s_PIR_detektorom_pohybu&amp;diff=18777</id>
		<title>Alarm s PIR detektorom pohybu</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Alarm_s_PIR_detektorom_pohybu&amp;diff=18777"/>
		<updated>2026-05-17T13:29:25Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Filip Hreha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Mojou úlohou bolo zapojiť a naprogramovať Alarm, ktorý využíva PIR detektor pohybu&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18776</id>
		<title>Dekodér morzeovky</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18776"/>
		<updated>2026-05-16T18:55:56Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Dekodér morzeovky =&lt;br /&gt;
&lt;br /&gt;
Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Oleh Chuiko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.&lt;br /&gt;
&lt;br /&gt;
Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) a dlhé stlačenie predstavuje čiarku (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob]&lt;br /&gt;
* [[https://en.wikipedia.org/wiki/Morse_code](https://en.wikipedia.org/wiki/Morse_code) Morse code]&lt;br /&gt;
* [[https://www.microchip.com/en-us/product/atmega328p](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Analýza a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ako základ&#039;&#039;&#039; pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre ovládanie dekodéra&#039;&#039;&#039; bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Program priebežne sleduje&#039;&#039;&#039; stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dekódovanie Morseovej abecedy&#039;&#039;&#039; je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UART komunikácia&#039;&#039;&#039; slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]]&lt;br /&gt;
&lt;br /&gt;
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.&lt;br /&gt;
&lt;br /&gt;
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno.&lt;br /&gt;
&lt;br /&gt;
Výsledný znak sa následne odošle cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Hlavné časti programu:&lt;br /&gt;
&lt;br /&gt;
* čítanie tlačidla&lt;br /&gt;
* meranie dĺžky stlačenia&lt;br /&gt;
* rozlíšenie bodky a čiarky&lt;br /&gt;
* ukladanie Morse sekvencie do buffera&lt;br /&gt;
* dekódovanie znakov&lt;br /&gt;
* výpis cez UART&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT)    (ADDRESS |=  (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT)  (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#define LED1    PB5&lt;br /&gt;
#define SW1     PB3&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
&lt;br /&gt;
FILE uart_output = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
const char *morse;&lt;br /&gt;
char letter;&lt;br /&gt;
&lt;br /&gt;
} MorseCode;&lt;br /&gt;
&lt;br /&gt;
MorseCode morse_table[] =&lt;br /&gt;
{&lt;br /&gt;
{&amp;quot;.-&amp;quot;,    &#039;A&#039;},&lt;br /&gt;
{&amp;quot;-...&amp;quot;,  &#039;B&#039;},&lt;br /&gt;
{&amp;quot;-.-.&amp;quot;,  &#039;C&#039;},&lt;br /&gt;
{&amp;quot;-..&amp;quot;,   &#039;D&#039;},&lt;br /&gt;
{&amp;quot;.&amp;quot;,     &#039;E&#039;},&lt;br /&gt;
{&amp;quot;..-.&amp;quot;,  &#039;F&#039;},&lt;br /&gt;
{&amp;quot;--.&amp;quot;,   &#039;G&#039;},&lt;br /&gt;
{&amp;quot;....&amp;quot;,  &#039;H&#039;},&lt;br /&gt;
{&amp;quot;..&amp;quot;,    &#039;I&#039;},&lt;br /&gt;
{&amp;quot;.---&amp;quot;,  &#039;J&#039;},&lt;br /&gt;
{&amp;quot;-.-&amp;quot;,   &#039;K&#039;},&lt;br /&gt;
{&amp;quot;.-..&amp;quot;,  &#039;L&#039;},&lt;br /&gt;
{&amp;quot;--&amp;quot;,    &#039;M&#039;},&lt;br /&gt;
{&amp;quot;-.&amp;quot;,    &#039;N&#039;},&lt;br /&gt;
{&amp;quot;---&amp;quot;,   &#039;O&#039;},&lt;br /&gt;
{&amp;quot;.--.&amp;quot;,  &#039;P&#039;},&lt;br /&gt;
{&amp;quot;--.-&amp;quot;,  &#039;Q&#039;},&lt;br /&gt;
{&amp;quot;.-.&amp;quot;,   &#039;R&#039;},&lt;br /&gt;
{&amp;quot;...&amp;quot;,   &#039;S&#039;},&lt;br /&gt;
{&amp;quot;-&amp;quot;,     &#039;T&#039;},&lt;br /&gt;
{&amp;quot;..-&amp;quot;,   &#039;U&#039;},&lt;br /&gt;
{&amp;quot;...-&amp;quot;,  &#039;V&#039;},&lt;br /&gt;
{&amp;quot;.--&amp;quot;,   &#039;W&#039;},&lt;br /&gt;
{&amp;quot;-..-&amp;quot;,  &#039;X&#039;},&lt;br /&gt;
{&amp;quot;-.--&amp;quot;,  &#039;Y&#039;},&lt;br /&gt;
{&amp;quot;--..&amp;quot;,  &#039;Z&#039;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MORSE_TABLE_SIZE 26&lt;br /&gt;
&lt;br /&gt;
void delay_ms_variable(uint16_t ms)&lt;br /&gt;
{&lt;br /&gt;
while(ms--)&lt;br /&gt;
{&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char decode_morse(char *code)&lt;br /&gt;
{&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
for(i = 0; i &amp;lt; MORSE_TABLE_SIZE; i++)&lt;br /&gt;
{&lt;br /&gt;
    if(strcmp(code, morse_table[i].morse) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return morse_table[i].letter;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return &#039;?&#039;;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
uint16_t press_time = 0;&lt;br /&gt;
uint16_t pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
uint8_t button_pressed = 0;&lt;br /&gt;
&lt;br /&gt;
char morse_buffer[10];&lt;br /&gt;
uint8_t morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
char decoded_char;&lt;br /&gt;
&lt;br /&gt;
set_bit(DDRB, LED1);&lt;br /&gt;
&lt;br /&gt;
clear_bit(DDRB, SW1);&lt;br /&gt;
set_bit(PORTB, SW1);&lt;br /&gt;
&lt;br /&gt;
uart_init();&lt;br /&gt;
&lt;br /&gt;
stdout = &amp;amp;uart_output;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
printf(&amp;quot;semestralny project Oleh Chuiko r&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
    if(bit_is_clear(PINB, SW1))&lt;br /&gt;
    {&lt;br /&gt;
        _delay_ms(20);&lt;br /&gt;
&lt;br /&gt;
        if(bit_is_clear(PINB, SW1))&lt;br /&gt;
        {&lt;br /&gt;
            button_pressed = 1;&lt;br /&gt;
&lt;br /&gt;
            press_time = 0;&lt;br /&gt;
&lt;br /&gt;
            set_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            while(bit_is_clear(PINB, SW1))&lt;br /&gt;
            {&lt;br /&gt;
                delay_ms_variable(10);&lt;br /&gt;
                press_time += 10;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            clear_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            if(press_time &amp;lt; 400)&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;.&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;-&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(button_pressed)&lt;br /&gt;
    {&lt;br /&gt;
        delay_ms_variable(10);&lt;br /&gt;
        pause_time += 10;&lt;br /&gt;
&lt;br /&gt;
        if(pause_time &amp;gt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
            morse_buffer[morse_index] = &#039;�&#039;;&lt;br /&gt;
&lt;br /&gt;
            decoded_char = decode_morse(morse_buffer);&lt;br /&gt;
&lt;br /&gt;
            printf(&amp;quot; -&amp;gt; %c&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;, decoded_char);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
            morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
            memset(morse_buffer, 0, sizeof(morse_buffer));&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
            button_pressed = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.h                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#define LED PB5&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)&lt;br /&gt;
&lt;br /&gt;
void hw_init( void );&lt;br /&gt;
void uart_init( void );&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream );&lt;br /&gt;
void uart_puts( const char *s );&lt;br /&gt;
&lt;br /&gt;
char uart_getc( void );&lt;br /&gt;
&lt;br /&gt;
void delay(int delay);&lt;br /&gt;
&lt;br /&gt;
#endif /* UART_H_ */ &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.c                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void hw_init( void )&lt;br /&gt;
{&lt;br /&gt;
DDRB |= (1&amp;lt;&amp;lt;LED);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init( void )&lt;br /&gt;
{&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UBRR0H = UBRRH_VALUE;&lt;br /&gt;
UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);&lt;br /&gt;
UCSR0B = _BV(RXEN0) | _BV(TXEN0);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream )&lt;br /&gt;
{&lt;br /&gt;
if (c == &#039;&lt;br /&gt;
&#039;)&lt;br /&gt;
uart_putc(&#039;&lt;br /&gt;
&#039;,stream);&lt;br /&gt;
&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = c;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void delay(int delay)&lt;br /&gt;
{&lt;br /&gt;
for (int i=1; i&amp;lt;=delay; i++)&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt; &amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo.&lt;br /&gt;
Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.&lt;br /&gt;
&lt;br /&gt;
Počas testovania bolo sledované:&lt;br /&gt;
&lt;br /&gt;
* správne rozpoznávanie bodiek a čiarok&lt;br /&gt;
* stabilita merania času stlačenia tlačidla&lt;br /&gt;
* správne dekódovanie znakov&lt;br /&gt;
* správny výpis cez UART&lt;br /&gt;
&lt;br /&gt;
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;vh-u5UzWHfU&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.&lt;br /&gt;
&lt;br /&gt;
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18775</id>
		<title>Dekodér morzeovky</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18775"/>
		<updated>2026-05-16T18:51:41Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Dekodér morzeovky =&lt;br /&gt;
&lt;br /&gt;
Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Oleh Chuiko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.&lt;br /&gt;
&lt;br /&gt;
Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) a dlhé stlačenie predstavuje čiarku (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob]&lt;br /&gt;
* [[https://en.wikipedia.org/wiki/Morse_code](https://en.wikipedia.org/wiki/Morse_code) Morse code]&lt;br /&gt;
* [[https://www.microchip.com/en-us/product/atmega328p](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P]&lt;br /&gt;
&lt;br /&gt;
**TOC**&lt;br /&gt;
&lt;br /&gt;
== Analýza a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ako základ&#039;&#039;&#039; pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre ovládanie dekodéra&#039;&#039;&#039; bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Program priebežne sleduje&#039;&#039;&#039; stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dekódovanie Morseovej abecedy&#039;&#039;&#039; je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UART komunikácia&#039;&#039;&#039; slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]]&lt;br /&gt;
&lt;br /&gt;
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.&lt;br /&gt;
&lt;br /&gt;
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno.&lt;br /&gt;
&lt;br /&gt;
Výsledný znak sa následne odošle cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Hlavné časti programu:&lt;br /&gt;
&lt;br /&gt;
* čítanie tlačidla&lt;br /&gt;
* meranie dĺžky stlačenia&lt;br /&gt;
* rozlíšenie bodky a čiarky&lt;br /&gt;
* ukladanie Morse sekvencie do buffera&lt;br /&gt;
* dekódovanie znakov&lt;br /&gt;
* výpis cez UART&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT)    (ADDRESS |=  (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT)  (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#define LED1    PB5&lt;br /&gt;
#define SW1     PB3&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
&lt;br /&gt;
FILE uart_output = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
const char *morse;&lt;br /&gt;
char letter;&lt;br /&gt;
&lt;br /&gt;
} MorseCode;&lt;br /&gt;
&lt;br /&gt;
MorseCode morse_table[] =&lt;br /&gt;
{&lt;br /&gt;
{&amp;quot;.-&amp;quot;,    &#039;A&#039;},&lt;br /&gt;
{&amp;quot;-...&amp;quot;,  &#039;B&#039;},&lt;br /&gt;
{&amp;quot;-.-.&amp;quot;,  &#039;C&#039;},&lt;br /&gt;
{&amp;quot;-..&amp;quot;,   &#039;D&#039;},&lt;br /&gt;
{&amp;quot;.&amp;quot;,     &#039;E&#039;},&lt;br /&gt;
{&amp;quot;..-.&amp;quot;,  &#039;F&#039;},&lt;br /&gt;
{&amp;quot;--.&amp;quot;,   &#039;G&#039;},&lt;br /&gt;
{&amp;quot;....&amp;quot;,  &#039;H&#039;},&lt;br /&gt;
{&amp;quot;..&amp;quot;,    &#039;I&#039;},&lt;br /&gt;
{&amp;quot;.---&amp;quot;,  &#039;J&#039;},&lt;br /&gt;
{&amp;quot;-.-&amp;quot;,   &#039;K&#039;},&lt;br /&gt;
{&amp;quot;.-..&amp;quot;,  &#039;L&#039;},&lt;br /&gt;
{&amp;quot;--&amp;quot;,    &#039;M&#039;},&lt;br /&gt;
{&amp;quot;-.&amp;quot;,    &#039;N&#039;},&lt;br /&gt;
{&amp;quot;---&amp;quot;,   &#039;O&#039;},&lt;br /&gt;
{&amp;quot;.--.&amp;quot;,  &#039;P&#039;},&lt;br /&gt;
{&amp;quot;--.-&amp;quot;,  &#039;Q&#039;},&lt;br /&gt;
{&amp;quot;.-.&amp;quot;,   &#039;R&#039;},&lt;br /&gt;
{&amp;quot;...&amp;quot;,   &#039;S&#039;},&lt;br /&gt;
{&amp;quot;-&amp;quot;,     &#039;T&#039;},&lt;br /&gt;
{&amp;quot;..-&amp;quot;,   &#039;U&#039;},&lt;br /&gt;
{&amp;quot;...-&amp;quot;,  &#039;V&#039;},&lt;br /&gt;
{&amp;quot;.--&amp;quot;,   &#039;W&#039;},&lt;br /&gt;
{&amp;quot;-..-&amp;quot;,  &#039;X&#039;},&lt;br /&gt;
{&amp;quot;-.--&amp;quot;,  &#039;Y&#039;},&lt;br /&gt;
{&amp;quot;--..&amp;quot;,  &#039;Z&#039;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MORSE_TABLE_SIZE 26&lt;br /&gt;
&lt;br /&gt;
void delay_ms_variable(uint16_t ms)&lt;br /&gt;
{&lt;br /&gt;
while(ms--)&lt;br /&gt;
{&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char decode_morse(char *code)&lt;br /&gt;
{&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
for(i = 0; i &amp;lt; MORSE_TABLE_SIZE; i++)&lt;br /&gt;
{&lt;br /&gt;
    if(strcmp(code, morse_table[i].morse) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return morse_table[i].letter;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return &#039;?&#039;;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
uint16_t press_time = 0;&lt;br /&gt;
uint16_t pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
uint8_t button_pressed = 0;&lt;br /&gt;
&lt;br /&gt;
char morse_buffer[10];&lt;br /&gt;
uint8_t morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
char decoded_char;&lt;br /&gt;
&lt;br /&gt;
set_bit(DDRB, LED1);&lt;br /&gt;
&lt;br /&gt;
clear_bit(DDRB, SW1);&lt;br /&gt;
set_bit(PORTB, SW1);&lt;br /&gt;
&lt;br /&gt;
uart_init();&lt;br /&gt;
&lt;br /&gt;
stdout = &amp;amp;uart_output;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
printf(&amp;quot;semestralny project Oleh Chuiko r&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
    if(bit_is_clear(PINB, SW1))&lt;br /&gt;
    {&lt;br /&gt;
        _delay_ms(20);&lt;br /&gt;
&lt;br /&gt;
        if(bit_is_clear(PINB, SW1))&lt;br /&gt;
        {&lt;br /&gt;
            button_pressed = 1;&lt;br /&gt;
&lt;br /&gt;
            press_time = 0;&lt;br /&gt;
&lt;br /&gt;
            set_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            while(bit_is_clear(PINB, SW1))&lt;br /&gt;
            {&lt;br /&gt;
                delay_ms_variable(10);&lt;br /&gt;
                press_time += 10;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            clear_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            if(press_time &amp;lt; 400)&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;.&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;-&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(button_pressed)&lt;br /&gt;
    {&lt;br /&gt;
        delay_ms_variable(10);&lt;br /&gt;
        pause_time += 10;&lt;br /&gt;
&lt;br /&gt;
        if(pause_time &amp;gt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
            morse_buffer[morse_index] = &#039;�&#039;;&lt;br /&gt;
&lt;br /&gt;
            decoded_char = decode_morse(morse_buffer);&lt;br /&gt;
&lt;br /&gt;
            printf(&amp;quot; -&amp;gt; %c&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;, decoded_char);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
            morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
            memset(morse_buffer, 0, sizeof(morse_buffer));&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
            button_pressed = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.h                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#define LED PB5&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)&lt;br /&gt;
&lt;br /&gt;
void hw_init( void );&lt;br /&gt;
void uart_init( void );&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream );&lt;br /&gt;
void uart_puts( const char *s );&lt;br /&gt;
&lt;br /&gt;
char uart_getc( void );&lt;br /&gt;
&lt;br /&gt;
void delay(int delay);&lt;br /&gt;
&lt;br /&gt;
#endif /* UART_H_ */ &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.c                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void hw_init( void )&lt;br /&gt;
{&lt;br /&gt;
DDRB |= (1&amp;lt;&amp;lt;LED);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init( void )&lt;br /&gt;
{&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UBRR0H = UBRRH_VALUE;&lt;br /&gt;
UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);&lt;br /&gt;
UCSR0B = _BV(RXEN0) | _BV(TXEN0);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream )&lt;br /&gt;
{&lt;br /&gt;
if (c == &#039;&lt;br /&gt;
&#039;)&lt;br /&gt;
uart_putc(&#039;&lt;br /&gt;
&#039;,stream);&lt;br /&gt;
&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = c;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void delay(int delay)&lt;br /&gt;
{&lt;br /&gt;
for (int i=1; i&amp;lt;=delay; i++)&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt; &amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo.&lt;br /&gt;
Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.&lt;br /&gt;
&lt;br /&gt;
Počas testovania bolo sledované:&lt;br /&gt;
&lt;br /&gt;
* správne rozpoznávanie bodiek a čiarok&lt;br /&gt;
* stabilita merania času stlačenia tlačidla&lt;br /&gt;
* správne dekódovanie znakov&lt;br /&gt;
* správny výpis cez UART&lt;br /&gt;
&lt;br /&gt;
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;vh-u5UzWHfU&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.&lt;br /&gt;
&lt;br /&gt;
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Morse_device.jpg&amp;diff=18773</id>
		<title>Súbor:Morse device.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Morse_device.jpg&amp;diff=18773"/>
		<updated>2026-05-16T18:47:14Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18772</id>
		<title>Dekodér morzeovky</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18772"/>
		<updated>2026-05-16T18:43:44Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Dekodér morzeovky =&lt;br /&gt;
&lt;br /&gt;
Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Oleh Chuiko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.&lt;br /&gt;
&lt;br /&gt;
Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) a dlhé stlačenie predstavuje čiarku (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|450px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob]&lt;br /&gt;
* [[https://en.wikipedia.org/wiki/Morse_code](https://en.wikipedia.org/wiki/Morse_code) Morse code]&lt;br /&gt;
* [[https://www.microchip.com/en-us/product/atmega328p](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P]&lt;br /&gt;
&lt;br /&gt;
**TOC**&lt;br /&gt;
&lt;br /&gt;
== Analýza a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ako základ&#039;&#039;&#039; pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre ovládanie dekodéra&#039;&#039;&#039; bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Program priebežne sleduje&#039;&#039;&#039; stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dekódovanie Morseovej abecedy&#039;&#039;&#039; je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UART komunikácia&#039;&#039;&#039; slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]]&lt;br /&gt;
&lt;br /&gt;
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.&lt;br /&gt;
&lt;br /&gt;
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno.&lt;br /&gt;
&lt;br /&gt;
Výsledný znak sa následne odošle cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Hlavné časti programu:&lt;br /&gt;
&lt;br /&gt;
* čítanie tlačidla&lt;br /&gt;
* meranie dĺžky stlačenia&lt;br /&gt;
* rozlíšenie bodky a čiarky&lt;br /&gt;
* ukladanie Morse sekvencie do buffera&lt;br /&gt;
* dekódovanie znakov&lt;br /&gt;
* výpis cez UART&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT)    (ADDRESS |=  (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT)  (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#define LED1    PB5&lt;br /&gt;
#define SW1     PB3&lt;br /&gt;
&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
&lt;br /&gt;
FILE uart_output = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
const char *morse;&lt;br /&gt;
char letter;&lt;br /&gt;
&lt;br /&gt;
} MorseCode;&lt;br /&gt;
&lt;br /&gt;
MorseCode morse_table[] =&lt;br /&gt;
{&lt;br /&gt;
{&amp;quot;.-&amp;quot;,    &#039;A&#039;},&lt;br /&gt;
{&amp;quot;-...&amp;quot;,  &#039;B&#039;},&lt;br /&gt;
{&amp;quot;-.-.&amp;quot;,  &#039;C&#039;},&lt;br /&gt;
{&amp;quot;-..&amp;quot;,   &#039;D&#039;},&lt;br /&gt;
{&amp;quot;.&amp;quot;,     &#039;E&#039;},&lt;br /&gt;
{&amp;quot;..-.&amp;quot;,  &#039;F&#039;},&lt;br /&gt;
{&amp;quot;--.&amp;quot;,   &#039;G&#039;},&lt;br /&gt;
{&amp;quot;....&amp;quot;,  &#039;H&#039;},&lt;br /&gt;
{&amp;quot;..&amp;quot;,    &#039;I&#039;},&lt;br /&gt;
{&amp;quot;.---&amp;quot;,  &#039;J&#039;},&lt;br /&gt;
{&amp;quot;-.-&amp;quot;,   &#039;K&#039;},&lt;br /&gt;
{&amp;quot;.-..&amp;quot;,  &#039;L&#039;},&lt;br /&gt;
{&amp;quot;--&amp;quot;,    &#039;M&#039;},&lt;br /&gt;
{&amp;quot;-.&amp;quot;,    &#039;N&#039;},&lt;br /&gt;
{&amp;quot;---&amp;quot;,   &#039;O&#039;},&lt;br /&gt;
{&amp;quot;.--.&amp;quot;,  &#039;P&#039;},&lt;br /&gt;
{&amp;quot;--.-&amp;quot;,  &#039;Q&#039;},&lt;br /&gt;
{&amp;quot;.-.&amp;quot;,   &#039;R&#039;},&lt;br /&gt;
{&amp;quot;...&amp;quot;,   &#039;S&#039;},&lt;br /&gt;
{&amp;quot;-&amp;quot;,     &#039;T&#039;},&lt;br /&gt;
{&amp;quot;..-&amp;quot;,   &#039;U&#039;},&lt;br /&gt;
{&amp;quot;...-&amp;quot;,  &#039;V&#039;},&lt;br /&gt;
{&amp;quot;.--&amp;quot;,   &#039;W&#039;},&lt;br /&gt;
{&amp;quot;-..-&amp;quot;,  &#039;X&#039;},&lt;br /&gt;
{&amp;quot;-.--&amp;quot;,  &#039;Y&#039;},&lt;br /&gt;
{&amp;quot;--..&amp;quot;,  &#039;Z&#039;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MORSE_TABLE_SIZE 26&lt;br /&gt;
&lt;br /&gt;
void delay_ms_variable(uint16_t ms)&lt;br /&gt;
{&lt;br /&gt;
while(ms--)&lt;br /&gt;
{&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char decode_morse(char *code)&lt;br /&gt;
{&lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
for(i = 0; i &amp;lt; MORSE_TABLE_SIZE; i++)&lt;br /&gt;
{&lt;br /&gt;
    if(strcmp(code, morse_table[i].morse) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return morse_table[i].letter;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return &#039;?&#039;;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
uint16_t press_time = 0;&lt;br /&gt;
uint16_t pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
uint8_t button_pressed = 0;&lt;br /&gt;
&lt;br /&gt;
char morse_buffer[10];&lt;br /&gt;
uint8_t morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
char decoded_char;&lt;br /&gt;
&lt;br /&gt;
set_bit(DDRB, LED1);&lt;br /&gt;
&lt;br /&gt;
clear_bit(DDRB, SW1);&lt;br /&gt;
set_bit(PORTB, SW1);&lt;br /&gt;
&lt;br /&gt;
uart_init();&lt;br /&gt;
&lt;br /&gt;
stdout = &amp;amp;uart_output;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
printf(&amp;quot;semestralny project Oleh Chuiko r&lt;br /&gt;
&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
    if(bit_is_clear(PINB, SW1))&lt;br /&gt;
    {&lt;br /&gt;
        _delay_ms(20);&lt;br /&gt;
&lt;br /&gt;
        if(bit_is_clear(PINB, SW1))&lt;br /&gt;
        {&lt;br /&gt;
            button_pressed = 1;&lt;br /&gt;
&lt;br /&gt;
            press_time = 0;&lt;br /&gt;
&lt;br /&gt;
            set_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            while(bit_is_clear(PINB, SW1))&lt;br /&gt;
            {&lt;br /&gt;
                delay_ms_variable(10);&lt;br /&gt;
                press_time += 10;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            clear_bit(PORTB, LED1);&lt;br /&gt;
&lt;br /&gt;
            if(press_time &amp;lt; 400)&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;.&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                morse_buffer[morse_index] = &#039;-&#039;;&lt;br /&gt;
                morse_index++;&lt;br /&gt;
&lt;br /&gt;
                printf(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(button_pressed)&lt;br /&gt;
    {&lt;br /&gt;
        delay_ms_variable(10);&lt;br /&gt;
        pause_time += 10;&lt;br /&gt;
&lt;br /&gt;
        if(pause_time &amp;gt; 1000)&lt;br /&gt;
        {&lt;br /&gt;
            morse_buffer[morse_index] = &#039;�&#039;;&lt;br /&gt;
&lt;br /&gt;
            decoded_char = decode_morse(morse_buffer);&lt;br /&gt;
&lt;br /&gt;
            printf(&amp;quot; -&amp;gt; %c&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;quot;, decoded_char);&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
            morse_index = 0;&lt;br /&gt;
&lt;br /&gt;
            memset(morse_buffer, 0, sizeof(morse_buffer));&lt;br /&gt;
&lt;br /&gt;
            pause_time = 0;&lt;br /&gt;
&lt;br /&gt;
            button_pressed = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.h                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#define LED PB5&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)&lt;br /&gt;
&lt;br /&gt;
void hw_init( void );&lt;br /&gt;
void uart_init( void );&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream );&lt;br /&gt;
void uart_puts( const char *s );&lt;br /&gt;
&lt;br /&gt;
char uart_getc( void );&lt;br /&gt;
&lt;br /&gt;
void delay(int delay);&lt;br /&gt;
&lt;br /&gt;
#endif /* UART_H_ */ &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
/* FileName:             uart.c                                              */&lt;br /&gt;
/* ************************************************************************* */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void hw_init( void )&lt;br /&gt;
{&lt;br /&gt;
DDRB |= (1&amp;lt;&amp;lt;LED);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init( void )&lt;br /&gt;
{&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UBRR0H = UBRRH_VALUE;&lt;br /&gt;
UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);&lt;br /&gt;
UCSR0B = _BV(RXEN0) | _BV(TXEN0);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc( char c, FILE *stream )&lt;br /&gt;
{&lt;br /&gt;
if (c == &#039;&lt;br /&gt;
&#039;)&lt;br /&gt;
uart_putc(&#039;&lt;br /&gt;
&#039;,stream);&lt;br /&gt;
&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = c;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char uart_getc(void)&lt;br /&gt;
{&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void delay(int delay)&lt;br /&gt;
{&lt;br /&gt;
for (int i=1; i&amp;lt;=delay; i++)&lt;br /&gt;
_delay_ms(1);&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt; &amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo.&lt;br /&gt;
Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.&lt;br /&gt;
&lt;br /&gt;
Počas testovania bolo sledované:&lt;br /&gt;
&lt;br /&gt;
* správne rozpoznávanie bodiek a čiarok&lt;br /&gt;
* stabilita merania času stlačenia tlačidla&lt;br /&gt;
* správne dekódovanie znakov&lt;br /&gt;
* správny výpis cez UART&lt;br /&gt;
&lt;br /&gt;
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;vh-u5UzWHfU&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.&lt;br /&gt;
&lt;br /&gt;
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18770</id>
		<title>Dekodér morzeovky</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18770"/>
		<updated>2026-05-16T18:39:32Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Dekodér morzeovky =&lt;br /&gt;
&lt;br /&gt;
Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Oleh Chuiko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.&lt;br /&gt;
&lt;br /&gt;
Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) a dlhé stlačenie predstavuje čiarku (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|450px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob]&lt;br /&gt;
* [[https://en.wikipedia.org/wiki/Morse_code](https://en.wikipedia.org/wiki/Morse_code) Morse code]&lt;br /&gt;
* [[https://www.microchip.com/en-us/product/atmega328p](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P]&lt;br /&gt;
&lt;br /&gt;
**TOC**&lt;br /&gt;
&lt;br /&gt;
== Analýza a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ako základ&#039;&#039;&#039; pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre ovládanie dekodéra&#039;&#039;&#039; bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Program priebežne sleduje&#039;&#039;&#039; stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dekódovanie Morseovej abecedy&#039;&#039;&#039; je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UART komunikácia&#039;&#039;&#039; slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]]&lt;br /&gt;
&lt;br /&gt;
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.&lt;br /&gt;
&lt;br /&gt;
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno.&lt;br /&gt;
&lt;br /&gt;
Výsledný znak sa následne odošle cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
Hlavné časti programu:&lt;br /&gt;
&lt;br /&gt;
* čítanie tlačidla&lt;br /&gt;
* meranie dĺžky stlačenia&lt;br /&gt;
* rozlíšenie bodky a čiarky&lt;br /&gt;
* ukladanie Morse sekvencie do buffera&lt;br /&gt;
* dekódovanie znakov&lt;br /&gt;
* výpis cez UART&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define BUTTON_PIN PB3&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
uart_init();&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    /* Morse decoder logic */&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define set_bit(ADDRESS, BIT)(ADDRESS |= (1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
#define clear_bit(ADDRESS, BIT)(ADDRESS &amp;amp;= ~(1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
int uart_putc(char c, FILE * stream);&lt;br /&gt;
void uart_puts(const char * s);&lt;br /&gt;
char uart_getc(void);&lt;br /&gt;
&lt;br /&gt;
#endif &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
UBRR0H = UBRRH_VALUE;&lt;br /&gt;
UBRR0L = UBRRL_VALUE;&lt;br /&gt;
&lt;br /&gt;
#if USE_2X&lt;br /&gt;
UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);&lt;br /&gt;
UCSR0B = _BV(RXEN0) | _BV(TXEN0);&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE * stream)&lt;br /&gt;
{&lt;br /&gt;
if (c == &#039;\n&#039;)&lt;br /&gt;
{&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = &#039;\r&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = c;&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
} &amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tab&amp;gt; &amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo.&lt;br /&gt;
Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.&lt;br /&gt;
&lt;br /&gt;
Počas testovania bolo sledované:&lt;br /&gt;
&lt;br /&gt;
* správne rozpoznávanie bodiek a čiarok&lt;br /&gt;
* stabilita merania času stlačenia tlačidla&lt;br /&gt;
* správne dekódovanie znakov&lt;br /&gt;
* správny výpis cez UART&lt;br /&gt;
&lt;br /&gt;
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;vh-u5UzWHfU&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.&lt;br /&gt;
&lt;br /&gt;
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18768</id>
		<title>Dekodér morzeovky</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Dekod%C3%A9r_morzeovky&amp;diff=18768"/>
		<updated>2026-05-16T18:37:08Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Oleh Chuiko&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.&lt;br /&gt;
&lt;br /&gt;
Mikropočítač prijíma vstup z tlačidla, meria dĺžku jeho stlačenia a podľa času rozlišuje krátke a dlhé impulzy Morseovej abecedy.&lt;br /&gt;
Krátke stlačenie predstavuje bodku (.) a dlhé stlačenie predstavuje čiarku (-).&lt;br /&gt;
&lt;br /&gt;
Postupne zadané symboly sa ukladajú do buffera a následne sa dekódujú na jednotlivé písmená. Výsledok sa vypisuje cez UART do sériového terminálu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|450px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Morse_code Morse code]&lt;br /&gt;
&lt;br /&gt;
[https://www.microchip.com/en-us/product/atmega328p Dokumentácia ATmega328P]&lt;br /&gt;
&lt;br /&gt;
TOC&lt;br /&gt;
&lt;br /&gt;
== Analýza a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Projekt využíva tlačidlo ako vstupný prvok pre zadávanie Morseovej abecedy. Mikrokontrolér priebežne sleduje stav tlačidla a meria čas jeho stlačenia.&lt;br /&gt;
&lt;br /&gt;
Ak je tlačidlo stlačené krátko, program zaznamená bodku. Pri dlhšom stlačení sa zaznamená čiarka. Takto vytvorená sekvencia sa uloží do textového buffera.&lt;br /&gt;
&lt;br /&gt;
Po ukončení zadávania znaku program porovná prijatú sekvenciu s tabuľkou Morseových kódov a vyhľadá zodpovedajúce písmeno.&lt;br /&gt;
Výsledný znak sa následne odošle cez UART do počítača.&lt;br /&gt;
&lt;br /&gt;
Pri projekte bola použitá:&lt;br /&gt;
&lt;br /&gt;
vývojová doska ACROB s ATmega328P&lt;br /&gt;
&lt;br /&gt;
tlačidlo pripojené na vstupný pin mikrokontroléra&lt;br /&gt;
&lt;br /&gt;
UART komunikácia&lt;br /&gt;
&lt;br /&gt;
jednoduché časovanie na rozlíšenie bodky a čiarky&lt;br /&gt;
&lt;br /&gt;
buffer pre ukladanie Morse sekvencie&lt;br /&gt;
&lt;br /&gt;
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]]&lt;br /&gt;
&lt;br /&gt;
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla.&lt;br /&gt;
Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.&lt;br /&gt;
&lt;br /&gt;
Dekódovanie Morseovej abecedy je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse znakmi.&lt;br /&gt;
Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART.&lt;br /&gt;
&lt;br /&gt;
Hlavné časti programu:&lt;br /&gt;
&lt;br /&gt;
čítanie tlačidla&lt;br /&gt;
&lt;br /&gt;
meranie dĺžky stlačenia&lt;br /&gt;
&lt;br /&gt;
rozlíšenie bodky a čiarky&lt;br /&gt;
&lt;br /&gt;
ukladanie Morse sekvencie do buffera&lt;br /&gt;
&lt;br /&gt;
dekódovanie znakov&lt;br /&gt;
&lt;br /&gt;
výpis cez UART&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define BUTTON_PIN PB3&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
uart_init();&lt;br /&gt;
&lt;br /&gt;
while (1)&lt;br /&gt;
{&lt;br /&gt;
    /* Morse decoder logic */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define set_bit(ADDRESS, BIT)(ADDRESS |= (1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
#define clear_bit(ADDRESS, BIT)(ADDRESS &amp;amp;= ~(1 &amp;lt;&amp;lt; BIT))&lt;br /&gt;
&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
int uart_putc(char c, FILE * stream);&lt;br /&gt;
void uart_puts(const char * s);&lt;br /&gt;
char uart_getc(void);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void)&lt;br /&gt;
{&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UBRR0H = UBRRH_VALUE;&lt;br /&gt;
UBRR0L = UBRRL_VALUE;&lt;br /&gt;
&lt;br /&gt;
#if USE_2X&lt;br /&gt;
UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);&lt;br /&gt;
UCSR0B = _BV(RXEN0) | _BV(TXEN0);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE * stream)&lt;br /&gt;
{&lt;br /&gt;
if (c == &#039;\n&#039;)&lt;br /&gt;
{&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = &#039;\r&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
UDR0 = c;&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo.&lt;br /&gt;
Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.&lt;br /&gt;
&lt;br /&gt;
Počas testovania bolo sledované:&lt;br /&gt;
&lt;br /&gt;
správne rozpoznávanie bodiek a čiarok&lt;br /&gt;
&lt;br /&gt;
stabilita merania času stlačenia tlačidla&lt;br /&gt;
&lt;br /&gt;
správne dekódovanie znakov&lt;br /&gt;
&lt;br /&gt;
správny výpis cez UART&lt;br /&gt;
&lt;br /&gt;
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.&lt;br /&gt;
&lt;br /&gt;
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18761</id>
		<title>Jednoduchý P regulátor</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18761"/>
		<updated>2026-05-15T21:59:49Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Dariia Dordiai&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu je zobraziť text na LCD displeji EA-DOGM163, ktorý je pripojený k vývojovej doske ACROB s mikrokontrolérom ATmega328P. Text je možné posúvať vľavo a vpravo po riadku displeja pomocou potenciometra. Poloha potenciometra je snímaná analógovo-digitálnym prevodníkom (ADC) a prepočítaná na pozíciu kurzora na displeji. Program umožňuje zobraziť ľubovoľný text.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Systém sa skladá z dvoch hlavných častí: vývojovej dosky ACROB s mikrokontrolérom ATmega328P a rozširujúceho modulu s LCD displejom EA-DOGM163. Externe je pripojená ovládacia krabička s potenciometrom, ktorá je k doske prepojená páskowym káblom. Otočením potenciometra sa mení napätie na analógovom vstupe, ktoré mikrokontrolér prevedie na pozíciu textu a zobrazí ho na displeji.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
===Použité komponenty===&lt;br /&gt;
Vývojová doska ACROB — doska postavená okolo mikrokontroléra ATmega328P.&lt;br /&gt;
&lt;br /&gt;
LCD modul EA-DOGM163 — rozširujúci modul pre dosku ACROB s displejom 3×16 znakov, oranžovým podsvietením, troma tlačidlami a jednou LED diódou. &lt;br /&gt;
&lt;br /&gt;
Potenciometer — externý otočný potenciometer umiestnený v krabičke so stupnicou 0–10. Slúži ako vstupné zariadenie pre nastavenie polohy textu. Prepojený s doskou páskowym káblom.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18760</id>
		<title>Jednoduchý P regulátor</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18760"/>
		<updated>2026-05-15T21:51:58Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zadanie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Dariia Dordiai&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom projektu je zobraziť text na LCD displeji EA-DOGM163, ktorý je pripojený k vývojovej doske ACROB s mikrokontrolérom ATmega328P. Text je možné posúvať vľavo a vpravo po riadku displeja pomocou potenciometra. Poloha potenciometra je snímaná analógovo-digitálnym prevodníkom (ADC) a prepočítaná na pozíciu kurzora na displeji. Program umožňuje zobraziť ľubovoľný text.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
===Použité komponenty===&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18759</id>
		<title>Jednoduchý P regulátor</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18759"/>
		<updated>2026-05-15T21:45:45Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Dariia Dordiai&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
===Použité komponenty===&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=MIPS_Projekt&amp;diff=18758</id>
		<title>MIPS Projekt</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=MIPS_Projekt&amp;diff=18758"/>
		<updated>2026-05-15T21:37:23Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: Revízia 18757 používateľa StudentMIPS (diskusia) bola vrátená&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cieľom semestrálneho projektu je ukázať, že ste sa na našom predmete skutočne niečo naučili a že ste schopní samostatne vyriešiť a naprogramovať jednoduchšiu úlohu s mikropočítačom. &lt;br /&gt;
&lt;br /&gt;
Do termínu skúšky treba riešenie predviesť a potom odovzať dokumentáciu sem do wiki:&lt;br /&gt;
* Stručný opis riešenia, akýsi návod na použitie, čo ste vlastne spravili a ako to funguje.&lt;br /&gt;
* Zdrojový kód (prípadne aj použité knižnice ak sú iné ako štandartne použité lcd.h, uart.h a i2c.h) aj s bohatými vlastnými komentármi&lt;br /&gt;
* Video, malo by obsahovať aj nejaký komentár, kde bude opisovať čo vidíme, čo sa deje a prečo sa to tam deje. Malo by zdokumentovať všetky funkcie, ktoré ste naprogramovali.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{cbox|text=&#039;&#039;&#039;Upozornenie:&#039;&#039;&#039; programy vypracujete v avr-gcc, &#039;&#039;&#039;nie&#039;&#039;&#039; v Arduino IDE prostredí.&amp;lt;BR&amp;gt; Nie je dovolené používať žiadne cudzie knižnice s výnimkou štandartných a tých, ktoré sme používali na cvičeniach.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FONT Color=&amp;quot;red&amp;quot; Size=&amp;quot;+1&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Vlastné:&#039;&#039;&#039;&lt;br /&gt;
* Ak máte vlastný nápad, napríklad si chcete k svojej Arduino doske niečo pripojiť, naprogramovať, ozvite sa, dohoda je možná.&lt;br /&gt;
&amp;lt;/FONT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mnoho inšpirácie na vlastné projekty nájdete napr. tu https://www.engineersgarage.com/?s=arduino&amp;amp;page=1 alebo tu https://circuitdigest.com/microcontroller-projects/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voľné projekty ==&lt;br /&gt;
&lt;br /&gt;
Poznámka: zadania označené (*) sú jednoduchšie a nie sú vhodné pre študentov, ktorí chcú mať známku A alebo B. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;8&amp;quot;&amp;gt;   Zbernica i2c: PCF8582E - 256x8-bit EEPROM i2c&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;10&amp;quot;&amp;gt;  Zbernica SPI: MCP41050 E/P  číslicový potenciometer 50k, 8-bit, SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;11&amp;quot;&amp;gt;  Zbernica SPI: MCP4811 -E/P  číslicový D/A prevodník 10 bit SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;12&amp;quot;&amp;gt;  Zbernica SPI: 25LC010A - EEPROM pamäť 128x8 bit SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;26&amp;quot;&amp;gt;  Jednoduchý multitasking s FreeRTOS https://github.com/johncobb/avr_328p_freertos&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;32&amp;quot;&amp;gt; Vytvorte program pracujúci v reálnom čase simulujúci systém Y(s)/U(s)=K/(s*T+1), K=1 [-] a T = 0,5 [sek].  Na vykreslenie priebehu použite SerialPlot. Rozsahy u(t) a y(t)  sú 0 až 5V. Rozlíšenie 0.01V. Vykreslite prechodovú charakteristiku odpovedajúcu vstupnej hodnote 2.00V.  Použite celočíselnú aritmetiku.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;34&amp;quot;&amp;gt; Ak použijeme funkciu printf(...) čas potrebný na k vykonaniu tejto operácie je úmerný prenosovej rýchlosti a počtu prenášaných B-tov. Jeden zo spôsobov skrátenia času potrebného na vykonanie tejto funkcie je použiť prerušovací podsystém. Na meranie času použite buď niektorý T/C, alebo osciloskop. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt; Študent musí vypočítať z T systému T oscilátora. Dokážete namerať toľko bodov,  ALF a FLF charakteristiky, aby ste vedeli dokresliť asymptoty?&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt; Niečo z predošlých zadaní v kombinácii Matlab/Simulink a generovaným kódom.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;39&amp;quot;&amp;gt; [[Zbernica i2c: hodiny reálneho času s PCF8583P]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2026 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;OL&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;1&amp;quot;&amp;gt; (*) Filip Hreha: [[Alarm s PIR detektorom pohybu]] https://www.parallax.com/product/pir-mini-sensor/&lt;br /&gt;
 &amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; (*) Sofia Nevzorova: [[Vstupná jednotka s palcovým prepínačom TS211]] - https://www.bucek.name/pdf/ts21xxxxx.pdf&lt;br /&gt;
 &amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; (*) Dávid Vríčan: [[Automatické zavlažovanie]] so snímačom vlhkosti pôdy a pumpičkou&lt;br /&gt;
 &amp;lt;li value=&amp;quot;4&amp;quot;&amp;gt; (*) Áron Szabó Bartko: [[Binárne hodiny]]: Zobrazenie plynutia sekúnd (0-63) v binárnej sústave na 6 LED diódach.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;5&amp;quot;&amp;gt; (*) Rostyslav Fursov: [[SOS maják]]: Cyklické vyblikávanie signálu SOS v morzeovke na jednej LED.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;6&amp;quot;&amp;gt; (*) Oliver Szabo: [[Generátor tónov]]: Potenciometrom riadený zvuk: ADC hodnota z potenciometra mení frekvenciu tónu na bzučiaku v reálnom čase.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; (*) Samuel Igaz: [[Monitor kapacity batérie]]: Meranie napätia (simulované potenciometrom) a zobrazenie stavu (Full/Mid/Low) na 3 LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;9&amp;quot;&amp;gt; Broňa Dzivjaková: [[UART Kalkulačka]]: Študent pošle cez terminál príklad (napr. 5+3) a mikropočítač vráti výsledok. Operácie aspoň +,-,*,/.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;13a&amp;quot;&amp;gt; Adam Čulák: [[Zámok na kód I.]]: Zámok na kód: Študent musí v správnom poradí stlačiť na matici správne poradie tlačidiel aby „odomkol“ (rozsvietil zelenú LED). Ak je kombinácia nesprávna, rozsvieti sa červená dióda.&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;li value=&amp;quot;13b&amp;quot;&amp;gt; Lukáš Hegedúš: [[Zámok na kód II.]]: Študent musí v správnom poradí stlačiť 4 tlačidlá, aby „odomkol“ (rozsvietil zelenú LED).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;14&amp;quot;&amp;gt; Karol Kilian: [[UART Metronóm]]: Používateľ cez UART zadá BPM (údery za minútu) a bzučiak začne rytmicky pípať.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;15&amp;quot;&amp;gt; Miroslav Klein: [[Prehrávač melódie s ovládaním]]: Prehráva melódiu z poľa, tlačidlá slúžia ako Play/Stop/Next.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;16&amp;quot;&amp;gt;  Egor Bukhtiiarov: [[Zbernica i2c: EEPROM Terminál]]: Zápis a čítanie textových reťazcov do externej pamäte cez UART príkazy .&lt;br /&gt;
 &amp;lt;li value=&amp;quot;17&amp;quot;&amp;gt;  Anton Zadorozhnii [[Generátor signálov s mikroprocesorom]]: obdlžnik, trojuholník, sinus. Parametre amplituda, frekvencia, posunutie, .. a vykresliť na plotter. Ak je to zložite, možno rozdeliť na časti. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19a&amp;quot;&amp;gt;  Werner Federmayer: [[Ultrazvukový radar s HC-SR04]]: Meranie vzdialenosti (HC-SR04) a zobrazenie na LCD alebo sériovú linku v centimetroch.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19b&amp;quot;&amp;gt; Mihály Bertalan Vasas: [[Ultrazvukový radar so senzorom Ping)))]]: Meranie vzdialenosti a zobrazenie na LCD alebo sériovú linku v centimetroch.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;20&amp;quot;&amp;gt;  Dmytro Domchuk: [[Integrátor s mikroprocesorom]]. Potenciometer zadá veľkosť vstupu integrátora. Vytvorí sa zdroj reálneho času, prírastku času, napr. 5ms. A s nastavenou integračnou časovou konštantou sa bude meniť v reálnom čase, výstup, ktorý sa bude zobrazovať na serial, plot. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;21&amp;quot;&amp;gt; Dariia Dordiai: [[Jednoduchý P regulátor]]. (Nepotrebuje periódu vzorkovania). Bude daná  rýchlosťou merania napätia na potenciometre. Keďže je daný 10b prevodník, je daný aj rozsah w (želaná hodnota), y (meraná hodnota) a e (regulačná odchýlka). E sa prenásobí zosilnením, napr. pevná rádová čiarka a pošle sa von na PWM výstup napr. 8b. Treba len vhodne nastaviť periódu opakovania. Opäť možno zobrazovať na serial plot. meranú hodnotu a tomu odpovedajúce plnenie ako funkcia w., atď. &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;22&amp;quot;&amp;gt;  Oleh Chuiko: [[Dekodér morzeovky]]: Mikropočítač prijíma „pípanie“ z tlačidla (meranie dĺžky stisku) a vypisuje písmená na UART.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;23&amp;quot;&amp;gt;Andrej Koža: [[Zbernica i2c: RTC Hodiny]]: Vyčítanie reálneho času z modulu DS1307 a jeho výpis na UART.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;26&amp;quot;&amp;gt;  Yaroslav Buryk: [[Digitálny potenciometer]]. Navrhnite program na načítavanie počtu impulzov tak, aby ste pri opakovanom pohybe (aj pri zmene smeru) hriadeľa nestratili ani jeden krok. Ide o ošetrenie voči zákmitom.   &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;27&amp;quot;&amp;gt; Gordij Čornyj: [[Úsporné režimy procesora]] - Power down úsporné režimy https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes/&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;31&amp;quot;&amp;gt; Mykyta Oleksandr: [[Generátor harmonického signálu]] Na generovanie harmonického signálu nepoužite funkcie sin(), resp. cos(), ale vytvorte oscilátor (v reálnom čase) ako prenosovú funkciu 1/((s*T)^2 + 1). Úlohou je zmerať  jeden bod frekvenčnej  charakteristiky systému 1/(s*T_osc+1) na frekvencii omega = 1/T. T = 0,5 sek.  Výstupom je signál s parametrami: A_0 + A_1*sin(omega*t + fi), kde A_0 = 128 a A_1 = 100.  &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;32&amp;quot;&amp;gt;  (*) Kristian Rostupytskyi: [[Pripojenie viacero tlačidiel cez A/D prevodník‎]] - Pripojenie 5 tlačidiel na 1 vstup mikroprocesora s využitím A/D prevodníka.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;33&amp;quot;&amp;gt; Dariia Svystak: [[Implementácia funkcie map()] V prostredí ArduinoIde máme možnosť použiť funkciu map(...). Prepíšte túto funkciu tak, aby sme napätie merané v rozsahu 0 až 5V pomocou 10 b-ého A/D prevodníka vedeli zobraziť s presnosťou na „0,01V“. Použite celočíselnú aritmetiku.  Výstup A/D prevodníkom filtrujte pomocou filtra kĺzavého priemeru – priemer s 8, resp. 16 vzoriek.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;35&amp;quot;&amp;gt;  Matúš Grúň: [[Interaktívna lampička I]]&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt;  Michal Čavojský: [[Interaktívna lampička II]]&lt;br /&gt;
 &amp;lt;li value=&amp;quot;37&amp;quot;&amp;gt;  Mia Dudášová: [[Zámok na kód s IR ovládaním]] - vlastný projekt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt;  Marek Kesckés: [[Ovládanie servomotorčekov na manipulátore joystickmi]] - vlastný projekt&lt;br /&gt;
&amp;lt;/OL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- nove pridavaj uz sem, lebo cislovanie --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archív projektov z predošlých rokov == &lt;br /&gt;
&lt;br /&gt;
* Balogh: &#039;&#039;[[MIPS Template|Vzorová šablóna na projekty.]]&#039;&#039; 2023-6.&lt;br /&gt;
&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2025 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;UL&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt; Dominik Andraščík: [[Ovládanie elektrického zámku z cloudu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Andrej Bariš: [[Bežiace svetlo s obvodom 74HC595]]&lt;br /&gt;
 &amp;lt;li&amp;gt;?? Ilona Baihildina: [[Hracia kocka s LED]] (*)&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Oliver Beko: [[Čítačka RFID kariet RC522]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Biacovský: [[Jednoduchá kuchynská váha do 1kg]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Filip Boco: [[Zbernica i2c: hodiny reálneho času s DS1388]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Dávid Bungyi: [[Diaľkové ovládanie zosilňovača]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Lukáš Čapla: [[Snímanie polohy optickým enkodérom]] IRC a jeho vyhodnotenie pre snímanie polohy&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Samuel Gálik: [[Ovládanie rýchlosti jednosmerného motora cez bluetooth]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Kamil Hanišák: &#039;&#039;[[Zbernica i2c: PCF8574]] - IO expandér.&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Ľuboš Hreňo: [[Ovládanie  robotického ramienka joystickom II.]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Hubocký: [[Kombinovaný snímač teploty a vlhkosti DHT22]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Dávid Jamarik: [[Hra Máš pevnú ruku?]] (*) &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Miloslav Kráľ:  [[Tester Arduina]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Kráľ: [[Automatické nastavenie prenosovej rýchlosti]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Juraj Krasnovský: [[Ovládanie  robotického ramienka joystickom]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Lenarth: [[Ovládanie vyklápacích svetiel]]. &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Németh: [[Ovládanie rýchlosti jednosmerného motora z BT aplikácie]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Tymur Omelianenko: [[Generátor trojuholníkového signálu s R-2R prevodníkom]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Filip Pinďar: [[Ovládanie elektrického zámku z mobilnej aplikácie]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Kamil Raplík: [[Infračervený vypínač s ATtiny45]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ René Roger: [[Metódy zvýšenie presnosti A/D prevodu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Aleh Sobaleu: [[Kombinovaný snímač teploty a vlhkosti DHT11]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Marek Šoltés: [[Diaľkové ovládanie spotrebiča pomocou infračerveného signálu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Zakuťanský: [[Generovanie kódu z prostredia Matlaba/Simulink]] &lt;br /&gt;
&amp;lt;/UL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2024 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt; Bobocký, Daniel Samuel: &#039;&#039;[[Klávesnica s radičom MH1KK1 -]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Bugár, Martin:         &#039;&#039;[[Reglátor chladenia so snímačom teploty]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Buzko, Kateryna:       &#039;&#039;[[Jednoduchý prijímač diaľkového IR ovládania]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Csabi, Jozef:          &#039;&#039;[[Meranie vzdialenosti ultrazvukovým snímačom HC-SR04]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Fedor, Peter:          &#039;&#039;[[Riadenie polohy klapky klimatizácie]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Guľak, Peter:          &#039;&#039;[[Piškvorky (Tic-Tac-Toe)]] na 8x8 maticovom displeji&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Hano, Adam:            &#039;&#039;[[Hodinový modul DS1302]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Illés, Dominik:        &#039;&#039;[[Ovládanie RGB LED pásika]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kramla, Oliver:        &#039;&#039;[[Svetelný efekt s obvodom 74595]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kudláč, Lukáš:         &#039;&#039;[[Riadenie križovatky]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kuňáková, Andrea:      &#039;&#039;[[Autíčko na sledovanie čiary]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ledecký, Matej:        &#039;&#039;[[Ovladanie krokoveho motora joystickom + uvod displej]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Macák, Jakub:          &#039;&#039;[[Tester obvodu 7400]] (4xNAND)&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Majba, David:          &#039;&#039;[[Vysielač morzeovky]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Nagy, Ladislav:        &#039;&#039;[[Maticový displej 8x8 s driverom MAX7219]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Nagy, Gabriel:         &#039;&#039;[[Tester obvodu 7493]] (4-bitové počítadlo)&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ondrejková, Lea Lenka: &#039;&#039;[[14-segmentový LED displej]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Pauliny, Kristián:     &#039;&#039;[[Akordy s procesorom AVR]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Reismüller, Tomáš:     &#039;&#039;[[Inteligentný šatník]]&#039;&#039; (model)&lt;br /&gt;
 &amp;lt;li&amp;gt; Sušina, Marián:        &#039;&#039;[[Senzor teploty a vlhkosti SHT31]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Szovics, Peter:        &#039;&#039;[[Elektronická škrtiaca klapka]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Tarcal, Ondrej:        &#039;&#039;[[Simon&#039;s Game]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ulej, Ján:             &#039;&#039;[[Kuchynské minutky]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Viest, Filip:          &#039;&#039;[[Klávesnica 2x3]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Vretenička, Šimon:     &#039;&#039;[[Ovládanie RGB LED cez Processing]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Žula, Daniel:          &#039;&#039;[[7-segmentový displej na futbal]] &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li&amp;gt; Brosz, Peter  a Diossy, Daniel: &#039;&#039;[[Automatické autíčko]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Matsibora, Viačeslav a Fietisov, Dmytro: &#039;&#039;[[Dvojosová kolíska na kameru ovládaná joystickom]]&#039;&#039; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;65&amp;quot;&amp;gt;&amp;lt;S&amp;gt; Tomáš Štibrányi: Klávesnica 4x4 s radičom MH1KK1&#039;&#039; &amp;lt;/S&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;61&amp;quot;&amp;gt;&amp;lt;S&amp;gt; Jakub Briežnik: Jednoduché menu s rotačným enkodérom&#039;&#039; a s výberom možností &amp;lt;/S&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2023 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Tomáš Bečvarov:   &#039;&#039;[[Senzor farieb TCS230]].&#039;&#039;  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Martin Cíbik:     &#039;&#039;[[Riadenie krokového motorčeka I.]]&#039;&#039;  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Viktor Fos*:      &#039;&#039;[[Rotačný enkodér]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Kristián Greif:   &#039;&#039;[[Zbernica i2c: MCP4725]] - DAC prevodník s EEPROM.&#039;&#039; Jednoduchý driver a knižnica pre tento obvod.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Ivan Hílek:       &#039;&#039;[[Postrehová hra]]&#039;&#039;  &lt;br /&gt;
 &amp;lt;li&amp;gt;Ivan Jagoš:       &#039;&#039;[[Dekodér infračerveného ovládača]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Mykyta Sabadash:  &#039;&#039;[[Hlukomer]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;lI&amp;gt;Lukáš Savčak:     &#039;&#039;[[Snímač teploty TMP36]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Juraj Štefánik:   &#039;&#039;[[Segmentový display TM1637]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Samuel Tomáš:     &#039;&#039;[[Miniatúrny analógový joystick]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Hortenzia Wollentová: &#039;&#039;[[Ovládač maticovej klávesnice]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Jozef Záhora:      &#039;&#039;[[Jednoduchá terminálová kalkulačka]]&#039;&#039;. 2023&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2022 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;1&amp;quot;&amp;gt; Martin Drgala: &amp;lt;!-- Lipták, Kristián: --&amp;gt; Stopky - spustenie, aspoň jeden medzičas, nulovanie. 3x tlačítko + LCD displej&lt;br /&gt;
 &amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; Veronika Remeňová: &amp;lt;!-- Turčan, Maroš: --&amp;gt;    Kuchynské minútky - nastavenie, spustenie, alarm. Tlačítko, potenciometer (nastavenie času) + LCD displej&lt;br /&gt;
 &amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; František Kapsz:  &amp;lt;!-- Buday, Bálint: --&amp;gt;    Vizualizácia polohy potenciometra na displeji - vyfarbovanie polí na displeji (ako ovládač hlasitosti)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;5&amp;quot;&amp;gt; Roderik Bako: &amp;lt;!-- Belokostolský, Alex Kristóf --&amp;gt; [https://www.mathsisfun.com/games/simon-says.html Simon&#039;s Game] 4x LED, 1x tlačítko, LCD displej na skore&lt;br /&gt;
 &amp;lt;li value=&amp;quot;6&amp;quot;&amp;gt; Mário Babinský:  Hra - vyhýbanie sa prekážkam na LCD displeji, ovládanie jedným tlačidlom, hráč (auto) ide vpred a prepína jazdné pruhy (riadky displeja)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; Maté Tóth: Simulátor hollywood pyrotechnika - displej odrátava čas a študent má na výber dva káble ktoré môže &amp;quot;prestrihnúť&amp;quot; (odpojiť), náhodne sa zvolí jeden ktorý preruší časovať a jeden čo &amp;quot;vybuchne&amp;quot; bombu&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; Dávid Červenka: Modifikovaný simulátor hollywood pyrotechnika - displej odrátava čas ako stĺpcový diagram a pípanei sa zrýchluje, pričom študent má na výber dva káble ktoré môže &amp;quot;prestrihnúť&amp;quot; (odpojiť), náhodne sa zvolí jeden ktorý preruší časovať a jeden čo &amp;quot;vybuchne&amp;quot; bombu&lt;br /&gt;
 &amp;lt;li value=&amp;quot;14&amp;quot;&amp;gt; Alexander Lazorík:  &amp;lt;!-- Goljer, Ivan: --&amp;gt; Hudobný nástroj ovládaný cez klávesnicu, sériovou linkou posiela tóny a Arduino ich hrá. Zapamätá si melódiu a vie ju zopakovať&lt;br /&gt;
 &amp;lt;li value=&amp;quot;15&amp;quot;&amp;gt; Pavel Bucha: Ovládanie RGB LED cez Processing pomocou troch posuvníkov ([[Meranie odporov|príklad na posuvník je tu]]).&lt;br /&gt;
 &amp;lt;li value=&amp;quot;17&amp;quot;&amp;gt; Marek Porubský: &amp;lt;!-- Berta, Kristof: --&amp;gt; &#039;&#039;Meranie teploty pomocou interného snímača procesora.&#039;&#039; (podľa [http://ww1.microchip.com/downloads/en/AppNotes/Atmel-8108-Calibration-of-the-AVRs-Internal-Temperature-Reference_ApplicationNote_AVR122.pdf AVR AppNote 122])&lt;br /&gt;
 &amp;lt;li value=&amp;quot;18&amp;quot;&amp;gt; Andrii Sikomas: &amp;lt;!-- Bilčík, Martin: --&amp;gt; &#039;&#039;Ultrazvukový senzor HC-SR04 a meranie vzdialenosti (parkovací senzor).&#039;&#039;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19&amp;quot;&amp;gt; Adam Sližka: &amp;lt;!-- Oboril, Oliver:--&amp;gt; LED ako senzor intenzity svetla&lt;br /&gt;
 &amp;lt;li value=&amp;quot;20&amp;quot;&amp;gt; Tomáš Truben: Servomotorček ako indikátor nejakej inej veličiny - ručičku a stupnicu vyrobíte sami.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;21&amp;quot;&amp;gt; Jakub Červenka: &amp;lt;!-- Skachová, Zuzana:--&amp;gt; Semafor s akustickou signalizáciou pre nevidiacich a slabozrakých (frekvencie vid: https://sk.wikipedia.org/wiki/Akustick%C3%BD_maj%C3%A1k)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;22&amp;quot;&amp;gt; Sabina Ovčiariková: &amp;lt;!-- Görözdös, Gergely: --&amp;gt; Binárne hodiny/stopky alebo počítadlo, rozsvietená LED-ky by ukazovali počet sekúnd/počet kliknutí tlačidla, mohlo by to byť sprevádzané pípnutím každých 10 stlačení alebo každú minútu.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;23&amp;quot;&amp;gt; Oleksandr Shyp: &amp;lt;!-- Hajda, Jaroslav: --&amp;gt; &#039;&#039;Posúvanie bodky na 8x8 led displayi pomocou joysticku.&#039;&#039;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;29&amp;quot;&amp;gt; Martin Vdovják: &amp;lt;!-- Mosej, Samuel: --&amp;gt;Digitálny alarm - treba zadať správnu sekvenciu tlačidiel, keď sa vloží správna sekvencia rozsvieti sa tlačidlo, nesprávna sekvencia zabzučí alarm (možno aj pridať možnosť vkladať nové kódy)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt; Attila Hriňa: &amp;lt;!--  Papcun, Miroslav: --&amp;gt; Hra na trénovanie hudobného sluchu - reproduktor zahrá 2 (náhodné) tóny a hráč musí povedať, či bol vyšší prvá alebo druhý (dve tlačidlá).&lt;br /&gt;
 &amp;lt;li value=&amp;quot;37&amp;quot;&amp;gt; Korytova, Taisiia: Svetelná križovatka s nočným režimom. &amp;lt;!-- Fabian, Maroš --&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt; Ákos Keszegh: Reaction Timer&lt;br /&gt;
 &amp;lt;li value=&amp;quot;39&amp;quot;&amp;gt; Marek Trúchly: Atmel2586 s MEMS akcelerometerom&lt;br /&gt;
 &amp;lt;li value=&amp;quot;40&amp;quot;&amp;gt; Oskar Bálint: Automatické otváranie dverí s PIR senzorom&lt;br /&gt;
 &amp;lt;li value=&amp;quot;41&amp;quot;&amp;gt; Adam Kašička:  Model a signalizácia sekvenčnej prevodovky&lt;br /&gt;
 &amp;lt;li value=&amp;quot;42&amp;quot;&amp;gt; Ing. Ján Šefčík: Riadenie modelu Ball&amp;amp;Beam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zadania semestrálnych projektov v minulosti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Toto bolo v minulosti, ale na dištančnú formu je to nevhodné. V roku 2021 nebudú pracovať vo dvojiciach, ale individuálne. &lt;br /&gt;
&lt;br /&gt;
Zadanie pozostáva z dvoch častí:&lt;br /&gt;
&lt;br /&gt;
1. teoretická časť - v tejto časti máte popísať v rozsahu max. 10 strán čo a ako ste použili. Typicky tu býva uvedený popis periférnych obvodov, ktoré ste pripojili k mikroprocesoru, použité periférie mikropočítača dôležité registre s popisom jednotlivých bitov atď. (max. 20b.)&lt;br /&gt;
Dokumentáciu budete písať do tejto wiki-stránky, prihlasovacie meno a heslo sa dozviete na cvičení. &lt;br /&gt;
Na prvé zoznámenie so systémom môžete použiť [[Testing Page|testovaciu stránku]] a [[Projekt: vzorová šablóna|vzorový projekt - šablónu]].&lt;br /&gt;
&lt;br /&gt;
2. program - okrem predvedenia programu cvičiacemu je poterbné napísať k nemu tiež krátky popis, alebo vývojový diagram. Môže byť súčasťou prvej časti zadania. (max. 20 b.)&lt;br /&gt;
&lt;br /&gt;
Termín na odovzdanie je na dohode s cvičiacim, najneskôr do skúšky. Na zadaní môžete pracovať priebežne, alebo sa dohodnite s cvičiacim na súvislej práci v laboratóriu (napr. jeden celý deň). POZOR: niektoré zadania vyžadujú prípravu aj od cvičiaceho, nečakajte preto, že prídete a budete mať všetko na prácu nachystané -- treba sa vopred dohodnúť.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lechvár, Slaminka: &#039;&#039;[[Meranie pulzovej frekvencie.]]&#039;&#039; 2014.&lt;br /&gt;
* Jankovič, Lukáč: &#039;&#039;[[Zbernica i2c: hodiny RTC.]]&#039;&#039; 2014.&lt;br /&gt;
* Bača, Galovič: &#039;&#039;[[Bezdrôtová komunikácia v pásme 433 MHz.]]&#039;&#039; 2014.&lt;br /&gt;
* Katona, Nehánszki: &#039;&#039;[[Hodiny RTC s kalendárom pomocou PCF8583]]&#039;&#039;. 2014.&lt;br /&gt;
* Benedek, Cintula, Gahér: &#039;&#039;[[Trojosí gyroskopický modul L3G4200D]]&#039;&#039;. 2014.&lt;br /&gt;
* Šandal, Vincze: &#039;&#039;[[Trojosí akcelerometer MMA7455]]&#039;&#039;. 2014.&lt;br /&gt;
* Kocian, Švančara: &#039;&#039;[[RFID čítačka]]&#039;&#039;. 2014&lt;br /&gt;
* Martinkovič, Valach: &#039;&#039;[[RFID čítačka II]]&#039;&#039;. 2014&lt;br /&gt;
* Jakubička, Vyletel: &#039;&#039;[[Inkrementálny snímač]]&#039;&#039;. 2014&lt;br /&gt;
* Bohuš, Vargic, Gašparová: &#039;&#039;[[MEMS mikrofón ADMP401]]&#039;&#039;. 2014&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2013&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Godál, R. a Šimončič, M.: &#039;&#039;[[Meranie reakčnej doby]].&#039;&#039; 2013.&lt;br /&gt;
* Leško, D. a Biath, V.: &#039;&#039;[[MiniMEXLE Hodiny na orientačný beh]].&#039;&#039; 2013.&lt;br /&gt;
* Paulen, J. a Vojvoda, R.: &#039;&#039;[[Meranie krátkych intervalov]].&#039;&#039; 2013.&lt;br /&gt;
* Jurák, M. a Vlahi, L.: &#039;&#039;[[Meranie časového intervalu]].&#039;&#039; 2013.&lt;br /&gt;
* Rybárik, M. a Lukáč, M.: &#039;&#039;[[Odpočítavacie hodiny na riadenie diskusie]].&#039;&#039; 2013.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2012&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cebák, Darvaši:  &#039;&#039;[[Zbernica i2c: SAA1064|Zbernica i2c: 7-segmentový displej.]]&#039;&#039; 2012.&lt;br /&gt;
* Pecho, Lacko:    &#039;&#039;[[Projekt: Infračervené ovládanie|Infračervené ovládanie]]&#039;&#039; 2012.&lt;br /&gt;
* Rekšák, Mrva:    &#039;&#039;[[Projekt: Inkrementálny snímač otáčok|Inkrementálny snímač otáčok.]]&#039;&#039; 2012.&lt;br /&gt;
* Boráros, Gál:    &#039;&#039;[[Zbernica i2c: FM rádio]].&#039;&#039; 2012.&lt;br /&gt;
* Berčák, Harmata: &#039;&#039;[[Projekt: Hodiny A|Hodiny na orientačný beh I.]]&#039;&#039; 2012.&lt;br /&gt;
* Géczy, Kamenský: &#039;&#039;[[Projekt: Hodiny B|Hodiny na orientačný beh II.]]&#039;&#039; 2012.&lt;br /&gt;
&lt;br /&gt;
* Szolik, Šnyr:    &#039;&#039;[[Projekt: Snímač teploty SMT160|Snímač teploty SMT160]]&#039;&#039; 2012.&lt;br /&gt;
* Gálik, Gogola:   &#039;&#039;[[Projekt: Dvojosí akcelerometer A|Dvojosí akcelerometer I.]]&#039;&#039; 2012.&lt;br /&gt;
* Virág, Topoli:   &#039;&#039;[[Projekt: Dvojosí akcelerometer B|Dvojosí akcelerometer II.]]&#039;&#039; 2012.&lt;br /&gt;
* Statečný:        &#039;&#039;[[Zbernica i2c: SHT11|Zbernica i2c: snímač teploty a vlhkosti SHT11]]&#039;&#039; 2012.&lt;br /&gt;
* Vincze, Rozsár:  &#039;&#039;[[Projekt: Snímač farby ColorPal|Snímač farby ColorPal]]&#039;&#039; 2012.&lt;br /&gt;
* Baláž, Kupčiha:  &#039;&#039;[[Projekt: Snímač teploty DS18B20|Snímač teploty DS18B20]]&#039;&#039; 2012.&lt;br /&gt;
* Mazúch, Lovaš, Oravec: &#039;&#039;[[1-Riadková kamera TSLR1401|1-Riadková kamera TSLR1401]]&#039;&#039; 2012.&lt;br /&gt;
* Špitálová: [[Parkovací senzor]] 2012.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=MIPS_Projekt&amp;diff=18757</id>
		<title>MIPS Projekt</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=MIPS_Projekt&amp;diff=18757"/>
		<updated>2026-05-15T21:35:17Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Projekty MIPS 2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cieľom semestrálneho projektu je ukázať, že ste sa na našom predmete skutočne niečo naučili a že ste schopní samostatne vyriešiť a naprogramovať jednoduchšiu úlohu s mikropočítačom. &lt;br /&gt;
&lt;br /&gt;
Do termínu skúšky treba riešenie predviesť a potom odovzať dokumentáciu sem do wiki:&lt;br /&gt;
* Stručný opis riešenia, akýsi návod na použitie, čo ste vlastne spravili a ako to funguje.&lt;br /&gt;
* Zdrojový kód (prípadne aj použité knižnice ak sú iné ako štandartne použité lcd.h, uart.h a i2c.h) aj s bohatými vlastnými komentármi&lt;br /&gt;
* Video, malo by obsahovať aj nejaký komentár, kde bude opisovať čo vidíme, čo sa deje a prečo sa to tam deje. Malo by zdokumentovať všetky funkcie, ktoré ste naprogramovali.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{cbox|text=&#039;&#039;&#039;Upozornenie:&#039;&#039;&#039; programy vypracujete v avr-gcc, &#039;&#039;&#039;nie&#039;&#039;&#039; v Arduino IDE prostredí.&amp;lt;BR&amp;gt; Nie je dovolené používať žiadne cudzie knižnice s výnimkou štandartných a tých, ktoré sme používali na cvičeniach.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FONT Color=&amp;quot;red&amp;quot; Size=&amp;quot;+1&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Vlastné:&#039;&#039;&#039;&lt;br /&gt;
* Ak máte vlastný nápad, napríklad si chcete k svojej Arduino doske niečo pripojiť, naprogramovať, ozvite sa, dohoda je možná.&lt;br /&gt;
&amp;lt;/FONT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mnoho inšpirácie na vlastné projekty nájdete napr. tu https://www.engineersgarage.com/?s=arduino&amp;amp;page=1 alebo tu https://circuitdigest.com/microcontroller-projects/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voľné projekty ==&lt;br /&gt;
&lt;br /&gt;
Poznámka: zadania označené (*) sú jednoduchšie a nie sú vhodné pre študentov, ktorí chcú mať známku A alebo B. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;8&amp;quot;&amp;gt;   Zbernica i2c: PCF8582E - 256x8-bit EEPROM i2c&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;10&amp;quot;&amp;gt;  Zbernica SPI: MCP41050 E/P  číslicový potenciometer 50k, 8-bit, SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;11&amp;quot;&amp;gt;  Zbernica SPI: MCP4811 -E/P  číslicový D/A prevodník 10 bit SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;12&amp;quot;&amp;gt;  Zbernica SPI: 25LC010A - EEPROM pamäť 128x8 bit SPI&lt;br /&gt;
 &amp;lt;li value=&amp;quot;26&amp;quot;&amp;gt;  Jednoduchý multitasking s FreeRTOS https://github.com/johncobb/avr_328p_freertos&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;32&amp;quot;&amp;gt; Vytvorte program pracujúci v reálnom čase simulujúci systém Y(s)/U(s)=K/(s*T+1), K=1 [-] a T = 0,5 [sek].  Na vykreslenie priebehu použite SerialPlot. Rozsahy u(t) a y(t)  sú 0 až 5V. Rozlíšenie 0.01V. Vykreslite prechodovú charakteristiku odpovedajúcu vstupnej hodnote 2.00V.  Použite celočíselnú aritmetiku.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;34&amp;quot;&amp;gt; Ak použijeme funkciu printf(...) čas potrebný na k vykonaniu tejto operácie je úmerný prenosovej rýchlosti a počtu prenášaných B-tov. Jeden zo spôsobov skrátenia času potrebného na vykonanie tejto funkcie je použiť prerušovací podsystém. Na meranie času použite buď niektorý T/C, alebo osciloskop. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt; Študent musí vypočítať z T systému T oscilátora. Dokážete namerať toľko bodov,  ALF a FLF charakteristiky, aby ste vedeli dokresliť asymptoty?&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt; Niečo z predošlých zadaní v kombinácii Matlab/Simulink a generovaným kódom.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;39&amp;quot;&amp;gt; [[Zbernica i2c: hodiny reálneho času s PCF8583P]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2026 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;OL&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;1&amp;quot;&amp;gt; (*) Filip Hreha: [[Alarm s PIR detektorom pohybu]] https://www.parallax.com/product/pir-mini-sensor/&lt;br /&gt;
 &amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; (*) Sofia Nevzorova: [[Vstupná jednotka s palcovým prepínačom TS211]] - https://www.bucek.name/pdf/ts21xxxxx.pdf&lt;br /&gt;
 &amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; (*) Dávid Vríčan: [[Automatické zavlažovanie]] so snímačom vlhkosti pôdy a pumpičkou&lt;br /&gt;
 &amp;lt;li value=&amp;quot;4&amp;quot;&amp;gt; (*) Áron Szabó Bartko: [[Binárne hodiny]]: Zobrazenie plynutia sekúnd (0-63) v binárnej sústave na 6 LED diódach.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;5&amp;quot;&amp;gt; (*) Rostyslav Fursov: [[SOS maják]]: Cyklické vyblikávanie signálu SOS v morzeovke na jednej LED.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;6&amp;quot;&amp;gt; (*) Oliver Szabo: [[Generátor tónov]]: Potenciometrom riadený zvuk: ADC hodnota z potenciometra mení frekvenciu tónu na bzučiaku v reálnom čase.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; (*) Samuel Igaz: [[Monitor kapacity batérie]]: Meranie napätia (simulované potenciometrom) a zobrazenie stavu (Full/Mid/Low) na 3 LED.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;9&amp;quot;&amp;gt; Broňa Dzivjaková: [[UART Kalkulačka]]: Študent pošle cez terminál príklad (napr. 5+3) a mikropočítač vráti výsledok. Operácie aspoň +,-,*,/.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;13a&amp;quot;&amp;gt; Adam Čulák: [[Zámok na kód I.]]: Zámok na kód: Študent musí v správnom poradí stlačiť na matici správne poradie tlačidiel aby „odomkol“ (rozsvietil zelenú LED). Ak je kombinácia nesprávna, rozsvieti sa červená dióda.&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;li value=&amp;quot;13b&amp;quot;&amp;gt; Lukáš Hegedúš: [[Zámok na kód II.]]: Študent musí v správnom poradí stlačiť 4 tlačidlá, aby „odomkol“ (rozsvietil zelenú LED).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;14&amp;quot;&amp;gt; Karol Kilian: [[UART Metronóm]]: Používateľ cez UART zadá BPM (údery za minútu) a bzučiak začne rytmicky pípať.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;15&amp;quot;&amp;gt; Miroslav Klein: [[Prehrávač melódie s ovládaním]]: Prehráva melódiu z poľa, tlačidlá slúžia ako Play/Stop/Next.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;16&amp;quot;&amp;gt;  Egor Bukhtiiarov: [[Zbernica i2c: EEPROM Terminál]]: Zápis a čítanie textových reťazcov do externej pamäte cez UART príkazy .&lt;br /&gt;
 &amp;lt;li value=&amp;quot;17&amp;quot;&amp;gt;  Anton Zadorozhnii [[Generátor signálov s mikroprocesorom]]: obdlžnik, trojuholník, sinus. Parametre amplituda, frekvencia, posunutie, .. a vykresliť na plotter. Ak je to zložite, možno rozdeliť na časti. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19a&amp;quot;&amp;gt;  Werner Federmayer: [[Ultrazvukový radar s HC-SR04]]: Meranie vzdialenosti (HC-SR04) a zobrazenie na LCD alebo sériovú linku v centimetroch.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19b&amp;quot;&amp;gt; Mihály Bertalan Vasas: [[Ultrazvukový radar so senzorom Ping)))]]: Meranie vzdialenosti a zobrazenie na LCD alebo sériovú linku v centimetroch.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;20&amp;quot;&amp;gt;  Dmytro Domchuk: [[Integrátor s mikroprocesorom]]. Potenciometer zadá veľkosť vstupu integrátora. Vytvorí sa zdroj reálneho času, prírastku času, napr. 5ms. A s nastavenou integračnou časovou konštantou sa bude meniť v reálnom čase, výstup, ktorý sa bude zobrazovať na serial, plot. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;21&amp;quot;&amp;gt; Dariia Dordiai: [[Posúvanie textu na LCD EA-DOGM163 pomocou potenciometra]]. &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;22&amp;quot;&amp;gt;  Oleh Chuiko: [[Dekodér morzeovky]]: Mikropočítač prijíma „pípanie“ z tlačidla (meranie dĺžky stisku) a vypisuje písmená na UART.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;li value=&amp;quot;23&amp;quot;&amp;gt;Andrej Koža: [[Zbernica i2c: RTC Hodiny]]: Vyčítanie reálneho času z modulu DS1307 a jeho výpis na UART.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;26&amp;quot;&amp;gt;  Yaroslav Buryk: [[Digitálny potenciometer]]. Navrhnite program na načítavanie počtu impulzov tak, aby ste pri opakovanom pohybe (aj pri zmene smeru) hriadeľa nestratili ani jeden krok. Ide o ošetrenie voči zákmitom.   &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;27&amp;quot;&amp;gt; Gordij Čornyj: [[Úsporné režimy procesora]] - Power down úsporné režimy https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes/&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;31&amp;quot;&amp;gt; Mykyta Oleksandr: [[Generátor harmonického signálu]] Na generovanie harmonického signálu nepoužite funkcie sin(), resp. cos(), ale vytvorte oscilátor (v reálnom čase) ako prenosovú funkciu 1/((s*T)^2 + 1). Úlohou je zmerať  jeden bod frekvenčnej  charakteristiky systému 1/(s*T_osc+1) na frekvencii omega = 1/T. T = 0,5 sek.  Výstupom je signál s parametrami: A_0 + A_1*sin(omega*t + fi), kde A_0 = 128 a A_1 = 100.  &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;32&amp;quot;&amp;gt;  (*) Kristian Rostupytskyi: [[Pripojenie viacero tlačidiel cez A/D prevodník‎]] - Pripojenie 5 tlačidiel na 1 vstup mikroprocesora s využitím A/D prevodníka.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;33&amp;quot;&amp;gt; Dariia Svystak: [[Implementácia funkcie map()] V prostredí ArduinoIde máme možnosť použiť funkciu map(...). Prepíšte túto funkciu tak, aby sme napätie merané v rozsahu 0 až 5V pomocou 10 b-ého A/D prevodníka vedeli zobraziť s presnosťou na „0,01V“. Použite celočíselnú aritmetiku.  Výstup A/D prevodníkom filtrujte pomocou filtra kĺzavého priemeru – priemer s 8, resp. 16 vzoriek.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li value=&amp;quot;35&amp;quot;&amp;gt;  Matúš Grúň: [[Interaktívna lampička I]]&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt;  Michal Čavojský: [[Interaktívna lampička II]]&lt;br /&gt;
 &amp;lt;li value=&amp;quot;37&amp;quot;&amp;gt;  Mia Dudášová: [[Zámok na kód s IR ovládaním]] - vlastný projekt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt;  Marek Kesckés: [[Ovládanie servomotorčekov na manipulátore joystickmi]] - vlastný projekt&lt;br /&gt;
&amp;lt;/OL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- nove pridavaj uz sem, lebo cislovanie --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Archív projektov z predošlých rokov == &lt;br /&gt;
&lt;br /&gt;
* Balogh: &#039;&#039;[[MIPS Template|Vzorová šablóna na projekty.]]&#039;&#039; 2023-6.&lt;br /&gt;
&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2025 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;UL&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt; Dominik Andraščík: [[Ovládanie elektrického zámku z cloudu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Andrej Bariš: [[Bežiace svetlo s obvodom 74HC595]]&lt;br /&gt;
 &amp;lt;li&amp;gt;?? Ilona Baihildina: [[Hracia kocka s LED]] (*)&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Oliver Beko: [[Čítačka RFID kariet RC522]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Biacovský: [[Jednoduchá kuchynská váha do 1kg]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Filip Boco: [[Zbernica i2c: hodiny reálneho času s DS1388]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Dávid Bungyi: [[Diaľkové ovládanie zosilňovača]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Lukáš Čapla: [[Snímanie polohy optickým enkodérom]] IRC a jeho vyhodnotenie pre snímanie polohy&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Samuel Gálik: [[Ovládanie rýchlosti jednosmerného motora cez bluetooth]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Kamil Hanišák: &#039;&#039;[[Zbernica i2c: PCF8574]] - IO expandér.&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Ľuboš Hreňo: [[Ovládanie  robotického ramienka joystickom II.]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Hubocký: [[Kombinovaný snímač teploty a vlhkosti DHT22]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Dávid Jamarik: [[Hra Máš pevnú ruku?]] (*) &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Miloslav Kráľ:  [[Tester Arduina]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Kráľ: [[Automatické nastavenie prenosovej rýchlosti]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Juraj Krasnovský: [[Ovládanie  robotického ramienka joystickom]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Martin Lenarth: [[Ovládanie vyklápacích svetiel]]. &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Németh: [[Ovládanie rýchlosti jednosmerného motora z BT aplikácie]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Tymur Omelianenko: [[Generátor trojuholníkového signálu s R-2R prevodníkom]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Filip Pinďar: [[Ovládanie elektrického zámku z mobilnej aplikácie]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Kamil Raplík: [[Infračervený vypínač s ATtiny45]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ René Roger: [[Metódy zvýšenie presnosti A/D prevodu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Aleh Sobaleu: [[Kombinovaný snímač teploty a vlhkosti DHT11]] &lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Marek Šoltés: [[Diaľkové ovládanie spotrebiča pomocou infračerveného signálu]]&lt;br /&gt;
 &amp;lt;li&amp;gt;✔️ Matúš Zakuťanský: [[Generovanie kódu z prostredia Matlaba/Simulink]] &lt;br /&gt;
&amp;lt;/UL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2024 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt; Bobocký, Daniel Samuel: &#039;&#039;[[Klávesnica s radičom MH1KK1 -]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Bugár, Martin:         &#039;&#039;[[Reglátor chladenia so snímačom teploty]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Buzko, Kateryna:       &#039;&#039;[[Jednoduchý prijímač diaľkového IR ovládania]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Csabi, Jozef:          &#039;&#039;[[Meranie vzdialenosti ultrazvukovým snímačom HC-SR04]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Fedor, Peter:          &#039;&#039;[[Riadenie polohy klapky klimatizácie]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Guľak, Peter:          &#039;&#039;[[Piškvorky (Tic-Tac-Toe)]] na 8x8 maticovom displeji&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Hano, Adam:            &#039;&#039;[[Hodinový modul DS1302]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Illés, Dominik:        &#039;&#039;[[Ovládanie RGB LED pásika]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kramla, Oliver:        &#039;&#039;[[Svetelný efekt s obvodom 74595]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kudláč, Lukáš:         &#039;&#039;[[Riadenie križovatky]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Kuňáková, Andrea:      &#039;&#039;[[Autíčko na sledovanie čiary]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ledecký, Matej:        &#039;&#039;[[Ovladanie krokoveho motora joystickom + uvod displej]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Macák, Jakub:          &#039;&#039;[[Tester obvodu 7400]] (4xNAND)&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Majba, David:          &#039;&#039;[[Vysielač morzeovky]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Nagy, Ladislav:        &#039;&#039;[[Maticový displej 8x8 s driverom MAX7219]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Nagy, Gabriel:         &#039;&#039;[[Tester obvodu 7493]] (4-bitové počítadlo)&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ondrejková, Lea Lenka: &#039;&#039;[[14-segmentový LED displej]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Pauliny, Kristián:     &#039;&#039;[[Akordy s procesorom AVR]]&#039;&#039; &lt;br /&gt;
 &amp;lt;li&amp;gt; Reismüller, Tomáš:     &#039;&#039;[[Inteligentný šatník]]&#039;&#039; (model)&lt;br /&gt;
 &amp;lt;li&amp;gt; Sušina, Marián:        &#039;&#039;[[Senzor teploty a vlhkosti SHT31]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Szovics, Peter:        &#039;&#039;[[Elektronická škrtiaca klapka]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Tarcal, Ondrej:        &#039;&#039;[[Simon&#039;s Game]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Ulej, Ján:             &#039;&#039;[[Kuchynské minutky]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Viest, Filip:          &#039;&#039;[[Klávesnica 2x3]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Vretenička, Šimon:     &#039;&#039;[[Ovládanie RGB LED cez Processing]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Žula, Daniel:          &#039;&#039;[[7-segmentový displej na futbal]] &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;li&amp;gt; Brosz, Peter  a Diossy, Daniel: &#039;&#039;[[Automatické autíčko]]&#039;&#039;&lt;br /&gt;
 &amp;lt;li&amp;gt; Matsibora, Viačeslav a Fietisov, Dmytro: &#039;&#039;[[Dvojosová kolíska na kameru ovládaná joystickom]]&#039;&#039; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;65&amp;quot;&amp;gt;&amp;lt;S&amp;gt; Tomáš Štibrányi: Klávesnica 4x4 s radičom MH1KK1&#039;&#039; &amp;lt;/S&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;61&amp;quot;&amp;gt;&amp;lt;S&amp;gt; Jakub Briežnik: Jednoduché menu s rotačným enkodérom&#039;&#039; a s výberom možností &amp;lt;/S&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2023 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Tomáš Bečvarov:   &#039;&#039;[[Senzor farieb TCS230]].&#039;&#039;  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Martin Cíbik:     &#039;&#039;[[Riadenie krokového motorčeka I.]]&#039;&#039;  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Viktor Fos*:      &#039;&#039;[[Rotačný enkodér]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Kristián Greif:   &#039;&#039;[[Zbernica i2c: MCP4725]] - DAC prevodník s EEPROM.&#039;&#039; Jednoduchý driver a knižnica pre tento obvod.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Ivan Hílek:       &#039;&#039;[[Postrehová hra]]&#039;&#039;  &lt;br /&gt;
 &amp;lt;li&amp;gt;Ivan Jagoš:       &#039;&#039;[[Dekodér infračerveného ovládača]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Mykyta Sabadash:  &#039;&#039;[[Hlukomer]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;lI&amp;gt;Lukáš Savčak:     &#039;&#039;[[Snímač teploty TMP36]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Juraj Štefánik:   &#039;&#039;[[Segmentový display TM1637]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Samuel Tomáš:     &#039;&#039;[[Miniatúrny analógový joystick]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Hortenzia Wollentová: &#039;&#039;[[Ovládač maticovej klávesnice]]&#039;&#039;.  2023&lt;br /&gt;
 &amp;lt;li&amp;gt;Jozef Záhora:      &#039;&#039;[[Jednoduchá terminálová kalkulačka]]&#039;&#039;. 2023&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekty MIPS 2022 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;1&amp;quot;&amp;gt; Martin Drgala: &amp;lt;!-- Lipták, Kristián: --&amp;gt; Stopky - spustenie, aspoň jeden medzičas, nulovanie. 3x tlačítko + LCD displej&lt;br /&gt;
 &amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; Veronika Remeňová: &amp;lt;!-- Turčan, Maroš: --&amp;gt;    Kuchynské minútky - nastavenie, spustenie, alarm. Tlačítko, potenciometer (nastavenie času) + LCD displej&lt;br /&gt;
 &amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; František Kapsz:  &amp;lt;!-- Buday, Bálint: --&amp;gt;    Vizualizácia polohy potenciometra na displeji - vyfarbovanie polí na displeji (ako ovládač hlasitosti)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;5&amp;quot;&amp;gt; Roderik Bako: &amp;lt;!-- Belokostolský, Alex Kristóf --&amp;gt; [https://www.mathsisfun.com/games/simon-says.html Simon&#039;s Game] 4x LED, 1x tlačítko, LCD displej na skore&lt;br /&gt;
 &amp;lt;li value=&amp;quot;6&amp;quot;&amp;gt; Mário Babinský:  Hra - vyhýbanie sa prekážkam na LCD displeji, ovládanie jedným tlačidlom, hráč (auto) ide vpred a prepína jazdné pruhy (riadky displeja)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; Maté Tóth: Simulátor hollywood pyrotechnika - displej odrátava čas a študent má na výber dva káble ktoré môže &amp;quot;prestrihnúť&amp;quot; (odpojiť), náhodne sa zvolí jeden ktorý preruší časovať a jeden čo &amp;quot;vybuchne&amp;quot; bombu&lt;br /&gt;
 &amp;lt;li value=&amp;quot;7&amp;quot;&amp;gt; Dávid Červenka: Modifikovaný simulátor hollywood pyrotechnika - displej odrátava čas ako stĺpcový diagram a pípanei sa zrýchluje, pričom študent má na výber dva káble ktoré môže &amp;quot;prestrihnúť&amp;quot; (odpojiť), náhodne sa zvolí jeden ktorý preruší časovať a jeden čo &amp;quot;vybuchne&amp;quot; bombu&lt;br /&gt;
 &amp;lt;li value=&amp;quot;14&amp;quot;&amp;gt; Alexander Lazorík:  &amp;lt;!-- Goljer, Ivan: --&amp;gt; Hudobný nástroj ovládaný cez klávesnicu, sériovou linkou posiela tóny a Arduino ich hrá. Zapamätá si melódiu a vie ju zopakovať&lt;br /&gt;
 &amp;lt;li value=&amp;quot;15&amp;quot;&amp;gt; Pavel Bucha: Ovládanie RGB LED cez Processing pomocou troch posuvníkov ([[Meranie odporov|príklad na posuvník je tu]]).&lt;br /&gt;
 &amp;lt;li value=&amp;quot;17&amp;quot;&amp;gt; Marek Porubský: &amp;lt;!-- Berta, Kristof: --&amp;gt; &#039;&#039;Meranie teploty pomocou interného snímača procesora.&#039;&#039; (podľa [http://ww1.microchip.com/downloads/en/AppNotes/Atmel-8108-Calibration-of-the-AVRs-Internal-Temperature-Reference_ApplicationNote_AVR122.pdf AVR AppNote 122])&lt;br /&gt;
 &amp;lt;li value=&amp;quot;18&amp;quot;&amp;gt; Andrii Sikomas: &amp;lt;!-- Bilčík, Martin: --&amp;gt; &#039;&#039;Ultrazvukový senzor HC-SR04 a meranie vzdialenosti (parkovací senzor).&#039;&#039;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;19&amp;quot;&amp;gt; Adam Sližka: &amp;lt;!-- Oboril, Oliver:--&amp;gt; LED ako senzor intenzity svetla&lt;br /&gt;
 &amp;lt;li value=&amp;quot;20&amp;quot;&amp;gt; Tomáš Truben: Servomotorček ako indikátor nejakej inej veličiny - ručičku a stupnicu vyrobíte sami.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;21&amp;quot;&amp;gt; Jakub Červenka: &amp;lt;!-- Skachová, Zuzana:--&amp;gt; Semafor s akustickou signalizáciou pre nevidiacich a slabozrakých (frekvencie vid: https://sk.wikipedia.org/wiki/Akustick%C3%BD_maj%C3%A1k)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;22&amp;quot;&amp;gt; Sabina Ovčiariková: &amp;lt;!-- Görözdös, Gergely: --&amp;gt; Binárne hodiny/stopky alebo počítadlo, rozsvietená LED-ky by ukazovali počet sekúnd/počet kliknutí tlačidla, mohlo by to byť sprevádzané pípnutím každých 10 stlačení alebo každú minútu.&lt;br /&gt;
 &amp;lt;li value=&amp;quot;23&amp;quot;&amp;gt; Oleksandr Shyp: &amp;lt;!-- Hajda, Jaroslav: --&amp;gt; &#039;&#039;Posúvanie bodky na 8x8 led displayi pomocou joysticku.&#039;&#039;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;29&amp;quot;&amp;gt; Martin Vdovják: &amp;lt;!-- Mosej, Samuel: --&amp;gt;Digitálny alarm - treba zadať správnu sekvenciu tlačidiel, keď sa vloží správna sekvencia rozsvieti sa tlačidlo, nesprávna sekvencia zabzučí alarm (možno aj pridať možnosť vkladať nové kódy)&lt;br /&gt;
 &amp;lt;li value=&amp;quot;36&amp;quot;&amp;gt; Attila Hriňa: &amp;lt;!--  Papcun, Miroslav: --&amp;gt; Hra na trénovanie hudobného sluchu - reproduktor zahrá 2 (náhodné) tóny a hráč musí povedať, či bol vyšší prvá alebo druhý (dve tlačidlá).&lt;br /&gt;
 &amp;lt;li value=&amp;quot;37&amp;quot;&amp;gt; Korytova, Taisiia: Svetelná križovatka s nočným režimom. &amp;lt;!-- Fabian, Maroš --&amp;gt;&lt;br /&gt;
 &amp;lt;li value=&amp;quot;38&amp;quot;&amp;gt; Ákos Keszegh: Reaction Timer&lt;br /&gt;
 &amp;lt;li value=&amp;quot;39&amp;quot;&amp;gt; Marek Trúchly: Atmel2586 s MEMS akcelerometerom&lt;br /&gt;
 &amp;lt;li value=&amp;quot;40&amp;quot;&amp;gt; Oskar Bálint: Automatické otváranie dverí s PIR senzorom&lt;br /&gt;
 &amp;lt;li value=&amp;quot;41&amp;quot;&amp;gt; Adam Kašička:  Model a signalizácia sekvenčnej prevodovky&lt;br /&gt;
 &amp;lt;li value=&amp;quot;42&amp;quot;&amp;gt; Ing. Ján Šefčík: Riadenie modelu Ball&amp;amp;Beam&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zadania semestrálnych projektov v minulosti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Toto bolo v minulosti, ale na dištančnú formu je to nevhodné. V roku 2021 nebudú pracovať vo dvojiciach, ale individuálne. &lt;br /&gt;
&lt;br /&gt;
Zadanie pozostáva z dvoch častí:&lt;br /&gt;
&lt;br /&gt;
1. teoretická časť - v tejto časti máte popísať v rozsahu max. 10 strán čo a ako ste použili. Typicky tu býva uvedený popis periférnych obvodov, ktoré ste pripojili k mikroprocesoru, použité periférie mikropočítača dôležité registre s popisom jednotlivých bitov atď. (max. 20b.)&lt;br /&gt;
Dokumentáciu budete písať do tejto wiki-stránky, prihlasovacie meno a heslo sa dozviete na cvičení. &lt;br /&gt;
Na prvé zoznámenie so systémom môžete použiť [[Testing Page|testovaciu stránku]] a [[Projekt: vzorová šablóna|vzorový projekt - šablónu]].&lt;br /&gt;
&lt;br /&gt;
2. program - okrem predvedenia programu cvičiacemu je poterbné napísať k nemu tiež krátky popis, alebo vývojový diagram. Môže byť súčasťou prvej časti zadania. (max. 20 b.)&lt;br /&gt;
&lt;br /&gt;
Termín na odovzdanie je na dohode s cvičiacim, najneskôr do skúšky. Na zadaní môžete pracovať priebežne, alebo sa dohodnite s cvičiacim na súvislej práci v laboratóriu (napr. jeden celý deň). POZOR: niektoré zadania vyžadujú prípravu aj od cvičiaceho, nečakajte preto, že prídete a budete mať všetko na prácu nachystané -- treba sa vopred dohodnúť.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lechvár, Slaminka: &#039;&#039;[[Meranie pulzovej frekvencie.]]&#039;&#039; 2014.&lt;br /&gt;
* Jankovič, Lukáč: &#039;&#039;[[Zbernica i2c: hodiny RTC.]]&#039;&#039; 2014.&lt;br /&gt;
* Bača, Galovič: &#039;&#039;[[Bezdrôtová komunikácia v pásme 433 MHz.]]&#039;&#039; 2014.&lt;br /&gt;
* Katona, Nehánszki: &#039;&#039;[[Hodiny RTC s kalendárom pomocou PCF8583]]&#039;&#039;. 2014.&lt;br /&gt;
* Benedek, Cintula, Gahér: &#039;&#039;[[Trojosí gyroskopický modul L3G4200D]]&#039;&#039;. 2014.&lt;br /&gt;
* Šandal, Vincze: &#039;&#039;[[Trojosí akcelerometer MMA7455]]&#039;&#039;. 2014.&lt;br /&gt;
* Kocian, Švančara: &#039;&#039;[[RFID čítačka]]&#039;&#039;. 2014&lt;br /&gt;
* Martinkovič, Valach: &#039;&#039;[[RFID čítačka II]]&#039;&#039;. 2014&lt;br /&gt;
* Jakubička, Vyletel: &#039;&#039;[[Inkrementálny snímač]]&#039;&#039;. 2014&lt;br /&gt;
* Bohuš, Vargic, Gašparová: &#039;&#039;[[MEMS mikrofón ADMP401]]&#039;&#039;. 2014&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2013&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Godál, R. a Šimončič, M.: &#039;&#039;[[Meranie reakčnej doby]].&#039;&#039; 2013.&lt;br /&gt;
* Leško, D. a Biath, V.: &#039;&#039;[[MiniMEXLE Hodiny na orientačný beh]].&#039;&#039; 2013.&lt;br /&gt;
* Paulen, J. a Vojvoda, R.: &#039;&#039;[[Meranie krátkych intervalov]].&#039;&#039; 2013.&lt;br /&gt;
* Jurák, M. a Vlahi, L.: &#039;&#039;[[Meranie časového intervalu]].&#039;&#039; 2013.&lt;br /&gt;
* Rybárik, M. a Lukáč, M.: &#039;&#039;[[Odpočítavacie hodiny na riadenie diskusie]].&#039;&#039; 2013.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekty 2012&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cebák, Darvaši:  &#039;&#039;[[Zbernica i2c: SAA1064|Zbernica i2c: 7-segmentový displej.]]&#039;&#039; 2012.&lt;br /&gt;
* Pecho, Lacko:    &#039;&#039;[[Projekt: Infračervené ovládanie|Infračervené ovládanie]]&#039;&#039; 2012.&lt;br /&gt;
* Rekšák, Mrva:    &#039;&#039;[[Projekt: Inkrementálny snímač otáčok|Inkrementálny snímač otáčok.]]&#039;&#039; 2012.&lt;br /&gt;
* Boráros, Gál:    &#039;&#039;[[Zbernica i2c: FM rádio]].&#039;&#039; 2012.&lt;br /&gt;
* Berčák, Harmata: &#039;&#039;[[Projekt: Hodiny A|Hodiny na orientačný beh I.]]&#039;&#039; 2012.&lt;br /&gt;
* Géczy, Kamenský: &#039;&#039;[[Projekt: Hodiny B|Hodiny na orientačný beh II.]]&#039;&#039; 2012.&lt;br /&gt;
&lt;br /&gt;
* Szolik, Šnyr:    &#039;&#039;[[Projekt: Snímač teploty SMT160|Snímač teploty SMT160]]&#039;&#039; 2012.&lt;br /&gt;
* Gálik, Gogola:   &#039;&#039;[[Projekt: Dvojosí akcelerometer A|Dvojosí akcelerometer I.]]&#039;&#039; 2012.&lt;br /&gt;
* Virág, Topoli:   &#039;&#039;[[Projekt: Dvojosí akcelerometer B|Dvojosí akcelerometer II.]]&#039;&#039; 2012.&lt;br /&gt;
* Statečný:        &#039;&#039;[[Zbernica i2c: SHT11|Zbernica i2c: snímač teploty a vlhkosti SHT11]]&#039;&#039; 2012.&lt;br /&gt;
* Vincze, Rozsár:  &#039;&#039;[[Projekt: Snímač farby ColorPal|Snímač farby ColorPal]]&#039;&#039; 2012.&lt;br /&gt;
* Baláž, Kupčiha:  &#039;&#039;[[Projekt: Snímač teploty DS18B20|Snímač teploty DS18B20]]&#039;&#039; 2012.&lt;br /&gt;
* Mazúch, Lovaš, Oravec: &#039;&#039;[[1-Riadková kamera TSLR1401|1-Riadková kamera TSLR1401]]&#039;&#039; 2012.&lt;br /&gt;
* Špitálová: [[Parkovací senzor]] 2012.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18756</id>
		<title>Jednoduchý P regulátor</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Jednoduch%C3%BD_P_regul%C3%A1tor&amp;diff=18756"/>
		<updated>2026-05-15T21:33:09Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Dariia Dordiai&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;br /&gt;
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...&lt;br /&gt;
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18755</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18755"/>
		<updated>2026-05-15T18:50:25Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;kjprDCVZCww&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18754</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18754"/>
		<updated>2026-05-15T18:42:02Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;tEOrwGmOYDE&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18753</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18753"/>
		<updated>2026-05-15T18:29:38Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;En9OhVOAGXQ&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18752</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18752"/>
		<updated>2026-05-15T18:21:59Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;FlYxItApMGI&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18751</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18751"/>
		<updated>2026-05-15T18:00:21Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18750</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18750"/>
		<updated>2026-05-15T17:59:31Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: odstraňuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset umožňuje bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia pomocou slučky while bráni opakovanému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla, pričom softvérový debounce (10 ms) účinne eliminoval akékoľvek viacnásobné resetovanie pri jednom stlačení.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18749</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18749"/>
		<updated>2026-05-15T17:56:27Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
* Tlačidlo a debouncing:&lt;br /&gt;
10 ms delay: eliminuje mechanické zákmity (debouncing) pred potvrdením stlačenia. Atómický reset: bezpečné vynulovanie encoder_pos pod ochranou inštrukcií cli() a sei().&lt;br /&gt;
Kontrola uvoľnenia: slučka while bráni cyklickému resetovaniu, kým je tlačidlo stlačené.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla, pričom softvérový debounce (10 ms) účinne eliminoval akékoľvek viacnásobné resetovanie pri jednom stlačení.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18748</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18748"/>
		<updated>2026-05-15T17:47:40Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
* Pri otáčaní v smere hodinových ručičiek hodnoty v termináli narastali a pri opačnom pohybe klesali bez akýchkoľvek náhodných skokov.&lt;br /&gt;
* Testovanie presnosti: Vykonal som test rýchleho otáčania hriadeľa v oboch smeroch. Systém sa pri návrate do východiskovej polohy vždy vrátil k 0(ak začínalo z 0).&lt;br /&gt;
* Overenie tlačidla: Krátkym stlačením hriadeľa (tlačidlo SW) som overil okamžité vynulovanie počítadla, pričom softvérový debounce (10 ms) účinne eliminoval akékoľvek viacnásobné resetovanie pri jednom stlačení.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18747</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18747"/>
		<updated>2026-05-15T17:39:14Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra som použil posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18746</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18746"/>
		<updated>2026-05-15T17:38:15Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:ProjectYaroslavBuryk.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:ProjectYaroslavBuryk.zip&amp;diff=18745</id>
		<title>Súbor:ProjectYaroslavBuryk.zip</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:ProjectYaroslavBuryk.zip&amp;diff=18745"/>
		<updated>2026-05-15T17:36:26Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18744</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18744"/>
		<updated>2026-05-15T17:23:54Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18743</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18743"/>
		<updated>2026-05-15T17:23:32Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18742</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18742"/>
		<updated>2026-05-15T17:20:56Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#define BAUD 9600&lt;br /&gt;
#include &amp;lt;util/setbaud.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18741</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18741"/>
		<updated>2026-05-15T17:20:07Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18740</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18740"/>
		<updated>2026-05-15T17:18:36Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void uart_init(void) {&lt;br /&gt;
    UBRR0H = UBRRH_VALUE;&lt;br /&gt;
    UBRR0L = UBRRL_VALUE;&lt;br /&gt;
#if USE_2X&lt;br /&gt;
    UCSR0A |= (1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0);&lt;br /&gt;
#endif&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; RXEN0) | (1 &amp;lt;&amp;lt; TXEN0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream) {&lt;br /&gt;
    if (c == &#039;\n&#039;) uart_putc(&#039;\r&#039;, stream);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0);&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc(FILE *stream) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    return UDR0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s) {&lt;br /&gt;
    while (*s) {&lt;br /&gt;
        uart_putc(*s++, NULL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;uart.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef UART_H_&lt;br /&gt;
#define UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
void uart_init(void);&lt;br /&gt;
&lt;br /&gt;
int uart_putc(char c, FILE *stream);&lt;br /&gt;
int uart_getc(FILE *stream);&lt;br /&gt;
void uart_puts(const char *s);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18739</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18739"/>
		<updated>2026-05-15T17:16:27Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;main.c&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Makrá pre prácu s bitmi	&lt;br /&gt;
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
#define clear_bit(ADDRESS,BIT) (ADDRESS &amp;amp;= ~(1&amp;lt;&amp;lt;BIT))&lt;br /&gt;
&lt;br /&gt;
// Piny pre KY-040 (PD2=CLK, PD3=DT, PD4=SW)&lt;br /&gt;
#define CLK_PIN PD2&lt;br /&gt;
#define DT_PIN  PD3&lt;br /&gt;
#define SW_PIN  PD4&lt;br /&gt;
&lt;br /&gt;
// premenné&lt;br /&gt;
volatile int32_t encoder_pos = 0; &lt;br /&gt;
volatile uint8_t last_state = 0;&lt;br /&gt;
&lt;br /&gt;
// Stavová tabuľka pre spracovanie Grayovho kódu&lt;br /&gt;
const int8_t state_table[] = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};&lt;br /&gt;
&lt;br /&gt;
// Nastavenie výstupu cez UART&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); &lt;br /&gt;
&lt;br /&gt;
// Logika spracovania enkodéra&lt;br /&gt;
// static inline umožňuje kompilátoru vložiť kód priamo do ISR&lt;br /&gt;
static inline void handle_encoder(void) {&lt;br /&gt;
    uint8_t pins = PIND; // Prečítame celý port jedenkrát&lt;br /&gt;
    uint8_t current_state = 0;&lt;br /&gt;
&lt;br /&gt;
    // Formovanie 2-bitového čísla: bit1 = CLK, bit0 = DT&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN)) current_state |= 2;&lt;br /&gt;
    if (pins &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN))  current_state |= 1;&lt;br /&gt;
&lt;br /&gt;
    // Výpočet indexu: (predošlý_stav &amp;lt;&amp;lt; 2) | aktuálny_stav&lt;br /&gt;
    uint8_t index = (last_state &amp;lt;&amp;lt; 2) | current_state;&lt;br /&gt;
    &lt;br /&gt;
    // Aktualizujeme pozíciu podľa tabuľky&lt;br /&gt;
    encoder_pos += state_table[index &amp;amp; 0x0F];&lt;br /&gt;
    &lt;br /&gt;
    // Uloženie stavu pre nasledujúci krok&lt;br /&gt;
    last_state = current_state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Prerušenia na oboch kanáloch pre maximálnu presnosť&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT1_vect) {&lt;br /&gt;
    handle_encoder();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_all() {&lt;br /&gt;
    uart_init(); &lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
&lt;br /&gt;
    // Nastavenie pinov na vstup&lt;br /&gt;
    clear_bit(DDRD, CLK_PIN);&lt;br /&gt;
    clear_bit(DDRD, DT_PIN);&lt;br /&gt;
    clear_bit(DDRD, SW_PIN);&lt;br /&gt;
    &lt;br /&gt;
    // Zapnutie vnútorných prťahovacích odporov&lt;br /&gt;
    set_bit(PORTD, CLK_PIN);&lt;br /&gt;
    set_bit(PORTD, DT_PIN);&lt;br /&gt;
    set_bit(PORTD, SW_PIN);&lt;br /&gt;
&lt;br /&gt;
    // Inicializácia predvoleného stavu PRED povolením prerušení&lt;br /&gt;
    last_state = (PIND &amp;amp; (1 &amp;lt;&amp;lt; CLK_PIN) ? 2 : 0) | (PIND &amp;amp; (1 &amp;lt;&amp;lt; DT_PIN) ? 1 : 0);&lt;br /&gt;
&lt;br /&gt;
    // Nastavenie externých prerušení na akúkoľvek logickú zmenu&lt;br /&gt;
    EICRA |= (1 &amp;lt;&amp;lt; ISC00) | (1 &amp;lt;&amp;lt; ISC10); &lt;br /&gt;
    EIMSK |= (1 &amp;lt;&amp;lt; INT0) | (1 &amp;lt;&amp;lt; INT1);&lt;br /&gt;
    &lt;br /&gt;
    sei(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
    init_all();&lt;br /&gt;
    int32_t last_printed = 0;&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\n--- Digital Potentiometer Ready ---\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    while(1) {&lt;br /&gt;
        // Atomické čítanie pozície (ochrana pred prerušením počas čítania 4 bajtov)&lt;br /&gt;
        int32_t safe_pos;&lt;br /&gt;
        cli();&lt;br /&gt;
        safe_pos = encoder_pos;&lt;br /&gt;
        sei();&lt;br /&gt;
&lt;br /&gt;
        // Spracovanie stlačenia tlačidla (reset to zero)&lt;br /&gt;
        if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
            _delay_ms(10); // Softvérový debounce pre tlačidlo&lt;br /&gt;
            if (!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))) {&lt;br /&gt;
                cli();&lt;br /&gt;
                encoder_pos = 0;&lt;br /&gt;
                safe_pos = 0;&lt;br /&gt;
                sei();&lt;br /&gt;
                printf(&amp;quot;[ RESET TO ZERO ]\n&amp;quot;);&lt;br /&gt;
                while(!(PIND &amp;amp; (1 &amp;lt;&amp;lt; SW_PIN))); // Čakáme na uvoľnenie&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Výpis do konzoly iba pri zmene&lt;br /&gt;
        if (safe_pos != last_printed) {&lt;br /&gt;
            printf(&amp;quot;Steps: %ld \n&amp;quot;, safe_pos);&lt;br /&gt;
            last_printed = safe_pos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18738</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18738"/>
		<updated>2026-05-15T17:10:58Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:KY-040.jpg|400px|thumb|center|KY-040.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:KY-040.jpg&amp;diff=18737</id>
		<title>Súbor:KY-040.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:KY-040.jpg&amp;diff=18737"/>
		<updated>2026-05-15T17:10:17Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18736</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18736"/>
		<updated>2026-05-15T17:09:41Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Zapojenie]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18735</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18735"/>
		<updated>2026-05-15T17:06:21Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Na overenie funkčnosti digitálneho potenciometra použijeme posielanie dát cez sériový terminál pomocou knižnice UART.&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18734</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18734"/>
		<updated>2026-05-15T17:00:55Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Overenie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Testovanie prebehlo pomocou sériového monitora pri prenosovej rýchlosti nastavenej v knižnici UART.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18733</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18733"/>
		<updated>2026-05-15T16:55:22Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
* Atómový prístup (Atómia dát):&lt;br /&gt;
Keďže int32_t je 32-bitová premenná na 8-bitovom procesore, jej čítanie v hlavnej slučke prebieha v kritickej sekcii medzi cli() a sei().&lt;br /&gt;
*Funkcia init_all():&lt;br /&gt;
Konfiguruje piny ako vstupné, zapína interné pull-up rezistory a inicializuje počiatočný stav last_state&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18732</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18732"/>
		<updated>2026-05-15T16:53:47Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Program je rozdelený na obsluhu prerušení (vysoká priorita) a hlavnú slučku (spracovanie výstupu). &lt;br /&gt;
*Obsluha prerušení (ISR):&lt;br /&gt;
Používame externé prerušenia INT0 (PD2) a INT1 (PD3). Obe funkcie volajú spoločnú funkciu handle_encoder(). static inline void handle_encoder(): Táto funkcia je optimalizovaná pre rýchlosť. Číta celý port PIND naraz, čím zabezpečuje synchronizáciu dát CLK a DT.&lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18731</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18731"/>
		<updated>2026-05-15T16:50:22Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18730</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18730"/>
		<updated>2026-05-15T16:49:37Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Algoritmus a program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18729</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18729"/>
		<updated>2026-05-15T16:48:51Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18728</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18728"/>
		<updated>2026-05-15T16:48:12Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Schéma zapojenia: Enkodér je napájaný cez 5V a GND z Arduina. Signály CLK, DT a SW pripájam k digitálnym vstupom D2, D3 a D4. Na potlačenie šumu používam 47nF kondenzátory zapojené medzi CLK/DT a zemou.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18727</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18727"/>
		<updated>2026-05-15T16:44:18Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18726</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18726"/>
		<updated>2026-05-15T16:43:59Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* * [https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf?srsltid=AfmBOooZffelqefbJSubrHjM7WgmpMoAZWkroVXYnVCgRyxkQOjlL_Fk/ Datasheet KY-040]&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18725</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18725"/>
		<updated>2026-05-15T16:42:58Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zadanie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18724</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18724"/>
		<updated>2026-05-15T16:42:49Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zadanie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
** [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18723</id>
		<title>Digitálny potenciometer</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Digit%C3%A1lny_potenciometer&amp;diff=18723"/>
		<updated>2026-05-15T16:40:21Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Analýza  a opis riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Yaroslav Buryk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom bolo navrhnúť a realizovať program pre mikrokontrolér (ATmega328P), ktorý slúži ako digitálny potenciometer.Program musí presne načítavať impulzy bez straty krokov aj pri rýchlej zmene smeru otáčania a realizovať ošetrenie voči mechanickým zákmitom kontaktov (debouncing).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Pinout-UNOrev3 latest.png|400px|thumb|center|Arduino UNO]]&lt;br /&gt;
&lt;br /&gt;
https://docs.arduino.cc/static/cb2219c4f549dd9a7fe040362b668567/a6d36/Pinout-UNOrev3_latest.png&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://docs.arduino.cc/hardware/uno-rev3/ Dokumentácia k arduino UNO]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Analýza  a opis riešenia ==&lt;br /&gt;
&lt;br /&gt;
Pre riešenie úlohy bol zvolený prístup využívajúci hardvérové prerušenia a stavový automat (FSM). Na detekciu smeru otáčania sa využíva stavová tabuľka (state table), ktorá vyhodnocuje prechody v Grayovom kóde. Každá zmena na pinoch vyvolá prerušenie, kde sa porovnáva predchádzajúci stav s aktuálnym.&lt;br /&gt;
Použité komponenty: &lt;br /&gt;
* ATmega328P (Arduino Uno)&lt;br /&gt;
* Rotačný enkóder KY-040: Inkrementálny enkóder generujúci dva signály (CLK a DT).&lt;br /&gt;
* Na potlačenie mechanických zákmitov boli použité dva externé keramické kondenzátory s kapacitou 47 nF pripojené medzi signálne piny (CLK, DT) a zem.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Photo 2026-05-15 18-01-32.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Schem zap12312.jpg|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... &lt;br /&gt;
Výpis kódu je nižšie...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;AVR C-code&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  unsigned int measuredValue;&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    /*  relax  */  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;filename.h&amp;quot;&amp;gt;&amp;lt;syntaxhighlight  lang=&amp;quot;c++&amp;quot; style=&amp;quot;background: LightYellow;&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void adc_init(void);                                   // A/D converter initialization&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x &#039;&#039;zdrojaky.zip&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. &lt;br /&gt;
Na konci uvádzame fotku hotového zariadenia. &lt;br /&gt;
&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Video:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;D0UnqGm_miA&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kľúčové slová &#039;Category&#039;, ktoré sú na konci stránky nemeňte. &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>StudentMIPS</name></author>
	</entry>
</feed>