Operácie

Úsporné režimy procesora: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 81: Riadok 81:


<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="Usporne_rezimy_Gordii_Chornyi.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/sleep.h>
Riadok 87: Riadok 88:
#include <util/delay.h>
#include <util/delay.h>


// Delay funkcia pre pozadovany cas
// Delay funkcia pre požadované medzery
void delay(int delay)
void delay(int delay)
{
{
Riadok 162: Riadok 163:


</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>

Verzia z 09:48, 23. jún 2026

Záverečný projekt predmetu MIPS / LS2026 - Gordii Chornyi


Zadanie

Cieľom tohto projektu je oboznámenie s zabudovanymí úspornymí režimami procesora.

Hardware v tomto projekte je doska ACROB s mikrokontroler ATmega328P.

Vývojová doska ACROB s ATmega328P.

Literatúra:


Analýza a opis riešenia

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.

V takejto situácii chceme, aby komponenty stroja využívalí čo najmenej energie a zaroveň zachovávali požadovanú efektivnosť a potrebné schopnosti.

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.

Ako jeden zo spôsobov vyriešiť problem veľkej spotreby energie je použiť jeden z úsporných režimov.


Nam sú dostupné 6 úsporných režimov:

- Idle
- ADC noise Reduction
- Power-down
- Power-save
- Standby
- Extended standby


Tabuľka Úsporných režimov a spôsob zobudenia.


Idle

Vypína iba procesor, a necháva dosť veľa možnosti zobudenia z vonku aj z vnutra.

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.


ADC noise Reduction

Veľmi podobný ako Idle s rozdielom v tom, že vypína aj SPI a USART. Toto umožňuje zväčšiť kvalitu merania ADC prevodnika.


Power-down

Vypína skoro všetko. Zobudenie je možne iba cez (TWI) 2-wire serial interface, Watchdog, prerušenie na pinoch INT0 a INT1 z vonka, prerušenie z ostatných pinov.


Power-save

Od Power-down sa líši možnosťou zapnuť Timer/Counter2 v synchronnom alebo asynchronnom režime. Ak Timer/Counter2 nepotrebujem, tak lepšie zapnuť Power-down režim.


Standby

Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku Power-DOWN s jednou vynimkou - oscilator pokračuje pracovať.


Extended standby

Mal by sa používať s vonkajším krýštalom alebo rezonatorom v role časovača. Je identický ku Power-SAVE s jednou vynimkou - oscilator pokračuje pracovať.




Algoritmus, program, zapojenie

Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...


#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// Delay funkcia pre požadované medzery
void delay(int delay)
{
  for (int i=1; i<=delay; i++)
  _delay_ms(1);
}


#define LED PB5		// Zabudovaná LED dioda
#define SW1 PD4		// Tlačitko ako zdroj externého prerušenia


int main(void)
{
	DDRB |= ( 1 << LED );	
	DDRD &= ~( 1 << SW1 );
	PORTD |= ( 1 << SW1 );
	
	
	
	//	SMCR - Sleep Mode Control Regiter
	//		Ma 4 bity:	SM2 , SM1 , SM0 , SE
	//		SM2..0	zodpovedaju za výber úsporného režimu.
	//		SE (Sleep Enable)	umožňuje uspanie pri vyvolaní SLEEP inštrukcie.
	
	/*
	SMCR |= ( 0 << SM2 ) | ( 1 << SM1 ) | ( 0 << SM0 );		// 0 1 0  =  Power-down.
	SMCR |= ( 1 << SM1 );									// To iste ako o riadok vyššie.  Power-down
	SMCR |= ( 1 << SE );							// Umožnime uspanie. Radšej aktivovať tesne pred vyvolaním SLEEP inštrukcie, aby omyl neuspať skôr než treba
	*/
	
	
	
	//	set_sleep_mode umožňuje vybrať úsporný režim
	
	set_sleep_mode(SLEEP_MODE_IDLE);			// IDLE
	//set_sleep_mode(SLEEP_MODE_ADC);			// ADC noise Reduction
	//set_sleep_mode(SLEEP_MODE_PWR_DOWN);		// Power-down
	//set_sleep_mode(SLEEP_MODE_PWR_SAVE);		// Power-save
	//set_sleep_mode(SLEEP_MODE_STANDBY);		// Standby
	//set_sleep_mode(SLEEP_MODE_EXT_STANDBY);	// Extended standbys
	
	
	
    while(1)
    {
		PORTB |= ( 1 << LED );		// Zapni LED a ćakaj 2 sekudny
			delay(2000);
		PORTB &= ~ ( 1 << LED );	// Vypni LED a čakaj pol sekundy
			delay(500);
			
		PORTB |= ( 1 << LED );		// Ešte ráz zapnuť a vypnuť LED na kratšiu dobu
			delay(500);
		PORTB &= ~( 1 << LED );
		
		
		sei();					// Umožniť prerušenie
	//	sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme
		sleep_mode();			// Aktivovať úspanie.
		
		
		// ako alternativa môžeme postupovať podľa jednotlivých krokoch	
		/*					
		sleep_enable();			// Nastavi sa SE (Sleep Enable) bit
		
		sleep_bod_disable();	// Deaktivujeme Brown-out Detector ak ho nepotrebujeme
		
		sei();					// Umožniť prerušenie
		sleep_cpu();			// Uspi procesor
		sleep_disable();		// PO zobudení vyčisti SE bit
		*/
    }
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip

Overenie

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. Na konci uvádzame fotku hotového zariadenia.

Aplikácia.

Video:

Čo by som urobil inak

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.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.