DMC.47 · Телеметрия и служебное · ATmega328P
Задача
Считать время с момента арминга и подать сигнал по достижении лимита.
Алгоритм
Секундный счётчик в главном цикле (или по таймеру); при arm=1 наращивается, при достижении лимита — тревога.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRD|=(1<<PD6); DDRB|=(1<<PB5);
volatile uint8_t armed=1; const uint16_t LIMIT=240; // 4 минуты
uint16_t sec=0;
for(;;){
if(armed){ sec++;
if(sec>=LIMIT){ PORTD^=(1<<PD6); PORTB^=(1<<PB5); } // тревога по лимиту
} else sec=0;
_delay_ms(1000);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Помогает не разрядить батарею: сигнал на, скажем, 4-й минуте. Здесь простой программный отсчёт.