Нужна Ваша помощь с простой задачкой - МК, на одном пине (PB3) которого - кнопка, на другом (PB4) - светодиод.
Замыкаем кнопку -светодиод загорается на 4 секунды. Потом гаснет, независимо от состояния кнопки. А главное - пока кнопка не нажата - МК должен пребывать в глубоком сне и не жрать почти ни капли тока.
Собственно код:
Код: Выделить всё
#include <avr/io.h> // инициализация портов ввода-вывода МК
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <avr/delay.h> // описание программных задержек
// Обработчик прерываний
ISR (WDT_vect)
{
WDTCR |=_BV(WDE); // разрешаем прерывания по ватчдогу, иначе будет резет!
}
// Основная программа
int main()
{
// Инициализация порта кнопки (PB3)
DDRB &=~_BV(PB3); // ставит в DDRB в бит PB3 - "0" (инициирует его работу как "вход")
PORTB |= _BV(PB3); // ставит в PORTB в бит PB3 - "1" (при замыкании пина на землю она становится нулем, при размыкании - еденицей)
// Условие включения светодиода по нажатию кнопки
if((PINB & (1 << PB3)) == 0)
{
// Иницализация порта светодиода (PB4)
DDRB |= _BV(PB4); // Указатель пина
PORTB |= _BV(PB4); // Выставить на PB4 - "1"
_delay_ms (4000); // Задержка
PORTB &= ~_BV(PB4); // Выставить на PB4 - "0"
// Инициализация цикла контроля ложного включения светодиода
while ((PINB & (1 << PB3)) == 0)
{ // пока кнопка нажата (после завершения цикла включения светодиода)...
PORTB &= ~_BV(PB4); // ...светодиод не горит (до отключения, и последующего включения кнопки)
}
};
// Инициализация ватчдога
wdt_reset(); // сброс
wdt_enable(WDTO_120MS); // разрешение ватчдога раз в 120мс
WDTCR |= _BV(WDE); // разрешение прерываний по ватчдогу (иначе будет резет)!
sei(); // разрешение прерывания
// Инициализация режима сна
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
while(1)
{
sleep_enable(); // разрешение режима сна
sleep_cpu(); // активация режима сна
}
}Я понимаю что код - не ахти (с МК вожусь считанные месяцы, через раз, по выходным), но в протеусе - работает как надо. А вот в реале - светодиод моргает непрерывно, пока нажата кнопка. Помогите пожалуста разобраться - где косяк?




