Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Так что «глупый» внешний вочдог имхо надёжнее
Происходила полная остановка всего, включая внутренний wdt.
По INT0 думал, но решил, что может всякий «мусор» ловить и сбрасываться
Переполнение счетчика можно настроить на 30 секунд
А почему такие тонкие дорожки на плате?
#define F_CPU 1200000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint16_t pb1_count;
// Оброботчик прерывания по таймеру TIMER0
ISR(TIM0_OVF_vect){
pb1_count++;
}
int main() {
// Устанавливаем выход PB0 и вход PB1 PB2 PB3 PB4 с подтягиванием
DDRB = (1 << PB0)| (~(1 << PB1)) | (~(1 << PB2)) | (~(1 << PB4));
PORTB = ~(1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4);
// Определяам время срабатывание таймера по входам PB2,PB3,PB4 (перемычки подтягивают к земле) (период, сек = TM/4 )
byte i=0;
if( PINB & (1 << PINB2) ) i+=1;
if( PINB & (1 << PINB3) ) i+=2;
if( PINB & (1 << PINB4) ) i+=4;
uint16_t TM;
switch (i){
case 0: TM=4; break;
case 1: TM=8; break;
case 2: TM=20; break;
case 3: TM=40; break;
case 4: TM=80; break;
case 5: TM=120; break;
case 6: TM=240; break;
default: TM=480;
}
pb1_count = 0;
boolean pb1_state = false;
// Отключаем ADC
PRR = (1<<PRADC); // shut down ADC
// Настраиваем таймер
TIMSK0 = (1<<TOIE0); // Включаем таймер TIMER0
TCCR0B = (1<<CS02) | (1<<CS00); // Пределитель таймера на 1/1024
// Задаем режим сна
MCUCR &= ~(1<<SM1); // idle mode
MCUCR &= ~(1<<SM0); // idle mode
MCUCR |= (1<<SE);
sei();
while(1) {
// Зпсываем до прерывания по таймеру
asm("sleep");
// Таймер сработал
// Считываем состояние PB1
bool pb1 = false;
if( PINB & (1 << PINB1) )pb1 = true;
// Если состояние входа инвертировалось, сбрасываем время
if( pb1 != pb1_state )pb1_count = 0;
pb1_state = pb1;
// Если превышено время установки таймера
if( pb1_count >= TM ){
PORTB |= (1 << PB0); // digitalWrite(PB0, HIGH);}
pb1_count = 0;
//_delay_ms(1000); // Ждем секунду
while (pb1_count<4){};
PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);}
pb1_count = 0; // Сбрасываем счетчик
}
}
} byte i=0;
if( PINB & (1 << PINB2) ) i+=1;
if( PINB & (1 << PINB3) ) i+=2;
if( PINB & (1 << PINB4) ) i+=4;
const PROGMEM uint16_t AT[]={4,8,20,40,80,120,240,480};
uint16_t TM=AT[i];Этот код на 40 байт кода и на 8 байт озу больше.const uint16_t AT[] PROGMEM ={4,8,20,40,80,120,240,480};
TM=AT[i];Program Memory Usage: 320 bytes 31,3 % Fullstatic const uint16_t AT[] PROGMEM ={4,8,20,40,80,120,240,480};
TM=AT[i];byte i=0;
if( PINB & (1 << PINB2) ) i+=1;
if( PINB & (1 << PINB3) ) i+=2;
if( PINB & (1 << PINB4) ) i+=4; uint16_t TM;
switch ((PINB & 0x1C)){
case 0: TM=4; break;
case 1<<2: TM=8; break;
case 2<<2: TM=20; break;
case 3<<2: TM=40; break;
case 4<<2: TM=80; break;
case 5<<2: TM=120; break;
case 6<<2: TM=240; break;
default: TM=480;
}
static const uint16_t AT[] PROGMEM ={4,8,20,40,80,120,240,480};
TM=AT[((PINB & 0x1C)>>2)];switch ((PINB & 0x1C)>>2){
case 0: TM=4; break;
case 1: TM=8; break;
case 2: TM=20; break;
case 3: TM=40; break;
case 4: TM=80; break;
case 5: TM=120; break;
case 6: TM=240; break;
default: TM=480;
}Внешний сторожевой таймер это костыль для плохих разработчиков, которые не могут разработать нормально работающую программу для микроконтроллеров или стабильно работающую схему.
// Сброс таймера (не реже чем 1 на время срабатывания WDT, установленное перемычкой)
When designing a system where debugWIRE will be used, the following must be observed:
• Pull-Up resistor on the dW/(RESET) line must be in the range of 10k to 20 kΩ. However, the
pull-up resistor is optional.

Внешний сторожевой таймер это костыль для плохих разработчиков, которые не могут разработать нормально работающую программу для микроконтроллеров или стабильно работающую схему.Вот где-то тут я начал подозревать, что автор не понимает в вочдогах примерно ничего.
Тем более встроенный WDT имеется у большинства современных микроконтроллеров.И второе предложение усугубило это подозрение.
WDTs are not emergency outs, but integral parts of our systems. The WDT is as important as main() or the runtime library, it's an asset that is likely to be used, and maybe used a lot.
Окончательно закрепляет впечатление комментарий выше про подтяжки на входах и фильтрацию питания.
When designing a system where debugWIRE will be used, the following must be observed:
• Pull-Up resistor on the dW/(RESET) line must be in the range of 10k to 20 kΩ. However, the
pull-up resistor is optional.
Универсальный сторожевой таймер на ATtiny13