Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.07.2008, 20:28
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Динамическая индикация,вопрос
Задача такая – мк делает 8 битное ADC и результат нужно вывести на 3 разрядный 7 сегментный индикатор. Проблема в том что я не пойму как преобразовать переменную ADC измерения для вывода на индикатор. Может приведете пример в Си.
Хочу написать функцию Display () чтобы было типа
Data=read_adc(0);
Display (Data);
Как работает динамическая индикация мне объяснять не надо. Я все понимаю, проблема только в том ,как преобразовать переменную. Как привязать код цифры к переменной?
Все проекты делал для LCD , а тут необходима динамическая индикация, короче идем от сложного к простому.
|
|
|
|
12.07.2008, 20:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Создаеш массив и смотря какое число,то и по номеру из массива вытаскиваеш и отправляеш на индикаторы.
Код:
|
const int numeral[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x3 9,0x41,0x42,0x43,0x44,0x45,0x46};
// 0 1 2 3 4 5 6 7 8 9 A b c d e fs |
|
|
|
|
12.07.2008, 20:57
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Пользуй itoa и табличное преобразование в код семисегментного индикатора.
__________________
Осторожно , злой кот
|
|
|
|
12.07.2008, 23:35
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Все зависит от того, какой средой пользуешься для написания на С. Почти во всех компилляторах есть готовые примеры. И у каждого свои предпочтения. Для PIC и 7 сегментников мне лично нравится MicroC от наших братьев славян. Там в Tool даже встроенный декодер см.картинку, пишется все быстро, жаль не компиллит COFF для отладки, но как доп. инструмент оченно удобно.
-- Прилагается рисунок: --
|
|
|
|
13.07.2008, 19:46
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Второй день борюсь с динамической индикацией. Я не пойму как разложить число на части что бы отправить по очереди в порт для динамической индикации. Допустим у меня число 173, значить мне его нужно разложить и получить отдельно число 1 затем 7 и 3 для того что бы потом из таблицы взять код символа соответствующий данному числу и отправить его в порт для вывода на индикаторе. Мне кто то ответить как делается эта процедура??? У меня уже есть таблица символов я вывожу их последовательно на индикатор значения. Короче программа ждет раздробленного числа а остальное она уже делает. КАК РАЗЛОЖИТЬ ЧИСЛО, что бы потом передать программе динамической индикации по очереди значение каждого сегмента???
|
|
|
|
13.07.2008, 20:24
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Я делал так.
Цитата:
|
void indikat()
{
unsigned int TEMP = REZULT;//REZULT - глобальная переменная
unsigned char DIG_OUT = 0;
while (TEMP ›= 100) // Подсчет сотен
{
TEMP -= 100;
DIG_OUT++;
}
A3 = DIG_OUT;
DIG_OUT = 0;
while (TEMP ›= 10) // Подсчет десяиков
{
TEMP -= 10;
DIG_OUT++;
}
A2 = DIG_OUT;
DIG_OUT = 0;
while (TEMP ›= 1) // Подсчет единиц
{
TEMP--;
DIG_OUT++;
}
A1 = DIG_OUT;
}
|
Возможно есть более изящные решения.
При вызове функции она раскладывает значение переменной REZULT на 3 цыфры А1, А2, А3 (глобальные переменные). Думаю можно обойтись и без глобальных переменных, передавать их значения функции через локальные переменные, но я не стал морочиться. Типа работает и ладно.
|
|
|
|
13.07.2008, 20:59
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от Zemlyanov
|
Второй день борюсь с динамической индикацией. Я не пойму как разложить число на части что бы отправить по очереди в порт для динамической индикации.
|
Очень жаль что ты не прочитал мой пост , там все что тебе надо ...
Это отсюда http://www.remexpert.com/forum/topic1285.html
Цитата:
|
Добавлю от себя.
Очень часто надо сделать преобразование int-char.
Это я подсмотрел у AVRа которого чаще всего можно найти на сахаре и телесистемах.
Это свернутая версия atoi С стандарта ANSI но в отличие от оригинала работает быстрее.
Вызываш itoa2(5999) результат будет в asc[5]
Код:
Код:
|
unsigned char asc[5];
void itoa2(unsigned int binval)
{
int step[]={10000,1000,100,10,1};
unsigned int temp,val;
unsigned char i,atemp;
val=binval;
for (i=0; i‹5; i++)
{
temp=step[i];
atemp='0';
while(val ›= temp)
{
atemp++;
val-=temp;
}
asc[i]=atemp;
}
} |
|
А дальше табличное конвертирование из стат массива .
Код:
|
d7seg[10] = {0x21, 0x77, 0x19, 0x15, 0x47, 0x85, 0x81, 0x37, 0x01, 0x05}; |
__________________
Осторожно , злой кот
|
|
|
|
13.07.2008, 23:58
|
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Спасибо dosikus! Использовал функцию itoa (компилятор CodeVision) , для преобразования числа в строку, работает класно , то что нужно, разбирает числовую переменную на запчасти без проблем.
Спасибо delay! Тоже интересное решение , я и не додумался таким образом переформатировать число.
Интересно а какой способ является самым оптимальным (в смысле скорости обработки числа и минимальной загрузки МК). Я думаю что есть ещё какие-то решения данной задачи. Будет интересно посмотреть
|
|
|
|
14.07.2008, 00:31
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Дык приглядись внимательно- процедуры моя(DL36) и delay
практически одинаковые .Только моя компактней и 5 разрядная( и нарастить не проблема....
И они урезанные itoa (integer to ansi)
главное смысл понять...
И еще про дин.индикацию - я использую буфер (глобальный массив размером в количество разрядов индикатора) .В буфер заношу данные уже в 7сегментном коде из основной проги , а считываю и вывожу на сегменты циклически в прерывании - 1 прерывание 1 разряд , 2 -2 и т.д.
__________________
Осторожно , злой кот
|
|
|
|
03.08.2008, 11:59
|
|
Частый гость
Регистрация: 29.10.2007
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Динамическая индикация,вопрос
Еще один вариант разбиения десятичного числа на позиции и вывода на сегменты предоставляю на Ваше суждение.
Все довольно просто: в начале сохраняем результат, затем вычисляем старшую цифру и выводим на экран, далее, среднюю и
младшую.
Между выводами на дисплей цифр, зажигаем и гасим соответствующие общие аноды(катоды). функция Display выставляет на ножках
порта нолики и единички, тем самым засвечивая необходимые сегменты.
Не знаю как с точки зрения быстродействия, но, по моему наглядно и компактно.
//************************************************** ************************************************** *****************
temp = read_adc; //сохраняем результат преобразования ADC в переменной temp
Display(temp/100); //вычисление и передача в функцию старшей значащей цифры: сотни = temp/1000
Display((temp%100)/10); //вычисление и передача в функцию средней значащей цифры: десятки = (temp%1000)/100
Display((temp%100)%10); //вычисление и передача в функцию очередной значащей цифры: единицы = ((temp%1000)%100)/10
//************************************************** ************************************************** *****************
void Display(unsigned char cifra) // засвечивает сегменты индикатора, соответствущие цифре
{
switch(cifra)
{
case 0: PORTD = 0x3F; break; //
case 1: PORTD = 0x06; break; //
case 2: PORTD = 0x5B; break; //
case 3: PORTD = 0x4F; break; //
case 4: PORTD = 0x66; break; //
case 5: PORTD = 0x6D; break; //
case 6: PORTD = 0x7D; break; //
case 7: PORTD = 0x07; break; //
case 8: PORTD = 0x7F; break; //
case 9: PORTD = 0x6F; break; //
}
}
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:38.
|
|