void main(void) { // Input/Output Ports initialization // Port B initialization DDRB = (1<<PINB0)|(0<<PINB1)|(1<<PINB2)|(0<<PINB3)|(0<<PINB4); // PB0 - выход (светодиод), PB1 - вход (кнопка), PB2 - Enable IC, PB3 - резерв на ADC , PB4 - перемычки PORTB = (1<<PINB1)|(1<<PINB4); // подтягивающий резистор на кнопке и перемычке
GIMSK |=(1<<INT0); MCUCR=0b00110000; //режим power down GIFR |=(1<<INTF0);
#asm("sei") #asm("sleep")
while (1) { if(PINB.4==1){ //Проверка, подключена ли нагрузка. PORTB.2=0; Error(); GIMSK |=(1<<INT0); GIFR |=(1<<INTF0); #asm("sei") #asm("sleep") } if(PINB.1==0){ // если нажать кнопку, то сработает прерывание, и с каждым проходом инкрементируем переменную scan++; delay_ms(30); //задержка для одного прохода. Можно регулировать время } if(PINB.1==1){ delay_ms(10); //если кнопка отпущена, то разрешаем прерывание и идем спать scan=0; GIMSK |=(1<<INT0); GIFR |=(1<<INTF0); #asm("sei") #asm("sleep") } if(scan>=66 && PORTB.2==0){ // если PB2 выключен, включить scan=0; delay_ms(10); ON(); PORTB.2=1; } if(scan>=66 && PORTB.2==1){ // если PB2 включен, выключить scan=0; delay_ms(10); PORTB.2=0; OFF(); } } }
Работает правильно при включении и выключении, когда есть или нет нагрузки. Но если схема уже включена, то при отключении PB4 не определяется. Подскажите пожалуйста, как заставить постоянно проверять PB4 при включенном PB2? и при этом минимизировать потребление питания.
как заставить постоянно проверять PB4 при включенном PB2?
Используй прерывание по изменению состояния вывода порта (0x0002 PCINT0). Любое подключение-отключение вызовет прерывание, в т.ч. и во всех режимах сна - Idle, Power-down и ADC Noise Reduction.
Народ, нет ли у кого прошивки для тини13 с независимым управлением двумя нагрузками с одной кнопки? Например одна вкл./откл. без задержки, а вторая нагрузка вкл./откл. с задержкой около секунды. Из основных условий это минимальное енергопотребление в ждущем и рабочем режимах, а из пожеланий - это звуковая индикация включения. Нужна такая кнопка для управления сигнализатора поклёвки, короткое - вкл. основной схемы, а по долгому вкл./откл. радиомодуля для передачи сработки на пейджер. Корпус сигнализатора это шприц на 20 см3, а в качестве кнопки - резиновый поршень для сохранения герметичности, так что там две кнопки никак не влепить.
sparic, нашел у себя подобное, немного подправил, можно тестить. На бузер просто подается 1 на 0,5 с - цепляй что хочешь. Обращаю внимание, что тактовая частота контроллера выбрана 128 кГц (для экономии энергии). Программатор должен уметь снижать частоту SPI для повторного программирования. Понипрог с этим справляется без проблем.
msmmmm спасибо! Собрал схемку, работает. Потребление контроллера практически отсутствует - 0,17 мкА как в дежурном, так и в включенном состоянии (без подключения нагрузки), что понравилось. Так же есть два момента, которые хотелось бы доработать: Первый Не понравилось то, что нагрузка включается по отпусканию кнопки. Я так понял, что это такая защита от дребезга кнопки? При включении load1, что без задержки это не напрягает, а вот в случае с load2, то тут немного не удобно, т.к. не знаешь, уже прошла секунда или еще нет. И получается что в действительности, для гарантированного включения load2 приходится держать ее чуть дольше секунды. Тут тогда, как вариант с сохранением защиты от дребезга, может сделать вкл./откл. load1 после удержания кнопки 0,5 сек, а load2 после 2 сек.? Второй Звуковое сопровождение сократить до 0,2 сек., а то 0,5 сек. пищалки на 4 кГц немного "режет" по ушам. msmmmm, если вас не затруднит, возможно ли подправить прошивку? Либо ваш алгоритм работы связан именно с таким низким энергопотреблением МК?
sparic, программа работает, как и задумывал: так как каналы детерминируются по длительности нажатия кнопки, то измеряется длительность нажатия, затем переключается соответствующий канал. Защита от дребезга 200мс при нажатии и 100мс при отпускании кнопки. Должно быть достаточно.
Цитатаsparic ()
load1 после удержания кнопки 0,5 сек, а load2 после 2 сек.
Это как? Если не отпустить кнопку, первая нагрузка будет переключаться в любом случае. А если отпустить, получится так, как уже есть. Согласен, что есть небольшое неудобство, связанное с необходимостью угадывать время, потому предлагаю такое решение: первая нагрузка работает, как и раньше - нажал, отпустил, сработало, запищало. А вот вторая так - нажал, удерживаешь 1с, сработало, запищало, можно отпускать. Попробовал в Протеусе, действительно удобнее.
Цитатаsparic ()
а то 0,5 сек. пищалки на 4 кГц немного "режет" по ушам
Если не отпустить кнопку, первая нагрузка будет переключаться в любом случае. А если отпустить, получится так, как уже есть.
Согласен, это я думал-думал... и какую то глупость придумал Проверил в железе, всё работает Это то что нужно, кнопка замечательно отрабатывает msmmmm, ОГРОМНАЯ вам благодарность за помощь! Теперь можно двигаться далее со сборкой сигнализатора