<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>https://senzor.robotika.sk/sensorwiki/index.php?action=history&amp;feed=atom&amp;title=Pohybliv%C3%BD_text</id>
	<title>Pohyblivý text - História úprav</title>
	<link rel="self" type="application/atom+xml" href="https://senzor.robotika.sk/sensorwiki/index.php?action=history&amp;feed=atom&amp;title=Pohybliv%C3%BD_text"/>
	<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Pohybliv%C3%BD_text&amp;action=history"/>
	<updated>2026-06-07T14:43:50Z</updated>
	<subtitle>História úprav pre túto stránku na wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Pohybliv%C3%BD_text&amp;diff=19340&amp;oldid=prev</id>
		<title>Balogh na 09:58, 7. jún 2026</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Pohybliv%C3%BD_text&amp;diff=19340&amp;oldid=prev"/>
		<updated>2026-06-07T09:58:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sk&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Staršia verzia&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Verzia z 09:58, 7. jún 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;Riadok 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riadok 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Literatúra:&amp;#039;&amp;#039;&amp;#039;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Literatúra:&amp;#039;&amp;#039;&amp;#039;  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Balogh</name></author>
	</entry>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Pohybliv%C3%BD_text&amp;diff=19339&amp;oldid=prev</id>
		<title>Balogh: Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Dariia Dordiai&#039;&#039;&#039;   == Zadanie ==  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ť ľubo…“</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Pohybliv%C3%BD_text&amp;diff=19339&amp;oldid=prev"/>
		<updated>2026-06-07T09:57:52Z</updated>

		<summary type="html">&lt;p&gt;Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2026 - &amp;#039;&amp;#039;&amp;#039;Dariia Dordiai&amp;#039;&amp;#039;&amp;#039;   == Zadanie ==  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ť ľubo…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &amp;#039;&amp;#039;&amp;#039;Dariia Dordiai&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Literatúra:&amp;#039;&amp;#039;&amp;#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;
[[Obrázok:photo_2026-06-06_19-41-34.jpg|400px|thumb|center|Zapojenie vývojovej dosky ACROB s LCD modulom a potenciometrom.]]&lt;br /&gt;
&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;
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]&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;
[[Obrázok:LCD_AppMod.jpg|400px|thumb|center|LCD modul EA-DOGM163.]]&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;
Program je napísaný v jazyku C pre mikrokontrolér ATmega328P. Po inicializácii UART, LCD displeja a ADC vstupuje program do nekonečnej slučky.&lt;br /&gt;
V každom cykle sa načíta hodnota z potenciometra. Aby sa eliminoval šum, meranie sa opakuje päťkrát s prestávkou 5 ms a výsledok sa spriemeruje. Ak je výsledná hodnota väčšia ako 1000, automaticky sa zaokrúhli na 1023 — táto mŕtva zóna zabraňuje chveniu textu pri krajnej polohe potenciometra.&lt;br /&gt;
Hodnota ADC sa prepočíta na pozíciu kurzora v rozsahu 0–10 podľa vzorca:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
pos = ((1023 - val) × MAX_COL) / 1023&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Text sa prepíše na displej len vtedy, keď sa pozícia zmení oproti predchádzajúcemu cyklu. Tým sa predchádza zbytočnému blikaniu displeja. Riadok sa najprv vymaže funkciou lcd_clearline(), následne sa nastaví kurzor na novú pozíciu a vypíše sa text pomocou lcd_puts().&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;
#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;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
#include &amp;quot;adc.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
#define TEXT &amp;quot;DARIIA&amp;quot;   // zobrazovaný text&lt;br /&gt;
#define TEXT_LEN 6      // dĺžka textu&lt;br /&gt;
#define MAX_COL 10      // maximálna pozícia kurzora&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    uart_init();        // inicializácia UART&lt;br /&gt;
    stdout = &amp;amp;mystdout;&lt;br /&gt;
    lcd_init();         // inicializácia LCD displeja&lt;br /&gt;
    lcd_bklt(1);        // zapnutie podsvietenia&lt;br /&gt;
    adc_init();         // inicializácia ADC&lt;br /&gt;
    int last_pos = -1;  // posledná pozícia textu&lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        // načítanie hodnoty z potenciometra (priemer 5 meraní)&lt;br /&gt;
        unsigned int val = 0;&lt;br /&gt;
        for (uint8_t i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
            val += adc_read(4);  // čítanie ADC kanála 4&lt;br /&gt;
            _delay_ms(5);&lt;br /&gt;
        }&lt;br /&gt;
        val /= 5;  // výpočet priemeru&lt;br /&gt;
&lt;br /&gt;
        // mŕtva zóna — stabilizácia pri krajnej polohe&lt;br /&gt;
        if (val &amp;gt; 1000) val = 1023;&lt;br /&gt;
&lt;br /&gt;
        // prepočet hodnoty ADC na pozíciu kurzora (0 - 10)&lt;br /&gt;
        int pos = ((1023 - val) * MAX_COL) / 1023;&lt;br /&gt;
&lt;br /&gt;
        // aktualizácia displeja len pri zmene pozície&lt;br /&gt;
        if (pos != last_pos)&lt;br /&gt;
        {&lt;br /&gt;
            lcd_clearline(1);   // vymazanie riadku&lt;br /&gt;
            _delay_ms(2);       // krátka pauza po vymazaní&lt;br /&gt;
            lcd_setCursor(1, pos); // nastavenie kurzora na novú pozíciu&lt;br /&gt;
            lcd_puts(TEXT);     // vypísanie textu&lt;br /&gt;
            last_pos = pos;     // uloženie aktuálnej pozície&lt;br /&gt;
        }&lt;br /&gt;
        _delay_ms(150);  // pauza pred ďalším cyklom&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;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 BAUD       9600&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/setbaud.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void uart_init( void ) &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 |= _BV(U2X0);&lt;br /&gt;
#else&lt;br /&gt;
    UCSR0A &amp;amp;= ~(_BV(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;
void uart_putc(char c) &lt;br /&gt;
{&lt;br /&gt;
   if (c == &amp;#039;\n&amp;#039;) &lt;br /&gt;
    {&lt;br /&gt;
       uart_putc(&amp;#039;\r&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
   loop_until_bit_is_set(UCSR0A, UDRE0);  &lt;br /&gt;
   UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void uart_puts(const char *s)&lt;br /&gt;
{&lt;br /&gt;
 int i=0;&lt;br /&gt;
 for(i=0;s[i]!=&amp;#039;\0&amp;#039;;i++)&lt;br /&gt;
 uart_putc(s[i]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char uart_getc(void) {&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0); &lt;br /&gt;
    return UDR0;&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;
&lt;br /&gt;
void uart_init( void );&lt;br /&gt;
     &lt;br /&gt;
void uart_putc( char c );&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;
&lt;br /&gt;
&lt;br /&gt;
#endif /* UART_H_ */&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;lcd.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;lcd.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* Primitívne funkcie, nepredpokladá sa ich využitie užívateľom */&lt;br /&gt;
&lt;br /&gt;
/* Funkcia zapíše jeden bajt po SPI zbernici do zariadenia */&lt;br /&gt;
void lcd_write( char data )&lt;br /&gt;
{&lt;br /&gt;
    signed char index = 8;&lt;br /&gt;
    char c_data;&lt;br /&gt;
&lt;br /&gt;
    DISPLAY_CSB_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_CSB_PIN);  // Chip-Select do log.0&lt;br /&gt;
    c_data = data;&lt;br /&gt;
&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        _delay_us(6);&lt;br /&gt;
        if ( c_data &amp;amp; 0x80 )         // najvyšší bit zamaskujeme&lt;br /&gt;
            PORTB |= (1&amp;lt;&amp;lt;3);         // a pošleme ho na zbernicu&lt;br /&gt;
        else&lt;br /&gt;
            PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;3);        // cez vodič MOSI&lt;br /&gt;
        _delay_us(5);                // vygenerujeme jeden hodinový pulz&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;5);            // na vývod CLK&lt;br /&gt;
        _delay_us(6);&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;5);&lt;br /&gt;
&lt;br /&gt;
        c_data = c_data &amp;lt;&amp;lt; 1;        // na najvyššie miesto posunieme ďalší bit&lt;br /&gt;
        index--;&lt;br /&gt;
&lt;br /&gt;
    } while (index &amp;gt; 0);             // opakujeme 8-krát&lt;br /&gt;
&lt;br /&gt;
    _delay_ms( 2 );&lt;br /&gt;
    DISPLAY_CSB_PORT |= (1&amp;lt;&amp;lt;DISPLAY_CSB_PIN);   // zdvihneme /CS do log.1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Funkcia zapíše jeden bajt do riadiaceho (Control) registra */&lt;br /&gt;
void lcd_command( char instruction )&lt;br /&gt;
{&lt;br /&gt;
    DISPLAY_RS_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_RS_PIN);  // RS = 0 → príkaz&lt;br /&gt;
    _delay_us( 1 );&lt;br /&gt;
    lcd_write( instruction );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Funkcia zapíše jeden bajt do dátového (Data) registra */&lt;br /&gt;
void lcd_data( char data )&lt;br /&gt;
{&lt;br /&gt;
    DISPLAY_RS_PORT |= 1&amp;lt;&amp;lt;DISPLAY_RS_PIN;  // RS = 1 → dáta&lt;br /&gt;
    _delay_us( 7 );&lt;br /&gt;
    lcd_write( data );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Užívateľské funkcie */&lt;br /&gt;
&lt;br /&gt;
/* Inicializácia displeja podľa datasheetu pre radič ST7036 */&lt;br /&gt;
void lcd_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;PB3) | (1&amp;lt;&amp;lt;PB5);      // MOSI + SCK ako výstupy&lt;br /&gt;
    DISPLAY_RS_DDR  |= 1&amp;lt;&amp;lt;DISPLAY_RS_PIN;    // RS ako výstup&lt;br /&gt;
    DISPLAY_CSB_DDR |= 1&amp;lt;&amp;lt;DISPLAY_CSB_PIN;   // CSB ako výstup&lt;br /&gt;
    DISPLAY_BKLT_DDR|= 1&amp;lt;&amp;lt;DISPLAY_BKLT_PIN;  // podsvietenie ako výstup&lt;br /&gt;
&lt;br /&gt;
    PORTB |= (1&amp;lt;&amp;lt;PB5);                        // CLK do log.1&lt;br /&gt;
    DISPLAY_CSB_PORT |= (1&amp;lt;&amp;lt;DISPLAY_CSB_PIN); // CSB do log.1&lt;br /&gt;
    DISPLAY_RS_PORT  &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_RS_PIN); // RS do log.0&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(50);       // čakáme viac ako 40ms na ustálenie napájacieho napätia&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x39 ); // nastavenie funkcie: 8-bit, 2 riadky, tabuľka inštrukcií 1&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x1d ); // nastavenie Bias: BS 1/5, 3-riadkový displej&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x50 ); // Booster vypnutý, nastavenie kontrastu C5, C4&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x6c ); // nastavenie napäťového sledovača a zosilnenia&lt;br /&gt;
    _delay_ms( 500 );    // čakáme viac ako 200ms&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x7c ); // nastavenie kontrastu C3, C2, C1&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x38 ); // zapnutie displeja&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x0c ); // displej zapnutý, kurzor vypnutý&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x01 ); // vymazanie displeja, kurzor na začiatok&lt;br /&gt;
    _delay_ms(400);&lt;br /&gt;
&lt;br /&gt;
    lcd_command( 0x06 ); // automatický posun kurzora doprava&lt;br /&gt;
    _delay_us(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia zobrazí na pozícii kurzora jeden znak */&lt;br /&gt;
void lcd_putc( char znak )&lt;br /&gt;
{&lt;br /&gt;
    lcd_data(znak);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia vypíše reťazec znakov na displej */&lt;br /&gt;
void lcd_puts(char *string)&lt;br /&gt;
{&lt;br /&gt;
    while (*string) {&lt;br /&gt;
        lcd_data(*string);  // posiela znaky jeden po druhom&lt;br /&gt;
        string++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia nastaví kurzor na pozíciu riadok, stĺpec */&lt;br /&gt;
void lcd_setCursor(char row, char col)&lt;br /&gt;
{&lt;br /&gt;
    // adresy riadkov pre 3-riadkový displej 16x3&lt;br /&gt;
    const char row_offsets[] = {0x00, 0x10, 0x20};&lt;br /&gt;
    lcd_command(0x80 | (row_offsets[row] + col));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia vymaže jeden riadok displeja */&lt;br /&gt;
void lcd_clearline( unsigned char riadok )&lt;br /&gt;
{&lt;br /&gt;
    unsigned char index;&lt;br /&gt;
    lcd_setCursor( riadok, 0 );&lt;br /&gt;
    for (index=1; index&amp;lt;20; index++) lcd_data( &amp;#039; &amp;#039; );  // vypĺňame medzerami&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia vymaže celý displej */&lt;br /&gt;
void lcd_clear( void )&lt;br /&gt;
{&lt;br /&gt;
    lcd_clearline( 0 );  // vymazanie 1. riadku&lt;br /&gt;
    lcd_clearline( 1 );  // vymazanie 2. riadku&lt;br /&gt;
    lcd_clearline( 2 );  // vymazanie 3. riadku&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia zapne alebo vypne podsvietenie displeja */&lt;br /&gt;
void lcd_bklt( char OnOff)&lt;br /&gt;
{&lt;br /&gt;
    if (OnOff)&lt;br /&gt;
        DISPLAY_BKLT_high;  // podsvietenie zapnuté&lt;br /&gt;
    else&lt;br /&gt;
        DISPLAY_BKLT_low;   // podsvietenie vypnuté&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Funkcia uloží užívateľom definovaný znak do CG RAM na adresu */&lt;br /&gt;
void def_znak(unsigned char *ZnakArray, unsigned char Address)&lt;br /&gt;
{&lt;br /&gt;
  lcd_command(0x40|(Address&amp;lt;&amp;lt;3));  //nastavenie adresy znaku v CGRAM&lt;br /&gt;
  for(unsigned char i = 0;i&amp;lt;8; i++) lcd_data( *(ZnakArray + i));&lt;br /&gt;
  lcd_command(0x80);               // zmena na DD RAM&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;lcd.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 LCD_H_&lt;br /&gt;
#define LCD_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define CHARACTER_BUFFER_BASE_ADDRESS 0x80&lt;br /&gt;
#define CHARACTERS_PER_ROW 16&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_RS_PORT PORTD&lt;br /&gt;
#define DISPLAY_RS_DDR DDRD&lt;br /&gt;
#define DISPLAY_RS_PIN 2&lt;br /&gt;
#define DISPLAY_CSB_PORT PORTD&lt;br /&gt;
#define DISPLAY_CSB_DDR DDRD&lt;br /&gt;
#define DISPLAY_CSB_PIN 4&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_BKLT_PORT PORTD&lt;br /&gt;
#define DISPLAY_BKLT_DDR DDRD&lt;br /&gt;
#define DISPLAY_BKLT_PIN 6&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_RS_low   (DISPLAY_RS_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_RS_PIN))&lt;br /&gt;
#define DISPLAY_RS_high  (DISPLAY_RS_PORT |= (1&amp;lt;&amp;lt;DISPLAY_RS_PIN))&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_CSB_low  (DISPLAY_CSB_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_CSB_PIN))&lt;br /&gt;
#define DISPLAY_CSB_high (DISPLAY_CSB_PORT |= (1&amp;lt;&amp;lt;DISPLAY_CSB_PIN))&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_BKLT_low   (DISPLAY_BKLT_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_BKLT_PIN))&lt;br /&gt;
#define DISPLAY_BKLT_high  (DISPLAY_BKLT_PORT |= (1&amp;lt;&amp;lt;DISPLAY_BKLT_PIN))&lt;br /&gt;
&lt;br /&gt;
#define INSTRUCTION_CLEAR_DISPLAY        0b00000001&lt;br /&gt;
#define INSTRUCTION_FUNCTION_SET_INIT_0    0b00110011&lt;br /&gt;
#define INSTRUCTION_FUNCTION_SET_INIT_1    0b00110010&lt;br /&gt;
#define INSTRUCTION_FUNCTION_SET_INIT_2    0b00101001&lt;br /&gt;
#define INSTRUCTION_INSTRUCTION_SET_0      0b00101000&lt;br /&gt;
#define INSTRUCTION_INSTRUCTION_SET_1     0b00101001&lt;br /&gt;
#define INSTRUCTION_BIAS_SET        0b00010101&lt;br /&gt;
#define INSTRUCTION_POWER_CONTROL       0b01010011&lt;br /&gt;
#define INSTRUCTION_FOLLOWER_CONTROL    0b01101100&lt;br /&gt;
#define INSTRUCTION_CONTRAST_SET      0b01111111&lt;br /&gt;
#define INSTRUCTION_DISPLAY_ON        0b00001100&lt;br /&gt;
#define INSTRUCTION_ENTRY_MODE         0b00000110&lt;br /&gt;
&lt;br /&gt;
void lcd_init(void);&lt;br /&gt;
void lcd_write( char data );&lt;br /&gt;
void lcd_data( char data );     &lt;br /&gt;
void lcd_command( char instruction );&lt;br /&gt;
&lt;br /&gt;
void lcd_putc( char znak );&lt;br /&gt;
void lcd_puts( char *string );&lt;br /&gt;
&lt;br /&gt;
void lcd_clear( void );&lt;br /&gt;
void lcd_clearline( unsigned char zeile );&lt;br /&gt;
&lt;br /&gt;
void lcd_setCursor(char row, char col);&lt;br /&gt;
void lcd_bklt( char OnOff);&lt;br /&gt;
&lt;br /&gt;
void def_znak(unsigned char *ZnakArray, unsigned char Address);&lt;br /&gt;
&lt;br /&gt;
#endif /* LCD_H_ */&lt;br /&gt;
 &amp;lt;/syntaxhighlight &amp;gt;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;adc.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;
&lt;br /&gt;
void adc_init(void)&lt;br /&gt;
{&lt;br /&gt;
ADMUX = (1&amp;lt;&amp;lt;REFS0); &lt;br /&gt;
ADCSRA = (1&amp;lt;&amp;lt;ADEN)|(1&amp;lt;&amp;lt;ADPS2)|(1&amp;lt;&amp;lt;ADPS1)|(1&amp;lt;&amp;lt;ADPS0); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char channel)&lt;br /&gt;
{&lt;br /&gt;
channel &amp;amp;= 0x0F;&lt;br /&gt;
ADMUX = (ADMUX &amp;amp; 0xF0)|channel;&lt;br /&gt;
ADCSRA |= (1&amp;lt;&amp;lt;ADSC); &lt;br /&gt;
while(ADCSRA &amp;amp; (1&amp;lt;&amp;lt;ADSC))&lt;br /&gt;
{ /* wait */ } &lt;br /&gt;
return (ADC);&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;adc.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);                   &lt;br /&gt;
&lt;br /&gt;
unsigned int adc_read(char a_pin);&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á:Dordiai_Dariia_projekt.zip|Dordiai_Dariia_projekt.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Funkčnosť zariadenia bola overená manuálnym testovaním. Po zapnutí napájania sa na LCD displeji zobrazí text na predvolenej pozícii. Otočením potenciometra vľavo sa text posúva smerom doľava, otočením vpravo sa posúva doprava. Text sa aktualizuje plynule a bez blikania.&lt;br /&gt;
Overenie prebehlo úspešne — text sa zobrazuje správne na všetkých pozíciách v rozsahu 0–10 a zariadenie reaguje na zmenu polohy potenciometra bez oneskorenia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Video:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;youtube&amp;gt;https://youtu.be/8OyxNfwQ5Wk&amp;lt;/youtube&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobila inak ==&lt;br /&gt;
&lt;br /&gt;
Do budúcna by som implementovala plynulejší pohyb textu pomocou prerušení namiesto oneskorení _delay_ms(). Použitie časovača s prerušením by umožnilo presnejšie časovanie a mikrokontrolér by mohol počas čakania vykonávať iné úlohy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]] [[Category:MIPS]]&lt;/div&gt;</summary>
		<author><name>Balogh</name></author>
	</entry>
</feed>