Потребовалось мне сделать девайсик который будет мерять и индицировать напряжение (до 20В) и ток до (5А). По части железа вопросов не возникло. Atmega8 с кварцем 16Мгц, входные цепи на АЦП и два семисегментника(по три знакоместа ,общий катод), один на ток второй на напругу. Проблема всплыла в процессе написания программы. Я недавно с АСМ стал пересаживаться на Си, потому не всё так гладко. Решил организовать динамическую индикацию и вот первый камень. Частоту обновления сегментов сделал окола 60Гц по средствам прерывания от ТС0, в обработчик прерываний засунул подпрограмму перевода переменной char cifra в строковую strcifra с глубиной массива 2. Так вот нихрена (извиняюсь) на индикаторах не видно. В переменную хочу закидывать результат АЦП(посчитанный).
interrupt [TIM0_OVF] void TC0(void)
{
num[seg];
itoa(cifra, strcifra);
PORTD=Dig[((char)strcifra[1])]; //Массив Dig[] перекодирывает цифры
для правельного отображения. ((char)strcifra[1]) - превёл к типу чар. Если просто PORTD=Dig[cifra]; где cifra переменная с значением от 0 до 9 то эта цифра выводится на все сегменты нормально.
seg++; //перебираем сегменты
if (seg=6) seg=0; //с последнего на первый
num[0] = (PORTB.0=0);
num[1] = (PORTB.1=0);
num[2] = (PORTB.2=0);
num[3] = (PORTB.3=0);
num[4] = (PORTB.4=0);
num[5] = (PORTB.5=0);
};
Что я делаю не так?
Исходник прикреплён.
P/s. Компилятор CodeVisionAVR
- Вложения
-
- ups_led.c
- исходник
- (2.71 КБ) 1393 скачивания



