DMC.40 · Индикация и сигнал · ATmega328P
Задача
Проиграть последовательность тонов при включении как индикацию готовности.
Алгоритм
Массив полупериодов (нот) и длительностей; воспроизведение меандром на выводе бузера.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
static void note(uint16_t half_us,uint16_t ms){
uint32_t c=(uint32_t)ms*1000/(half_us*2);
while(c--){ PORTD^=(1<<PD6); for(uint16_t i=0;i<half_us;i++) _delay_us(1); }
}
int main(void){
DDRD|=(1<<PD6);
uint16_t hp[]={190,150,120}; uint16_t du[]={150,150,250};
for(uint8_t i=0;i<3;i++){ note(hp[i],du[i]); _delay_ms(40); }
for(;;){}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Разные мелодии можно повесить на события (арм, дизарм, ошибка) для звуковой обратной связи.