Схему переделал, подтянул кнопку к минусу внешним резистором, при нажатии замыкается на + питания. Еще, вопрос: нужно ли сбрасывать флаг прерывания? Хотя само прерывание отключаю в обработчике. Вот код:
if ((PINB & (1 << PB4)) && !flgLngPress) { _delay_ms(10); // задержка (защита от дребезга) if ((PINB & (1 << PB4))) { flgPress = true; // кнопка нажата (устанавливаем флаг в 1) butCount++; // начало отсчета нажатия кнопки if (butCount > 100){ flgLngPress = true; flgPress = false; // сбрасываем флаг нажатия butCount = 0; // обнуляем счетчик времени нажатия }// end if }// end if }// end if
if (flgLngPress && (PINB & (1 << PB4)) == 0){ // если отпустили после длительного нажатия switchLED = false; flgLngPress = false; flgPress = false; // сбрасываем флаг нажатия flgClick = false; }// end if
if (flgPress && (PINB & (1 << PB4)) == 0){ // отпустили кнопку flgClick = true; // устанавливаем флаг клика flgPress = false; // сбрасываем флаг нажатия butCount = 0; // обнуляем счетчик времени нажатия }// end if
if (flgLngPress && !switchLED){ // было удержание кнопки LedMode++; // переключаем на другой светодиод if (LedMode > 1) LedMode = 0; i = 1; Set_PWM(); // устанавливаем режим светодиода switchLED = true; }// end if
if (flgClick){ // был клик flgClick = false; // сбрасываем флаг клика i++; // инкрементируем режим PWM if (i > 3) i = 0; // обнуляем счетчик if (i == 0){ sleep_MODE = true; //DDRB &= ~((1 << PB3) | (1 << PB1) | (1 << PB0)); // порты на вход 0, 1, 3 //PORTB &= ~(1 << PB3); }// end if else{ sleep_MODE = false; //DDRB |= (1 << PB3) | (1 << PB1) | (1 << PB0); // порты на вход 0, 1, 3 //PORTB |= (1 << PB3); }// end else Set_PWM(); // устанавливаем режим светодиода }// end if
if (sleep_MODE){
GIMSK |= (1 << INT0); // Включаем прерывания по по кнопке PCMSK |= (1 << PCINT4); // PCINT4 для возращения в нормальный режим из сна DDRB &= ~((1 << PB3) | (1 << PB1) | (1 << PB0)); // выключаем светодиоды PORTB &= ~((1 << PB3) | (1 << PB1) | (1 << PB0)); // отключаем высокий уровень на портах _delay_ms(100); sleep_cpu(); asm("sleep");
Чтобы батарею на кушал внутренний резистор. При переходе в спящий режим, на сколько я понял, состояния портов остаются неизменными, если был высокий уровень, то он так и останется после перехода в спячку, был подтянут резистор, то он так и останется подтянутым. А так получается, что кратковременно замыкаем на + питания при нажатии. И выключенном состоянии к АКБ подключен только МК (делитель хочу подключать через полевик при включении).
34kilowatt, батарею будет кушать, если будет течь ток через этот резистор (ну не считая, конечно, мизера в доли микроампера), т.е. в момент замыкания кнопки, так что, немедленный разряд батареи, через подтягивающий резистор, Вам не грозил. В последнем варианте, программа заработала?
В принципе да, но в любом случае с железным резистором, думаю, надежнее будет. Также транзистор, который этот резистор подключает к + питания, все равно, но что-то ест. Хотя, если использовать железный, то тоже самое будет (короче шило на мыло). Схема все равно не заработала, как хотел. Железки сейчас нет, но в протеусе сейчас повторяет работу в железе. Добавил паузы для отладки - получилось, что постоянно уходит в сон и сразу выходит из него, хотя состояние порта 4 изменяться не должно. И так по кругу. Нажатие, судя по всему просто не успевает обработать (там есть задержка в 10мс).
34kilowatt, а как у вас настроен MCUCR, по отношению к внешним прерываниям??? Надо бы даташит глянуть, в отношении ISCxx битов... А там у Вас 00, получаем прерывание, если на инте земля. Бардак, в общем
34kilowatt, определись какое прерывание использовать будешь - PCINT или INT0. А то зачем-то включил INT0 (РВ1), и определил PCINT4 (РВ4).
Цитата34kilowatt ()
с железным резистором, думаю, надежнее будет
И чем может оказаться ненадежным внутренний резистор 40кОм при 5В питания?
Цитата34kilowatt ()
подтянул кнопку к минусу
Что в лоб, что по лбу. Подтягивающий резистор подключается к затвору мосфета и в статике не потребляет ничего. Как по мне - кнопка на общий лучше, хотя и не принципиально. По поводу делителя для АЦП - на кой там внешний мосфет, если такой же уже встроен в порт? Флаги, которые могут вызвать пробуждение, должны быть сброшены перед глобальным включением прерываний.
Ну да он у меня при выключении отключается и через резистор и обратно включенный диод там теоретически может быть ноль. Установил бит ISC01, теперь из сна не выходит... На кнопку на 4м порту не реагирует (правда пока только в протеусе). P.S. Пока сообщение написал уже поста ответов появилось. По поводу INT0 и PCINT нашел каком-то примере, потому и так написал... В любом случае спасибо за помощь!
И еще, зачем писать конструкции типа: MCUCR |= (1 << SM1); // power-down mode MCUCR &= ~(1 << SM0); // power-down mode MCUCR |= (1 << SE); // режим сна включен Если все это легко заменяется на: