DMC.38 · Индикация и сигнал · ATmega328P
Задача
Показывать состояние аппарата разными паттернами мигания светодиода.
Алгоритм
Перечисление состояний; для каждого — своя последовательность вкл/выкл с задержками.
Исходный код (C, avr-gcc)
⇩ Скачать 38-status-led-patterns.c
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
enum { ST_DISARM, ST_ARM, ST_ERROR };
static void blink(uint8_t n,uint16_t ms){
for(uint8_t i=0;i<n;i++){ PORTB|=(1<<PB5); _delay_ms(ms); PORTB&=~(1<<PB5); _delay_ms(ms); }
}
int main(void){
DDRB|=(1<<PB5);
volatile uint8_t state=ST_DISARM;
for(;;){
switch(state){
case ST_DISARM: blink(1,600); break; // редко
case ST_ARM: PORTB|=(1<<PB5); break; // ровно горит
case ST_ERROR: blink(5,80); break; // часто
}
_delay_ms(300);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Единый язык миганий помогает понимать состояние без телеметрии (медленно=дизарм, быстро=ошибка).