DMC.09 · Питание · ATmega328P
Задача
После включения измерить напряжение батареи и сообщить готовность (ОК) или запрет (низко).
Алгоритм
Однократное измерение при старте: если выше порога — длинный сигнал ОК, иначе серия коротких тревог.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
static uint16_t adc_read(uint8_t ch){
ADMUX=(1<<REFS0)|(ch&0x0F);
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC));
return ADC;
}
static void tone(uint16_t ms){ uint16_t c=ms*10/2; while(c--){PORTD^=(1<<PD6);_delay_us(185);} }
int main(void){
DDRD|=(1<<PD6); DDRB|=(1<<PB5);
const uint16_t TH=620;
if(adc_read(0)>=TH){ PORTB|=(1<<PB5); tone(400); } // ОК
else { for(uint8_t i=0;i<5;i++){ tone(80); _delay_ms(80);} } // отказ
for(;;){}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Простейший self-test как элемент безопасности перед армингом. Тон на бузере, индикация светодиодом.