четверг, 28 марта 2013 г.

Использование режима пониженного энергопотребления в C++

Во то время, пока вычислительные мощности микроконтроллера не задействованы, т.е. не выполняется никаких действий, он впустую тратит энергию. При питании от аккумулятора или батареи это прежде всего отрицательно сказывается на времени автономной работы. В данном примере предлагаю использовать режим микропотребления (Power-down). Ток, потребляемый в этом режиме, по заявлению производителя составляет 0.1 мкА при использовании тактовой частоты 1 МГц.



Прежде чем приступать к программированию , рекомендую ознакомиться со следующей информацией:

Приведенная ниже программа при запуске микроконтроллера будет погружать его в режим микропотребления (Power-down), а при поступлении внешнего прерывания (нажатие кнопки), запускать определенный алгоритм. Этим алгоритмом будет мигание двух светодиодов в течении 10 секунд. После выполнения алгоритма, микроконтроллер снова будет погружен в "сон".
Рисунок 1 - Схема подключения

Пример программы программы:

#include <avr/io.h> //подключение стандартной библиотеки ввода/вывода
#define F_CPU 8000000UL //определение тактовой частоты микроконтроллера для корректной работы функций задержки
#include <util/delay.h> //подключение библиотеки для генерации задержек
#include <avr/interrupt.h> //подключаем библиотеку для работы с прерываниями
ISR(INT0_vect) //подпрограмма обработки прерывания
{
PORTB=0b00000001; //включаем первый светодиод
for (int i=0;i<10;i++) //цикл мигания светодиодами
{
_delay_ms(500); //задержка 500 мс
PORTB ^= 0b00000011; //переключам состояния светодиодов на противоположное
}
PORTB=0b00000000; //отключение светодиодов
}

int main(void)
{
//SETUP
//прерывания
EICRA=0b00000011; //внешнее прерывание по возрастающему сигналу на входе INT0 (4 ножка)
EIMSK=0b00000001; //разрешение внешнего прерывания INT0
//ввод/вывод
DDRB=0xFF; //порт B работает как выход
//выбор спящего режима
SMCR=0b00000101; //Power-down и разрешение сна
sei(); //разрешение прерываний
 while(1)
 {
asm("sleep"); //перевод микроконтроллера в спящий режим
}
}