DMC.41 · Индикация и сигнал · ATmega328P
Задача
Передавать сигнал SOS (··· ——— ···) светодиодом и бузером циклически.
Алгоритм
Точка/тире = разная длительность включения; между символами и группами — паузы по правилам Морзе.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#define U 200
static void sig(uint16_t ms){ PORTB|=(1<<PB5);PORTD|=(1<<PD6); for(uint16_t i=0;i<ms;i++)_delay_ms(1); PORTB&=~(1<<PB5);PORTD&=~(1<<PD6); _delay_ms(U); }
int main(void){
DDRB|=(1<<PB5); DDRD|=(1<<PD6);
for(;;){
for(uint8_t i=0;i<3;i++) sig(U); // S: · · ·
for(uint8_t i=0;i<3;i++) sig(3*U); // O: — — —
for(uint8_t i=0;i<3;i++) sig(U); // S
_delay_ms(7*U);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Универсальный аварийный сигнал для поиска и привлечения внимания. Единица времени задаёт скорость.