Twilo, спасибо ))))
В общем, накорябал я программку ) И оно вроде бы даже работает.
Правда подгонять показания я пока не стал, всё равно в реальной схеме всё будет по-другому, как всегда.
Если у кого есть мысли как перевести показания АЦП в Амперы на индикаторе, кроме как делать для каждого значения case, с удовольствием выслушаю. Ибо зависимость исходного напряжения и показаний АЦП - далеко не линейная

Вот "чудо-схема" )))) Сразу предупреждаю, там сплошной ужас, только для проверки программы, ибо индикаторы почему-то в протеусе напрямую от МК работать не захотели, пришлось подключать через транзисторы )))
Исходничек.. Всё стандартно, в общем то.
Код: Выделить всё
#include <mega16.h>
#include <delay.h>
#define a 1 // Эти макросы содержат числа, соответствующие двойке,
#define b 2 // возведенной в степень, равной номеру "ножки" того
#define c 4 // порта, к которому подключен сегмент индикатора с
#define d 8 // одноименным макросу названием. Для того, чтобы вывести
#define e 16 // какую-либо цифру на индикатор, нужно отправить в порт
#define f 32 // число 255 минус сумму соответствующих сегментам макросов.
#define g 64 // Эти числа позволяют сделать программу независимой от подключения.
#define DP 128 // Измените эти числа, если индикатор выводит букву "зю"
unsigned char adc_data;
// Прерывание при переполнении таймера 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Сбросить таймер на 0
TCNT0=0x84;
// Запустить преобразование АЦП
ADCSRA.6 = 1;
}
//Прерывание АЦП
interrupt [ADC_INT] void adc_isr(void)
{
// Читаем 8 старших бит АЦП
adc_data=ADCH;
}
void Dig_init()
{
Dig[0] = (a+b+c+d+e+f); // Если индикатор с общим анодом,
Dig[1] = (b+c); // нужно сумму макросов отнять от
Dig[2] = (a+b+g+e+d); // 255. Если с общим катодом, то
Dig[3] = (a+b+g+c+d); // отнимать не нужно.
Dig[4] = (f+g+b+c); // Имена макросов соответствуют
Dig[5] = (a+f+g+c+d); // именам сегментов индикатора
Dig[6] = (a+f+g+c+d+e);
Dig[7] = (a+b+c);
Dig[8] = (a+b+c+d+e+f+g);
Dig[9] = (a+b+c+d+f+g);
}
void initialization(){
DDRA = 0x00;
DDRC = 0xFF;
DDRB = 0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x84;
OCR0=0x00;
//timer interrupt
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
//ADC init
ADMUX=0x20;
ADCSRA=0x89;
// Global enable interrupts
#asm("sei")
}
main(){
Dig_init();
initialization();
while (1)
{
if (adc_data == 95) {
PORTC = Dig[0] +128;
PORTB = Dig[0]; }
if (adc_data == 155) {
PORTC = Dig[1];
PORTB = Dig[0]; }
if (adc_data == 97) {
PORTC = Dig[0] +128;
PORTB = Dig[2]; }
if (adc_data == 98) {
PORTC = Dig[0] +128;
PORTB = Dig[4]; }
if (adc_data == 36) {
PORTC = Dig[1];
PORTB = Dig[0] + 128; }
.
.
.
.
.
итд. не самое красивое решение...