Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поделитесь примером динамической индикации на Си
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Pyku_He_oTTyda
Собственно вопрос в названии темы. Алгоритм понятен, но хочется посмотреть, как делают профи.
SasaVitebsk
Цитата(Pyku_He_oTTyda @ Sep 20 2006, 20:27) *
Собственно вопрос в названии темы. Алгоритм понятен, но хочется посмотреть, как делают профи.


Так несколько зависит от схемы. smile.gif Намекни хоть чего динамическая индикация?

А вааще всё примитивно до безобразия. Единственно что надо учитывать, это время рассасывания заряда если плечо длинное. А то засветка получается.
IgorKossak
Цитата(Pyku_He_oTTyda @ Sep 20 2006, 20:27) *
Собственно вопрос в названии темы. Алгоритм понятен, но хочется посмотреть, как делают профи.

По динамической индикации говорилось уже много.
Вы сделали поиск по форуму (во второй строке наверху страницы есть слово Поиск) слова "динамическая"?
ALexx
Цитата(Pyku_He_oTTyda @ Sep 20 2006, 20:27) *
Собственно вопрос в названии темы. Алгоритм понятен, но хочется посмотреть, как делают профи.


На роль МегаПрофи не претендую, но делал это так (см. прилагаемые файлы)
Устройство - 14-циферный светодиодный дисплей. Цифры - с общими анодами.
В приложении - схема и программа для устройства.
Сделано на AT89C2051, но код может быть перенесен на АВР.
Отображение - в таймерном прерывании Timer0_int, которое возникает с частотой приблизительно 14 х 50Гц = 700Гц (дабы не видеть мигания)

P.S. 2Гуру: Сильно не пинать - писал это года 4 назад - взял как есть. В настоящее время работают сотни данных устройств во всех концах государства великого :-))

Не ту схему прикрепил. Теперь правильная!
Pyku_He_oTTyda
Спасибо, буду смотреть!

К сожалению по поиску смотрел, по запросу "Динамическая индикация" выкидывает одну "воду": http://electronix.ru/forum/index.php?act=S...%EA%E0%F6%E8%FF
Pyku_He_oTTyda
А устройсто простое (тестер):
некий привод для запорного механизма на трубе (для крана), у которого на борту 8 или 10 битный АЦП.
Коробочка связана по двум линяям по 485, по одной линии в привод идут СИ, по другой возвращаются данные.
Задача вывести на трехэлементный семисегментник значение кода, получаемого от устройства.
Shurmas
у АВР есть АпНоут с динамической индикацией.
Pyku_He_oTTyda
Shurmas
ну -ну, только он на *.asm
Семён
примерно так создаю индикацию. Сразу извеняюсь если, чтото забыл но общий принцип следующий:

// знакогенератор для анодов(какие сигменты зажигать)
unsigned char __flash indicator[]={0X7E,0X30,0X6D,0X79,0X33,0X5b,0X5F,0X70,0X7F,0X7B,0X4E};
// выбор номера разряда (
unsigned char __flash catodIn[]={0XF7,0XFB,0XFD,0XFE,0XEF,0XDF};
//буфер индикатора
unsigned char buferInd[6];
unsigned char __flash *p_ind;

// функция записи в индикатор
void IndicatorSave(unsigned char par1,unsigned char par2,unsigned char par3,unsigned char par4,unsigned char par5,unsigned char par6);

// так записываю в индикатор
void IndicatorSave(unsigned char par1,unsigned char par2,unsigned char par3,unsigned char par4,unsigned char par5,unsigned char par6)
{
buferInd[0]=par6;
buferInd[1]=par5;
buferInd[2]=par4;
buferInd[3]=par3;
buferInd[4]=par2;
buferInd[5]=par1; //первый символ
}

//далее обслуживаю индикатор примерно так
INDI_PORT=0; //гасим сигменты чтобы не было мерцания

// далее идет код обслуживания клавиатуры
.
.
.
//выбераю новую позициюпозицию знакоместа
ind.catod++;
if(ind.catod==5)
{
ind.catod=0;
}

//включаю новое знакоместо
CATOD_PORT=catodIn[ind.catod];


// включаю сегменты согласно знакоместу
INDI_PORT=*(p_ind+buferInd[ind.catod]);

Примерно так
Alexander Storm
Цитата(Pyku_He_oTTyda @ Sep 21 2006, 13:00) *
А устройсто простое (тестер):
некий привод для запорного механизма на трубе (для крана), у которого на борту 8 или 10 битный АЦП.
Коробочка связана по двум линяям по 485, по одной линии в привод идут СИ, по другой возвращаются данные.
Задача вывести на трехэлементный семисегментник значение кода, получаемого от устройства.

Создаешь кодовую таблицу от своих сегментов. Типа как:
Код
const uchar KodePage[] = {0x7E, 0x06, 0xDA, 0x9E, 0xA6, 0xBC, 0xFC, 0x0E,
                     0xFE, 0xBE, 0xEE, 0xF4, 0x78, 0xD6, 0xF8, 0xE8,
                     0x10, 0xE6, 0x80, 0x16, 0x70, 0xC4, 0xD4, 0xEA,
                     0xC0, 0xAA, 0xF0, 0x76, 0x54, 0xB6, 0x6E, 0x00};

Создаешь переменную для буфера, типа: uchar LcdBuff[]={0,0,0};
Можешь вместо 0 инициальные значения написать (на загрузку покажет smile.gif)
А затем по таймеру выкидываешь по одному разряду. Только частоту прерывания таймера подбери чтоб не мигала.

Вот кусок от драйвера ЖКИ, у тебя почти тоже самое будет:

Код
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TimeX++;          //Для анализа времени вывода по SPI

switch(TimeX&0xF)
{
///---------------Группа операций вывода на LCD
case 0:{ //Out LCD Data - main Out
              wPB.o_LCD = 0;//800us
            PORTB = *(uchar *) &wPB;
              break;};// end case 2
case 4:{//Out LCD Data - main Out
         SPDR = LcdBuff[--LCD_PTR];
         if (!LCD_PTR) {LCD_PTR = 24;};  
         break;};// end case 2
case 14:{//Out LCD - Formirovanie signala LOAD
           wPB.o_LCD = (LCD_PTR&0x07)?0:1;
          PORTB = *(uchar *) &wPB;          
           break;};//end case 34
};//end switch
PORTB ^=0x02;
TCNT0 = 0xD7; //reload counter value
}
Pyku_He_oTTyda
Всем спасибо большое! Буду разбиратся)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.