<?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-07-06T18:45:10Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19673</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19673"/>
		<updated>2026-06-23T21:16:26Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
Zdrojový kód: [[Médiá:Domchuk_Dmytro_MIPS_projekt.zip|zdrojak Domchuk.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Overovali sme naš program tym že menili sme polohu potenciometra a pozerali ako sa zmeni graf na serial plot.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr0.jpg|400px|thumb|center|Poloha potenciometra 0.]]&lt;br /&gt;
[[Súbor:Graf0.jpg|400px|thumb|center|Graf pri polohe potenciometra 0.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr3.7.jpg|400px|thumb|center|Poloha potenciometra 3.7.]]&lt;br /&gt;
[[Súbor:Graf3.7.jpg|400px|thumb|center|Graf pri polohe potenciometra 3.7.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr4,2.jpg|400px|thumb|center|Poloha potenciometra 4.2.]]&lt;br /&gt;
[[Súbor:Graf4.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 4.2.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr5.2.jpg|400px|thumb|center|Poloha potenciometra 5.2.]]&lt;br /&gt;
[[Súbor:Graf5.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 5.2.]]&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Nabuduce pre riešenie tohto problemu zrušil by som posun nuly pri sčitanií ADC. Takže zmenil by som Baud na dajme tomu 115200 pre rychlejší prenos signalu. Takže nabuduce spravil by som to z viac profesionalnym pristupom a vytvorenim samostatnych funkcí.&lt;br /&gt;
Nepodarilo sa mi odladiť program tak aby signal bol ustalený a ne kmital.&lt;br /&gt;
&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=S%C3%BAbor:Domchuk_Dmytro_MIPS_projekt.zip&amp;diff=19672</id>
		<title>Súbor:Domchuk Dmytro MIPS projekt.zip</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Domchuk_Dmytro_MIPS_projekt.zip&amp;diff=19672"/>
		<updated>2026-06-23T21:15:08Z</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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19671</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19671"/>
		<updated>2026-06-23T21:13:25Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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;
Overovali sme naš program tym že menili sme polohu potenciometra a pozerali ako sa zmeni graf na serial plot.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr0.jpg|400px|thumb|center|Poloha potenciometra 0.]]&lt;br /&gt;
[[Súbor:Graf0.jpg|400px|thumb|center|Graf pri polohe potenciometra 0.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr3.7.jpg|400px|thumb|center|Poloha potenciometra 3.7.]]&lt;br /&gt;
[[Súbor:Graf3.7.jpg|400px|thumb|center|Graf pri polohe potenciometra 3.7.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr4,2.jpg|400px|thumb|center|Poloha potenciometra 4.2.]]&lt;br /&gt;
[[Súbor:Graf4.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 4.2.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr5.2.jpg|400px|thumb|center|Poloha potenciometra 5.2.]]&lt;br /&gt;
[[Súbor:Graf5.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 5.2.]]&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Nabuduce pre riešenie tohto problemu zrušil by som posun nuly pri sčitanií ADC. Takže zmenil by som Baud na dajme tomu 115200 pre rychlejší prenos signalu. Takže nabuduce spravil by som to z viac profesionalnym pristupom a vytvorenim samostatnych funkcí.&lt;br /&gt;
Nepodarilo sa mi odladiť program tak aby signal bol ustalený a ne kmital.&lt;br /&gt;
&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19670</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19670"/>
		<updated>2026-06-23T21:07:45Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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;
Overovali sme naš program tym že menili sme polohu potenciometra a pozerali ako sa zmeni graf na serial plot.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr0.jpg|400px|thumb|center|Poloha potenciometra 0.]]&lt;br /&gt;
[[Súbor:Graf0.jpg|400px|thumb|center|Graf pri polohe potenciometra 0.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr3.7.jpg|400px|thumb|center|Poloha potenciometra 3.7.]]&lt;br /&gt;
[[Súbor:Graf3.7.jpg|400px|thumb|center|Graf pri polohe potenciometra 3.7.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr4,2.jpg|400px|thumb|center|Poloha potenciometra 4.2.]]&lt;br /&gt;
[[Súbor:Graf4.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 4.2.]]&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr5.2.jpg|400px|thumb|center|Poloha potenciometra 5.2.]]&lt;br /&gt;
[[Súbor:Graf5.2.jpg|400px|thumb|center|Graf pri polohe potenciometra 5.2.]]&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19669</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19669"/>
		<updated>2026-06-23T21:04:54Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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;
Overovali sme naš program tym že menili sme polohu potenciometra a pozerali ako sa zmeni graf na serial plot.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Potenciometr0.jpg|400px|thumb|center|Poloha potenciometra 0.]]&lt;br /&gt;
[[Súbor:Graf0.jpg|400px|thumb|center|Graf pri polohe potenciometra 0.]]&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:Graf5.2.jpg&amp;diff=19668</id>
		<title>Súbor:Graf5.2.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Graf5.2.jpg&amp;diff=19668"/>
		<updated>2026-06-23T21:00:45Z</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=S%C3%BAbor:Graf0.jpg&amp;diff=19667</id>
		<title>Súbor:Graf0.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Graf0.jpg&amp;diff=19667"/>
		<updated>2026-06-23T21:00:25Z</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=S%C3%BAbor:Graf4.2.jpg&amp;diff=19666</id>
		<title>Súbor:Graf4.2.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Graf4.2.jpg&amp;diff=19666"/>
		<updated>2026-06-23T21:00:10Z</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=S%C3%BAbor:Graf3.7.jpg&amp;diff=19665</id>
		<title>Súbor:Graf3.7.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Graf3.7.jpg&amp;diff=19665"/>
		<updated>2026-06-23T20:59:50Z</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=S%C3%BAbor:Potenciometr5.2.jpg&amp;diff=19664</id>
		<title>Súbor:Potenciometr5.2.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Potenciometr5.2.jpg&amp;diff=19664"/>
		<updated>2026-06-23T20:59:27Z</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=S%C3%BAbor:Potenciometr3.7.jpg&amp;diff=19663</id>
		<title>Súbor:Potenciometr3.7.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Potenciometr3.7.jpg&amp;diff=19663"/>
		<updated>2026-06-23T20:59:01Z</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=S%C3%BAbor:Potenciometr0.jpg&amp;diff=19662</id>
		<title>Súbor:Potenciometr0.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Potenciometr0.jpg&amp;diff=19662"/>
		<updated>2026-06-23T20:58:20Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: StudentMIPS nahral novú verziu Súbor:Potenciometr0.jpg&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=S%C3%BAbor:Potenciometr4,2.jpg&amp;diff=19661</id>
		<title>Súbor:Potenciometr4,2.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Potenciometr4,2.jpg&amp;diff=19661"/>
		<updated>2026-06-23T20:57:45Z</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=S%C3%BAbor:Potenciometr0.jpg&amp;diff=19660</id>
		<title>Súbor:Potenciometr0.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Potenciometr0.jpg&amp;diff=19660"/>
		<updated>2026-06-23T20:56:02Z</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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19659</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19659"/>
		<updated>2026-06-23T19:08:53Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19658</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19658"/>
		<updated>2026-06-23T19:08:26Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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|left|Aplikácia.]]&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19657</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19657"/>
		<updated>2026-06-23T19:08:01Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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|left|Aplikácia.]]&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|right|Aplikácia.]]&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19656</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19656"/>
		<updated>2026-06-23T19:07:36Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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|left|Aplikácia.]]&lt;br /&gt;
[[Súbor:GeminiAI-image1.jpg|400px|thumb|right|Aplikácia.]]&lt;br /&gt;
&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19655</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19655"/>
		<updated>2026-06-23T19:05: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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&lt;br /&gt;
Funkcia void UART_init() robo inicializaciu UART pre baud 14400  a posialanie 8 datovych bitov a 1 stop bit.  Funkcia void UART_transmit_byte(uint8_t data) čaka pokial bufer sa vyprazdni a posiela 8 datovych bitov. Funkcia void UART_send_int16(int16_t value) 2 krat použiva predchadzajucu funkciu na posielani jedneho čisla typu int16. Inicializaciu ADC robi void ADC_init(). Funkcia uint16_t ADC_read() načitava hodnotu z ADC.Inicializujeme Timer1 v void Timer1_init(). Funkcia ISR(TIMER1_COMPA_vect) je rutiniu prerušenia. Ne použil som funkcie uart.c a adc.c zo semestra lebo musel by som ich moc silno zmeniť, takže na jeden krat stači aj realizacia priamo v programe. Ale pri vetšiem počte podobnych programov alebo pre zabezpečenie fungovania na viacerych zariadeniach radšej spraviť zvlašť hlavnu slučku a funkcie.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19654</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19654"/>
		<updated>2026-06-23T18:49:25Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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  v hlavnej slučke sa začina tym že robí inicializaciu UART, ADC a Timer1 apovoluje prerušenia pomocou sei(). Ďalej zapisuje parametre integratora. Potom program zčita hodnotu z ADC a spravi posun nuly. Ďalej sa vytvori pasmo necitlivosti na +-3 jednotky z hodnoty ADC. Potom program vypočita integral Eulerovou metodou a spravi anti-windup aby hodnota integrala ne prekročila hranice 10000 a -10000. Ďalej v programe vytvorime 2 premennych typu int16_t plot_input a plot_ integral ktore sa rovnaju hodnotam input a integral. Ďalej posielame hodnoty premennych cez seriovu linku v binarnom tvare.&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddelic 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { &lt;br /&gt;
// Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
// Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia casovaca = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný cas = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpocet urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			   UART_init();&lt;br /&gt;
			   ADC_init();&lt;br /&gt;
			   Timer1_init();&lt;br /&gt;
			   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Nacítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void);&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;
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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19653</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19653"/>
		<updated>2026-06-23T18:07:41Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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 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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddeli? 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { // Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); // Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia ?asova?a = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný ?as = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpo?et urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			    UART_init();&lt;br /&gt;
				 ADC_init();&lt;br /&gt;
				  Timer1_init();&lt;br /&gt;
				   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Na?ítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
void UART_init();&lt;br /&gt;
void UART_transmit_byte(uint8_t data);&lt;br /&gt;
void UART_send_int16(int16_t value);&lt;br /&gt;
void ADC_init();&lt;br /&gt;
uint16_t ADC_read();&lt;br /&gt;
void Timer1_init();&lt;br /&gt;
ISR(TIMER1_COMPA_vect);&lt;br /&gt;
int main(void)&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;
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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19652</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19652"/>
		<updated>2026-06-23T17:51:47Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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 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;
#define F_CPU 16000000UL&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;stdlib.h&amp;gt; &lt;br /&gt;
	 // Globálne premenné&lt;br /&gt;
	   volatile uint8_t timer_flag = 0;// Príznak z prerušenia &lt;br /&gt;
	  &lt;br /&gt;
	   // --- Inicializácia UART pre 14400 baud (pri 16 MHz) --- &lt;br /&gt;
	   &lt;br /&gt;
    void UART_init() {&lt;br /&gt;
    uint16_t ubrr = 68; &lt;br /&gt;
    UBRR0H = (uint8_t)(ubrr &amp;gt;&amp;gt; 8);&lt;br /&gt;
    UBRR0L = (uint8_t)ubrr;&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // Dvojnásobná rýchlost off &lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0); // Povolenie vysielaca&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01) | (1 &amp;lt;&amp;lt; UCSZ00);&lt;br /&gt;
		   } // 8 dátových bitov, 1 stop bit . Odošle jeden znak &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
		   &lt;br /&gt;
    void UART_transmit_byte(uint8_t data) {&lt;br /&gt;
    while (!(UCSR0A &amp;amp; (1 &amp;lt;&amp;lt; UDRE0))); // caká na vyprázdnenie buffra &lt;br /&gt;
    UDR0 = data;&lt;br /&gt;
		    } &lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
    void UART_send_int16(int16_t value){&lt;br /&gt;
    UART_transmit_byte((uint8_t)(value &amp;amp; 0xFF));&lt;br /&gt;
    UART_transmit_byte((uint8_t)((value&amp;gt;&amp;gt;8) &amp;amp; 0xFF));&lt;br /&gt;
			  }&lt;br /&gt;
			  &lt;br /&gt;
			  &lt;br /&gt;
			   // --- Inicializácia ADC --- &lt;br /&gt;
			  void ADC_init() { // Referencia AVCC (REFS0=1), výber kanála ADC0 (MUX = 0000) &lt;br /&gt;
			  ADMUX = (1 &amp;lt;&amp;lt; REFS0)|(1&amp;lt;&amp;lt;MUX2); // Povolenie ADC (ADEN=1), preddeli? 128 (ADPS2..0 = 111) pre frekvenciu 125 kHz&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;
			   // Nacítanie hodnoty z ADC0 &lt;br /&gt;
			   uint16_t ADC_read() {&lt;br /&gt;
                ADCSRA |= (1 &amp;lt;&amp;lt; ADSC); // Spustenie prevodu &lt;br /&gt;
			   while (ADCSRA &amp;amp; (1 &amp;lt;&amp;lt; ADSC)); // cakanie na dokoncenie &lt;br /&gt;
			   return ADC; &lt;br /&gt;
			   } &lt;br /&gt;
			   // --- Inicializácia Timer1 pre 5ms prerušenie --- &lt;br /&gt;
			   void Timer1_init() { // Režim CTC (Clear Timer on Compare Match), &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); // Nastavenie preddelica na 64 &lt;br /&gt;
// Frekvencia ?asova?a = 16 MHz / 64 = 250 kHz &lt;br /&gt;
// Požadovaný ?as = 5 ms (0.005 s) &lt;br /&gt;
// Hodnota do OCR1A = (0.005 * 250000) - 1 = 1249 &lt;br /&gt;
			   &lt;br /&gt;
               OCR1A = 1249; &lt;br /&gt;
// Povolenie prerušenia pri zhode (Compare Match A) &lt;br /&gt;
			   TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
// Spustenie casovaca s preddelicom 64 (CS11=1, CS10=1) &lt;br /&gt;
			   TCCR1B |= (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10); } &lt;br /&gt;
			   &lt;br /&gt;
			   // Rutina obsluhy prerušenia od Timer1 (vykoná sa každých 5 ms) &lt;br /&gt;
			   ISR(TIMER1_COMPA_vect) {&lt;br /&gt;
                 timer_flag = 1; // Len nastavíme vlajku, výpo?et urobíme v main slu?ke &lt;br /&gt;
			   } &lt;br /&gt;
			   int main(void) {&lt;br /&gt;
			    UART_init();&lt;br /&gt;
				 ADC_init();&lt;br /&gt;
				  Timer1_init();&lt;br /&gt;
				   sei(); // Globálne povolenie prerušení &lt;br /&gt;
				   &lt;br /&gt;
				   // Parametre integrátora &lt;br /&gt;
				   const float Ts = 0.005; // 5 ms &lt;br /&gt;
				   const float Ti = 1.0; &lt;br /&gt;
				   float integral = 0.0; &lt;br /&gt;
				   float input =0;&lt;br /&gt;
				  &lt;br /&gt;
				    while (1) {&lt;br /&gt;
					 if (timer_flag) {&lt;br /&gt;
					  timer_flag = 0; // Zhodenie vlajky &lt;br /&gt;
					 					  &lt;br /&gt;
					  // 1. Na?ítanie vstupu a posunutie nuly &lt;br /&gt;
					  uint16_t raw_adc = ADC_read();&lt;br /&gt;
					   input = (float)(raw_adc - 512); &lt;br /&gt;
// Softvérové pásmo necitlivosti (Deadband) &lt;br /&gt;
// Ignoruje jemný šum (napr. +- 3 hodnoty z ADC okolo stredu), aby integrátor nedriftoval &lt;br /&gt;
					   if (input &amp;gt; -3.0 &amp;amp;&amp;amp; input &amp;lt; 3.0) {&lt;br /&gt;
					    input = 0.0; &lt;br /&gt;
						} &lt;br /&gt;
						// 2. Výpocet (Eulerova dopredná metóda) &lt;br /&gt;
						integral = integral + (Ts / Ti) * input; &lt;br /&gt;
						// Anti-windup &lt;br /&gt;
						if (integral &amp;gt; 10000.0) integral = 10000.0;&lt;br /&gt;
						 if (integral &amp;lt; -10000.0) integral = -10000.0; &lt;br /&gt;
						 &lt;br /&gt;
						 &lt;br /&gt;
						 int16_t plot_input=(int16_t)input;&lt;br /&gt;
						 int16_t plot_integral=(int16_t)integral;&lt;br /&gt;
						  &lt;br /&gt;
// 4. Odoslanie vo formáte pre Serial Plotter: &amp;quot;Hodnota1,Hodnota2\n&amp;quot; &lt;br /&gt;
						  &lt;br /&gt;
						  &lt;br /&gt;
							UART_send_int16(plot_input);&lt;br /&gt;
							UART_send_int16(plot_integral);&lt;br /&gt;
							UART_transmit_byte(&#039;\r&#039;);&lt;br /&gt;
							UART_transmit_byte(&#039;\n&#039;);&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;
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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19651</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19651"/>
		<updated>2026-06-23T16:39:34Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:schemazapojenia.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 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=S%C3%BAbor:Schemazapojenia.png&amp;diff=19650</id>
		<title>Súbor:Schemazapojenia.png</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Schemazapojenia.png&amp;diff=19650"/>
		<updated>2026-06-23T16:38:47Z</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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19649</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19649"/>
		<updated>2026-06-23T16:31:43Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.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:08d34a4c-397f-4d53-b44a-7e9815cb343b.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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19648</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19648"/>
		<updated>2026-06-23T16:30:53Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&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:08d34a4c-397f-4d53-b44a-7e9815cb343b.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=S%C3%BAbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.jpg&amp;diff=19647</id>
		<title>Súbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.jpg</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:08d34a4c-397f-4d53-b44a-7e9815cb343b.jpg&amp;diff=19647"/>
		<updated>2026-06-23T16:30:02Z</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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19646</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19646"/>
		<updated>2026-06-23T15:39:43Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
* Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
* Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sleep.h ma funkcia na vypnutie BOD (Brown-out Detector) - sleep_bod_disable(). Najlepšie vyvolať pred povolnim prerušenia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka. &lt;br /&gt;
&lt;br /&gt;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19645</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19645"/>
		<updated>2026-06-23T15:31: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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sleep.h ma funkcia na vypnutie BOD (Brown-out Detector) - sleep_bod_disable(). Najlepšie vyvolať pred povolnim prerušenia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka. &lt;br /&gt;
&lt;br /&gt;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19644</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19644"/>
		<updated>2026-06-23T15:30:54Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sleep.h ma funkcia na vypnutie BOD (Brown-out Detector) - sleep_bod_disable(). Najlepšie vyvolať pred povolnim prerušenia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka.&lt;br /&gt;
&lt;br /&gt;
&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:Usporne_rezimy_Gordii_Chornyi.7z&amp;diff=19643</id>
		<title>Súbor:Usporne rezimy Gordii Chornyi.7z</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Usporne_rezimy_Gordii_Chornyi.7z&amp;diff=19643"/>
		<updated>2026-06-23T15:23:33Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: StudentMIPS nahral novú verziu Súbor:Usporne rezimy Gordii Chornyi.7z&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19642</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19642"/>
		<updated>2026-06-23T15:23:22Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade vyvijivej dosky Acrob a petenciometroveho modula. Potenciometrový model sa saklada z potenciometra, prepinača režimu fungovania(linearný alebo parabolický), reset tlačidko a kontrolera. Zapojili sme modul potenciometra ku doske Acrob na port X4. A pripojili Acrob ku počitaču pomocou USB kabla. Na moldule potenciometra nastavujeme velkosť potenciometra, sčitavame hodnotu z ADC, vypočitame integral a posielame dve hodnoty na SerialPlot. Prva hodnota je velkosťou vstupu a druha je integrolom.&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;
== Č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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19641</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19641"/>
		<updated>2026-06-23T15:20:09Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sleep.h ma funkcia na vypnutie BOD (Brown-out Detector) - sleep_bod_disable(). Najlepšie vyvolať pred povolnim prerušenia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka.&lt;br /&gt;
&lt;br /&gt;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19640</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19640"/>
		<updated>2026-06-23T15:16:10Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka.&lt;br /&gt;
&lt;br /&gt;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19639</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19639"/>
		<updated>2026-06-23T15:14:46Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka.&lt;br /&gt;
&lt;br /&gt;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19638</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19638"/>
		<updated>2026-06-23T15:14:39Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&gt;
== Čo by som urobil inak ==&lt;br /&gt;
&lt;br /&gt;
Chýba praktická ukážka.&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19637</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19637"/>
		<updated>2026-06-23T15:11:07Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|300px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19636</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19636"/>
		<updated>2026-06-23T15:10:47Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:Schema_zpojenia_usporne_rezimy.png|600px|thumb|center|Jednoduché zapojenie na zobudenie externou zmenou stavu pinu s použitim tlačidla.]]&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&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=S%C3%BAbor:Schema_zpojenia_usporne_rezimy.png&amp;diff=19635</id>
		<title>Súbor:Schema zpojenia usporne rezimy.png</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Schema_zpojenia_usporne_rezimy.png&amp;diff=19635"/>
		<updated>2026-06-23T15:07:53Z</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=Vstupn%C3%A1_jednotka_s_palcov%C3%BDm_prep%C3%ADna%C4%8Dom_TS211&amp;diff=19634</id>
		<title>Vstupná jednotka s palcovým prepínačom TS211</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Vstupn%C3%A1_jednotka_s_palcov%C3%BDm_prep%C3%ADna%C4%8Dom_TS211&amp;diff=19634"/>
		<updated>2026-06-23T15:04:35Z</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;Sofiia Nevzorova&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Navrhnite a realizujte vstupnú jednotku na báze dvojsekčného palcového prepínača TS211 s BCD kódovaním pripojenú k vývojovej doske ACROB. Programovo zabezpečte čítanie hodnôt z oboch sekcií prepínača (desiatky a jednotky) v negatívnej logike s využitím interných pull-up rezistorov mikrokontroléra ATmega328P. Implementujte algoritmus na prevod BCD kódov z portov PORTC a PORTD na výsledné dekadické číslo v rozsahu 00 až 99. Zabezpečte výpis aktuálnej hodnoty cez rozhranie UART do konzoly pri každej zmene nastavenia(na overenie).&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;
&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;
Základným komponentom tohto riešenia je dvojsekčný palcový prepínač TS211. Každá sekcia prepínača funguje ako mechanický dekodér, ktorý prevádza nastavenú číslicu (0–9) na 4-bitový signál v kóde BCD (Binary Coded Decimal). Prepínač má pre každú sekciu 5 výstupov: jeden spoločný kontakt (Common) a štyri dátové kontakty s váhami 1, 2, 4 a 8.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:TS211_Nevzorova_realizacia.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Princíp činnosti a softvérové spracovanie:&lt;br /&gt;
Vstupy mikrokontroléra sú nakonfigurované v režime s aktivovanými internými pull-up rezistormi. To znamená, že piny pracujú v negatívnej logike:&lt;br /&gt;
Ak je kontakt v prepínači otvorený, pull-up rezistor drží na pine logickú 1.&lt;br /&gt;
Ak je kontakt zopnutý (číslica je zvolená), pin sa prepojí so zemou (GND) a procesor načíta logickú 0.&lt;br /&gt;
V programe sa preto načítané hodnoty z registrov PINC a PIND najskôr bitovo invertujú (~).&lt;br /&gt;
Pre desiatky (PORTC) sa priamo maskujú spodné 4 bity.&lt;br /&gt;
Pre jednotky (PORTD) sa využíva bitový posun doprava o 2 miesta (&amp;gt;&amp;gt; 2), aby sa bity z pozícií D2–D5 dostali na pozície 0–3 pre správny výpočet váhy BCD kódu.&lt;br /&gt;
&lt;br /&gt;
Výsledné číslo sa vypočíta podľa vzťahu: Hodnota = (Desiatky * 10) + Jednotky, a následne sa posiela cez rozhranie UART do konzoly PuTTY.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:schemaMips.png|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
Hardvérové zapojenie:&lt;br /&gt;
Prepojenie s mikrokontrolérom ATmega328P na doske ACROB bolo realizované nasledovne:&lt;br /&gt;
Ľavý blok (Desiatky): Výstupy s váhami 1, 2, 4, 8 sú pripojené na piny A0, A1, A2 a A3 (čo zodpovedá portu PORTC, bity 0–3).&lt;br /&gt;
Pravý blok (Jednotky): Výstupy sú pripojené na digitálne piny D2, D3, D4 a D5 (port PORTD, bity 2–5).&lt;br /&gt;
Spoločné kontakty (C): Obe sekcie majú spoločný kontakt pripojený na GND (zem).&lt;br /&gt;
Z hľadiska mechanickej konštrukcie bolo kvôli nedostatočnej dĺžke kontaktov prepínača pre montáž priamo do breadboardu zvolené pripojenie pomocou flexibilných vodičov, čím sa zabezpečil spoľahlivý elektrický kontakt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
V programe sme využili 8-bitovú premennú &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; na uloženie stavu jednotlivých sekcií prepínača. Hodnota z portov sa po inverzii maskuje pomocou &amp;lt;code&amp;gt;0x0F&amp;lt;/code&amp;gt;, čím získame čistý BCD kód (0–9).&lt;br /&gt;
&lt;br /&gt;
V úvode funkcie &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; prebieha inicializácia smerových registrov &lt;br /&gt;
&amp;lt;code&amp;gt;DDR&amp;lt;/code&amp;gt; a nastavenie vstupov:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DDRC &amp;amp;= ~0x0F; PORTC |= 0x0F;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DDRD &amp;amp;= ~0x3C; PORTD |= 0x3C;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Týmto krokom aktivujeme vnútorné pull-up rezistory ešte pred vstupom do hlavného cyklu &amp;lt;code&amp;gt;while(1)&amp;lt;/code&amp;gt;, čo zabezpečuje stabilné čítanie hodnôt z prepínača hneď po štarte mikrokontroléra.&lt;br /&gt;
&lt;br /&gt;
Výsledná hodnota sa vypočíta podľa vzťahu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total = (tens * 10) + units;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pre výpočet desiatkovej hodnoty z portu D sme použili bitový posun o 2 miesta doprava, pretože fyzické pripojenie prepínača na piny D2 až D5 posúva dáta v registri &amp;lt;code&amp;gt;PIND&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Vzťah pre prepočet je:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tens = (~PIND &amp;gt;&amp;gt; 2) &amp;amp; 0x0F;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Táto úprava je nevyhnutná, aby sa logické úrovne zarovnali do intervalu 0 až 9, ktorý zodpovedá číslam na prepínači. Všetky výpočty sú vykonávané v celočíselnej aritmetike, čo je pre daný rozsah 0–99 úplne postačujúce.&lt;br /&gt;
&lt;br /&gt;
Na riadenie výpisu do konzoly bola použitá pomocná premenná &amp;lt;code&amp;gt;last_val&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (total != last_val) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; printf(&amp;quot;Value: %02u\n&amp;quot;, total);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; last_val = total;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Táto podmienka zabezpečuje, že mikrokontrolér odosiela dáta cez UART len v momente, keď dôjde k fyzickej zmene nastavenia na prepínači. Týmto sa minimalizuje zaťaženie sériovej linky a terminál PuTTY zostáva prehľadný.&lt;br /&gt;
Pri implementácii boli využité štandardné typy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; pre dáta z portov a &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; pre výslednú hodnotu, čo je z hľadiska pamäťových nárokov na procesor ATmega328P optimálne.&lt;br /&gt;
&lt;br /&gt;
V hlavnom cykle programu je zaradené krátke oneskorenie &amp;lt;code&amp;gt;_delay_ms(150);&amp;lt;/code&amp;gt;. Táto pauza slúži na stabilizáciu hodnôt pri mechanickom prepínaní kontaktov a zabraňuje náhodným chybám v načítaných dátach počas pohybu prepínača.&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;
#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;
&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
uint8_t read_bcd_tens(void) {&lt;br /&gt;
    uint8_t status = ~PINC;&lt;br /&gt;
    return (status &amp;amp; 0x0F); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t read_bcd_units(void) {&lt;br /&gt;
    uint8_t status = ~PIND;&lt;br /&gt;
    return ((status &amp;gt;&amp;gt; 2) &amp;amp; 0x0F); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    uart_init();&lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
    &lt;br /&gt;
    DDRC &amp;amp;= ~0x0F; PORTC |= 0x0F;      &lt;br /&gt;
    DDRD &amp;amp;= ~0x3C; PORTD |= 0x3C;      &lt;br /&gt;
&lt;br /&gt;
    uint8_t last_val = 255; &lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t tens = read_bcd_tens();   &lt;br /&gt;
        uint8_t units = read_bcd_units(); &lt;br /&gt;
        &lt;br /&gt;
        uint16_t total = (tens * 10) + units;&lt;br /&gt;
        &lt;br /&gt;
        if (total != last_val) {&lt;br /&gt;
            printf(&amp;quot;Value: %02u\n&amp;quot;, total);&lt;br /&gt;
            last_val = total;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        _delay_ms(150); &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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projekt_Nevzorova.zip|projekt_Nevzorova]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Správna funkcia projektu bola overená sledovaním sériového výstupu v termináli PuTTY. Pri každej mechanickej zmene polohy palcového prepínača sa v konzole okamžite zobrazila zodpovedajúca dvojciferná hodnota. Testovaním všetkých polôh oboch sekcií (0–9) sa potvrdilo, že program správne interpretuje BCD kód a bezchybne vypočítava výsledné dekadické číslo v rozsahu 00 až 99.&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;e5XRd5vfh3U&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;
V budúcej verzii by som namiesto neustáleho dopytovania sa na stav portov v cykle (polling) skúsila implementovať čítanie pomocou externých prerušení (interrupts), čo by zvýšilo efektivitu programu. Taktiež by som pridala ďalšiu sekciu prepínača pre zadávanie trojciferných čísel a navrhla kompaktný plošný spoj, aby som nahradila veľké množstvo prepojovacích káblov stabilnejším riešením.&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19633</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19633"/>
		<updated>2026-06-23T14:45:50Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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;
Našou ulohou bolo vytvoriť integrator na zaklade  Acrob a petenciometroveho modula.&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;
== Č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=Vstupn%C3%A1_jednotka_s_palcov%C3%BDm_prep%C3%ADna%C4%8Dom_TS211&amp;diff=19632</id>
		<title>Vstupná jednotka s palcovým prepínačom TS211</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Vstupn%C3%A1_jednotka_s_palcov%C3%BDm_prep%C3%ADna%C4%8Dom_TS211&amp;diff=19632"/>
		<updated>2026-06-23T14:44:11Z</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;Sofiia Nevzorova&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Navrhnite a realizujte vstupnú jednotku na báze dvojsekčného palcového prepínača TS211 s BCD kódovaním pripojenú k vývojovej doske ACROB. Programovo zabezpečte čítanie hodnôt z oboch sekcií prepínača (desiatky a jednotky) v negatívnej logike s využitím interných pull-up rezistorov mikrokontroléra ATmega328P. Implementujte algoritmus na prevod BCD kódov z portov PORTC a PORTD na výsledné dekadické číslo v rozsahu 00 až 99. Zabezpečte výpis aktuálnej hodnoty cez rozhranie UART do konzoly pri každej zmene nastavenia(na overenie).&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;
&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;
Základným komponentom tohto riešenia je dvojsekčný palcový prepínač TS211. Každá sekcia prepínača funguje ako mechanický dekodér, ktorý prevádza nastavenú číslicu (0–9) na 4-bitový signál v kóde BCD (Binary Coded Decimal). Prepínač má pre každú sekciu 5 výstupov: jeden spoločný kontakt (Common) a štyri dátové kontakty s váhami 1, 2, 4 a 8.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:TS211_Nevzorova_realizacia.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]&lt;br /&gt;
&lt;br /&gt;
Princíp činnosti a softvérové spracovanie:&lt;br /&gt;
Vstupy mikrokontroléra sú nakonfigurované v režime s aktivovanými internými pull-up rezistormi. To znamená, že piny pracujú v negatívnej logike:&lt;br /&gt;
Ak je kontakt v prepínači otvorený, pull-up rezistor drží na pine logickú 1.&lt;br /&gt;
Ak je kontakt zopnutý (číslica je zvolená), pin sa prepojí so zemou (GND) a procesor načíta logickú 0.&lt;br /&gt;
V programe sa preto načítané hodnoty z registrov PINC a PIND najskôr bitovo invertujú (~).&lt;br /&gt;
Pre desiatky (PORTC) sa priamo maskujú spodné 4 bity.&lt;br /&gt;
Pre jednotky (PORTD) sa využíva bitový posun doprava o 2 miesta (&amp;gt;&amp;gt; 2), aby sa bity z pozícií D2–D5 dostali na pozície 0–3 pre správny výpočet váhy BCD kódu.&lt;br /&gt;
&lt;br /&gt;
Výsledné číslo sa vypočíta podľa vzťahu: Hodnota = (Desiatky * 10) + Jednotky, a následne sa posiela cez rozhranie UART do konzoly PuTTY.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:schemaMips.png|400px|thumb|center|Schéma zapojenia.]]&lt;br /&gt;
&lt;br /&gt;
Hardvérové zapojenie:&lt;br /&gt;
Prepojenie s mikrokontrolérom ATmega328P na doske ACROB bolo realizované nasledovne:&lt;br /&gt;
Ľavý blok (Desiatky): Výstupy s váhami 1, 2, 4, 8 sú pripojené na piny A0, A1, A2 a A3 (čo zodpovedá portu PORTC, bity 0–3).&lt;br /&gt;
Pravý blok (Jednotky): Výstupy sú pripojené na digitálne piny D2, D3, D4 a D5 (port PORTD, bity 2–5).&lt;br /&gt;
Spoločné kontakty (C): Obe sekcie majú spoločný kontakt pripojený na GND (zem).&lt;br /&gt;
Z hľadiska mechanickej konštrukcie bolo kvôli nedostatočnej dĺžke kontaktov prepínača pre montáž priamo do breadboardu zvolené pripojenie pomocou flexibilných vodičov, čím sa zabezpečil spoľahlivý elektrický kontakt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algoritmus a program ===&lt;br /&gt;
&lt;br /&gt;
V programe sme využili 8-bitovú premennú &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; na uloženie stavu jednotlivých sekcií prepínača. Hodnota z portov sa po inverzii maskuje pomocou &amp;lt;code&amp;gt;0x0F&amp;lt;/code&amp;gt;, čím získame čistý BCD kód (0–9).&lt;br /&gt;
&lt;br /&gt;
V úvode funkcie &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; prebieha inicializácia smerových registrov &lt;br /&gt;
&amp;lt;code&amp;gt;DDR&amp;lt;/code&amp;gt; a nastavenie vstupov:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DDRC &amp;amp;= ~0x0F; PORTC |= 0x0F;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DDRD &amp;amp;= ~0x3C; PORTD |= 0x3C;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Týmto krokom aktivujeme vnútorné pull-up rezistory ešte pred vstupom do hlavného cyklu &amp;lt;code&amp;gt;while(1)&amp;lt;/code&amp;gt;, čo zabezpečuje stabilné čítanie hodnôt z prepínača hneď po štarte mikrokontroléra.&lt;br /&gt;
&lt;br /&gt;
Výsledná hodnota sa vypočíta podľa vzťahu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;total = (tens * 10) + units;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pre výpočet desiatkovej hodnoty z portu D sme použili bitový posun o 2 miesta doprava, pretože fyzické pripojenie prepínača na piny D2 až D5 posúva dáta v registri &amp;lt;code&amp;gt;PIND&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Vzťah pre prepočet je:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tens = (~PIND &amp;gt;&amp;gt; 2) &amp;amp; 0x0F;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Táto úprava je nevyhnutná, aby sa logické úrovne zarovnali do intervalu 0 až 9, ktorý zodpovedá číslam na prepínači. Všetky výpočty sú vykonávané v celočíselnej aritmetike, čo je pre daný rozsah 0–99 úplne postačujúce.&lt;br /&gt;
&lt;br /&gt;
Na riadenie výpisu do konzoly bola použitá pomocná premenná &amp;lt;code&amp;gt;last_val&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (total != last_val) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; printf(&amp;quot;Value: %02u\n&amp;quot;, total);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; last_val = total;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Táto podmienka zabezpečuje, že mikrokontrolér odosiela dáta cez UART len v momente, keď dôjde k fyzickej zmene nastavenia na prepínači. Týmto sa minimalizuje zaťaženie sériovej linky a terminál PuTTY zostáva prehľadný.&lt;br /&gt;
Pri implementácii boli využité štandardné typy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt;pre dáta z portov a &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; pre výslednú hodnotu, čo je z hľadiska pamäťových nárokov na procesor ATmega328P optimálne.&lt;br /&gt;
&lt;br /&gt;
V hlavnom cykle programu je zaradené krátke oneskorenie &amp;lt;code&amp;gt;_delay_ms(150);&amp;lt;/code&amp;gt;. Táto pauza slúži na stabilizáciu hodnôt pri mechanickom prepínaní kontaktov a zabraňuje náhodným chybám v načítaných dátach počas pohybu prepínača.&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;
#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;
&lt;br /&gt;
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);&lt;br /&gt;
&lt;br /&gt;
uint8_t read_bcd_tens(void) {&lt;br /&gt;
    uint8_t status = ~PINC;&lt;br /&gt;
    return (status &amp;amp; 0x0F); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t read_bcd_units(void) {&lt;br /&gt;
    uint8_t status = ~PIND;&lt;br /&gt;
    return ((status &amp;gt;&amp;gt; 2) &amp;amp; 0x0F); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    uart_init();&lt;br /&gt;
    stdout = &amp;amp;mystdout; &lt;br /&gt;
    &lt;br /&gt;
    DDRC &amp;amp;= ~0x0F; PORTC |= 0x0F;      &lt;br /&gt;
    DDRD &amp;amp;= ~0x3C; PORTD |= 0x3C;      &lt;br /&gt;
&lt;br /&gt;
    uint8_t last_val = 255; &lt;br /&gt;
&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
        uint8_t tens = read_bcd_tens();   &lt;br /&gt;
        uint8_t units = read_bcd_units(); &lt;br /&gt;
        &lt;br /&gt;
        uint16_t total = (tens * 10) + units;&lt;br /&gt;
        &lt;br /&gt;
        if (total != last_val) {&lt;br /&gt;
            printf(&amp;quot;Value: %02u\n&amp;quot;, total);&lt;br /&gt;
            last_val = total;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        _delay_ms(150); &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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:projekt_Nevzorova.zip|projekt_Nevzorova]]&lt;br /&gt;
&lt;br /&gt;
=== Overenie ===&lt;br /&gt;
&lt;br /&gt;
Správna funkcia projektu bola overená sledovaním sériového výstupu v termináli PuTTY. Pri každej mechanickej zmene polohy palcového prepínača sa v konzole okamžite zobrazila zodpovedajúca dvojciferná hodnota. Testovaním všetkých polôh oboch sekcií (0–9) sa potvrdilo, že program správne interpretuje BCD kód a bezchybne vypočítava výsledné dekadické číslo v rozsahu 00 až 99.&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;e5XRd5vfh3U&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;
V budúcej verzii by som namiesto neustáleho dopytovania sa na stav portov v cykle (polling) skúsila implementovať čítanie pomocou externých prerušení (interrupts), čo by zvýšilo efektivitu programu. Taktiež by som pridala ďalšiu sekciu prepínača pre zadávanie trojciferných čísel a navrhla kompaktný plošný spoj, aby som nahradila veľké množstvo prepojovacích káblov stabilnejším riešením.&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=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19631</id>
		<title>Integrátor s mikroprocesorom</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Integr%C3%A1tor_s_mikroprocesorom&amp;diff=19631"/>
		<updated>2026-06-23T14:32:10Z</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;Dmytro Domchuk&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Integrátor. 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 serialplot. Takže, sčitame hodnotu ADC vstupu z potenciometra a budeme ju integrovať každych 5ms. Ďalej, vysledky budeme posielať cez seriovu linku do programu SerialPlot.&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;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19630</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19630"/>
		<updated>2026-06-23T14:29:01Z</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;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&lt;br /&gt;
&lt;br /&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19629</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19629"/>
		<updated>2026-06-23T14:28:07Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&lt;br /&gt;
Zdrojový kód: [[Médiá:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19628</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19628"/>
		<updated>2026-06-23T14:27:44Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&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á:Usporne_rezimy_Gordii_Chornyi.7z|Usporne_rezimy_Gordii_Chornyi.7z]]&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=S%C3%BAbor:Usporne_rezimy_Gordii_Chornyi.7z&amp;diff=19627</id>
		<title>Súbor:Usporne rezimy Gordii Chornyi.7z</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=S%C3%BAbor:Usporne_rezimy_Gordii_Chornyi.7z&amp;diff=19627"/>
		<updated>2026-06-23T14:27:03Z</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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19626</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19626"/>
		<updated>2026-06-23T14:24:34Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19625</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19625"/>
		<updated>2026-06-23T14:24:19Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&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;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;
&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=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19624</id>
		<title>Úsporné režimy procesora</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=%C3%9Asporn%C3%A9_re%C5%BEimy_procesora&amp;diff=19624"/>
		<updated>2026-06-23T14:23:45Z</updated>

		<summary type="html">&lt;p&gt;StudentMIPS: /* Zapojenie, algoritmus, program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Záverečný projekt predmetu MIPS / LS2026 - &#039;&#039;&#039;Gordii Chornyi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadanie ==&lt;br /&gt;
&lt;br /&gt;
Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.&lt;br /&gt;
&lt;br /&gt;
Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.&lt;br /&gt;
&lt;br /&gt;
[[Obrázok:ard.jpg|600px|thumb|center|Vývojová doska ACROB s ATmega328P.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Literatúra:&#039;&#039;&#039; &lt;br /&gt;
* [https://www.engineersgarage.com/reducing-arduino-power-consumption-sleep-modes How to optimize Arduino for low power design]&lt;br /&gt;
* [https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Sleep Modes and Power Management]&lt;br /&gt;
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentacia k ATmega328P ]&lt;br /&gt;
* [https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8-bit-avr/structure/sleep/ AVR® Low Power Sleep Modes]&lt;br /&gt;
* [https://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html &amp;lt;avr/sleep.h&amp;gt;: Power Management and Sleep Modes]&lt;br /&gt;
&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;
Arduino doska može byť použitá v strojoch, ktoré s spoliehaju na externý zdroj energie a hlavné na uchovanú energiu v akumulatori. Prístup ku externému zdroju môže byť nepravidelný a nie je tak efektívny, ako by sme chceli.&lt;br /&gt;
&lt;br /&gt;
V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.&lt;br /&gt;
&lt;br /&gt;
V tomto momente, pravdepodobne, nastane problem:   Chceme zobrať malu dosku s malou spotrebou energie, ale pre správnu prácu stroja musime zobrať väčšiu dosku, s väčšou spotrebou, s požadovaným výkonom a funkciami.&lt;br /&gt;
&lt;br /&gt;
Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nam sú dostupné 6 úsporných režimov:&#039;&#039;&#039;&lt;br /&gt;
:-  Idle&lt;br /&gt;
:-  ADC noise Reduction&lt;br /&gt;
:-  Power-down&lt;br /&gt;
:-  Power-save&lt;br /&gt;
:-  Standby&lt;br /&gt;
:-  Extended standby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Sleep_Modes_and_Wake_up_Sources.png|700px|thumb|center|Tabuľka Úsporných režimov a spôsob zobudenia.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Idle ====&lt;br /&gt;
Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.&lt;br /&gt;
&lt;br /&gt;
Môže byť zobudený: Pretečením časovača , USART prenosom , prerušením prostrednictvom Analógového komparatora, ADC prevodnika, Timer/Counters, Watchdog , zmenou na pinoch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ADC noise Reduction ====&lt;br /&gt;
Veľmi podobný ako &#039;&#039;&#039;Idle&#039;&#039;&#039; s rozdielom v tom, že vypína aj &#039;&#039;SPI&#039;&#039; a &#039;&#039;USART&#039;&#039;. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-down ====&lt;br /&gt;
Vypína skoro všetko. Zobudenie je možne iba cez &#039;&#039;(TWI) 2-wire serial interface&#039;&#039;, &#039;&#039;Watchdog&#039;&#039;, &#039;&#039;prerušenie na pinoch INT0&#039;&#039; a &#039;&#039;INT1 z vonka&#039;&#039;, &#039;&#039;prerušenie z ostatných pinov&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Má možnosť vypnúť BOD - Brown-out Detector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Power-save ====&lt;br /&gt;
Od &#039;&#039;&#039;Power-down&#039;&#039;&#039; sa líši možnosťou zapnúť &#039;&#039;Timer/Counter2&#039;&#039; v synchronnom alebo asynchronnom režime. Ak &#039;&#039;Timer/Counter2&#039;&#039; nepotrebujem, tak lepšie zapnúť &#039;&#039;&#039;Power-down&#039;&#039;&#039; režim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-DOWN&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Extended standby ====&lt;br /&gt;
Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku &#039;&#039;&#039;Power-SAVE&#039;&#039;&#039; s jednou vynimkou - oscilator pokračuje pracovať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== Zapojenie, algoritmus, program ===&lt;br /&gt;
&lt;br /&gt;
Ku doske je pripojene jedno tlačitko s rezistorm na pine PD4 ( INT0 ). Bude využité na externe prerušenie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Knižnica avr/interrupt.h je opcionálna. Potrebujem iba na krásne blikanie LEDky.&lt;br /&gt;
&lt;br /&gt;
V &#039;&#039;&#039;main&#039;&#039;&#039; nastavime zabudovanú LED ako výstup a Tlačitko na PD4 ako vstup s pull-up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Následne mame vybrať úsporný režim, ktorý chceme využiť.&lt;br /&gt;
&lt;br /&gt;
Môžeme to spraviť dvoma spôsbmi:&lt;br /&gt;
&lt;br /&gt;
# Ručne nastavime register &#039;&#039;&#039;SMCR&#039;&#039;&#039;&lt;br /&gt;
:: Ma 4 piny - &#039;&#039;SM2&#039;&#039;, &#039;&#039;SM1&#039;&#039; a &#039;&#039;SM0&#039;&#039; určuje úsporný režim. SE, ktorý povoluje spustenie uspania. Bit SE je najlepšie aktivovať tesne pred spustenim uspania, aby nenastalo skôr než potrebujeme.&lt;br /&gt;
&lt;br /&gt;
# Využijeme funkciu set_sleep_mode() z knižnice sleep.h &#039;&#039;[ Nastavuje SMCR za nas ]&#039;&#039;&lt;br /&gt;
:: Do zatvoriek doplnime SLEEP_MODE_&#039;&#039;&#039;&#039;&#039;&amp;quot;nazov_režimu&amp;quot;&#039;&#039;&#039;&#039;&#039;. Povolenie uspania dávame neskôr, inými funkciami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
V loope najprv vypneme prerušenie. Zapneme vtedy, kedy potrebujeme.&lt;br /&gt;
&lt;br /&gt;
Zablika LEDka - signál, že procesor nespi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na uspanie použieme funkcie z sleep.h&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_mode()&#039;&#039;&#039;&lt;br /&gt;
:: Tesné pred sleep_mode() treba povoliť prerušenie [ funkcia sei() ].&lt;br /&gt;
:: Funkcia nastavuje SE bit na log. 1 a tymto povoluje uspanie. Spušťa uspanie. Po zobudeni nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;sleep_enable() , sleep_cpu() , sleep_disable&#039;&#039;&#039;&lt;br /&gt;
:: Funkciu na povovlenie prerušenia sei() volame medzi sleep_enable() a sleep_cpu().&lt;br /&gt;
:: &#039;&#039;sleep_enable()&#039;&#039; - nastavuje SE bit na log. 1.&lt;br /&gt;
:: &#039;&#039;sleep_cpu()&#039;&#039; - uspava procesor.&lt;br /&gt;
:: &#039;&#039;sleep_disable()&#039;&#039; - nastavuje SE bit na log. 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stlačenie zapojeneho tlačitka zmeni stav na pine PD4, čo bude signalom na zobudenie.&lt;br /&gt;
&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;Usporne_rezimy_Gordii_Chornyi.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;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.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;
&lt;br /&gt;
// Delay funkcia pre požadované medzery&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;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LED PB5		// Zabudovaná LED dioda&lt;br /&gt;
#define SW1 PD4		// Tlacitko ako zdroj externého prerušenia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	DDRB |= ( 1 &amp;lt;&amp;lt; LED );	&lt;br /&gt;
	DDRD &amp;amp;= ~( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	PORTD |= ( 1 &amp;lt;&amp;lt; SW1 );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	SMCR - Sleep Mode Control Regiter&lt;br /&gt;
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE&lt;br /&gt;
	//		SM2..0	zodpovedaju za výber úsporného režimu.&lt;br /&gt;
	//		SE (Sleep Enable)	umoznuje uspanie pri vyvolaní SLEEP inštrukcie.&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	SMCR |= ( 0 &amp;lt;&amp;lt; SM2 ) | ( 1 &amp;lt;&amp;lt; SM1 ) | ( 0 &amp;lt;&amp;lt; SM0 );		// 0 1 0  =  Power-down.&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SM1 );									// To iste ako o riadok vyššie.  Power-down&lt;br /&gt;
	SMCR |= ( 1 &amp;lt;&amp;lt; SE );							// Umožnime uspanie. Radšej aktivovat tesne pred vyvolaním SLEEP inštrukcie, aby omylom neuspat skôr než treba&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//	set_sleep_mode umož?uje vybra? úsporný režim&lt;br /&gt;
	&lt;br /&gt;
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby&lt;br /&gt;
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    while(1)&lt;br /&gt;
    {&lt;br /&gt;
		cli();		// Zatial vypnime prerušenie. Potrebujeme ho aktívnym pred uspanim&lt;br /&gt;
		&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Zapni LED a cakaj 2 sekudny&lt;br /&gt;
			delay(2000);&lt;br /&gt;
		PORTB &amp;amp;= ~ ( 1 &amp;lt;&amp;lt; LED );	// Vypni LED a cakaj pol sekundy&lt;br /&gt;
			delay(500);&lt;br /&gt;
			&lt;br /&gt;
		PORTB |= ( 1 &amp;lt;&amp;lt; LED );		// Ešte ráz zapnut a vypnut LED na kratšiu dobu&lt;br /&gt;
			delay(500);&lt;br /&gt;
		PORTB &amp;amp;= ~( 1 &amp;lt;&amp;lt; LED );&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_mode();			// Aktivovat úspanie.&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		// ako alternativa môžeme postupovat podla jednotlivých krokoch	&lt;br /&gt;
		/*					&lt;br /&gt;
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit&lt;br /&gt;
		&lt;br /&gt;
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme&lt;br /&gt;
		&lt;br /&gt;
		sei();					// Umožnit prerušenie&lt;br /&gt;
		sleep_cpu();			// Uspi procesor&lt;br /&gt;
		sleep_disable();		// PO zobudení vycisti SE bit&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;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>