Здравствуйте! Как реализовать индикацию процесса заряда АКБ когда он подключен к сети? Когда на ножку мк PB4 подается напряжение, зеленый светодиод должен мигать, когда АКБ зарядится, светодиод должен гореть. Я предполагаю что нужно задействовать таймер, но как это реализовать? Скидываю код самой индикации
#define F_CPU 4000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define PORT_LED PORTB //назначение порта светодиодов
#define DDR_LED DDRB //назначение регистра направления порта светодиодов
#define LED_GREEN PB0 //красный светодиод - индикатор 1/4 максимального напряжения
#define LED_BLUE PB1 //синий светодиод - индикатор 2/4 максимального напряжения
#define LED_RED PB2 //зеленый светодиод - индикатор 3/4 максимального напряжения
#define ON_LED(LED) (PORT_LED &= ~(1<<LED)) //макрос включения светодиода
#define OFF_LED(LED) (PORT_LED |= (1<<LED)) //макрос выключения светодиода
#define ADC_VREF_TYPE (1<<REFS2) | (1<<REFS1) | (0<<REFS0) // в качестве ИОН - внутренний источник
#define ADC_inputPB3 (0<<MUX3) | (0<<MUX2 ) | (1<<MUX1) | (1<<MUX0) // вход АЦП - PB3
#define StartConvAdc ADCSRA |= (1<<ADSC)
//---Инициализация портов светодиодов---------
void led_port_ini (void)
{
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0); // порты светодиодов на выход
PORT_LED = (1<<LED_RED) | (1<<LED_BLUE) | (1<<LED_GREEN); // Светодиоды изначально погашены
}
//-------------------------------------------
//----Инициализация АЦП---------------------
void ADC_init (void)
{
ADMUX |= ADC_inputPB3 | ADC_VREF_TYPE; // вход АЦП на PB3, в качестве ОН- внутреннее опорное напряжение 2.56
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) // разрешаем преобразование, запускаем его, разрешаем прерывание от АЦП
| (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // тактовую частоту делим на 8 - получаем частоту преобразования 125 кГц
}
//-------------------------------------------
ISR (ADC_vect)
{
unsigned int voltage_ADC;
voltage_ADC = ADCW;
if (!(PINB&(1 << PB4)) == 1)
{
if (voltage_ADC >=900)
{
ON_LED(LED_GREEN);
OFF_LED(LED_BLUE);
OFF_LED(LED_RED);
}
else
if (voltage_ADC >= 770)
{
OFF_LED(LED_GREEN);
ON_LED(LED_BLUE);
OFF_LED(LED_RED);
}
else
{
OFF_LED(LED_GREEN);
OFF_LED(LED_BLUE);
ON_LED(LED_RED);
}
}
else
{
OFF_LED(LED_GREEN);
OFF_LED(LED_BLUE);
OFF_LED(LED_RED);
}
ADCSRA |= (1<<ADSC);
}
int main (void)
{
ADC_init ();
led_port_ini();
sei();
for(;;);//бесконечный цикл в ожидании прерывания по завершению преобразования АЦП
}