Библиотека 7 Seg LED для ATmega8 CVAVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
MSP
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Сб фев 14, 2009 01:45:25

Сообщение MSP »

В общем, не пинайте сильно в МК только начинаю разбираться понадобилась динамическая индикация на 7 сегментных индикаторах, пол дня убил на поиски вменяемой библиотеки, так и не нашел... Вот есть одна, в протеусе моделирую, не пашет...

Код: Выделить всё

#include <mega8>    // объявляем библиотека ввода/вывода
#include <delay>        // объявляем библиотеку для задержки

#define digit1 PORTD.6      //катод первой цифры
#define digit2 PORTD.5      //катод второй цифры
#define digit3 PORTD.4      //катод третей цифры
                   
flash char digits[] = {      //создаём массив с цифрами
0b00000011,                   //0
0b10011111,                   //1
0b00100101,                   //2
0b00001101,                   //3
0b10011001,                   //4
0b01001001,                   //5
0b01000001,                   //6
0b00011111,                   //7
0b00000001,                   //8
0b00001001,                   //9
0b11111101,                   //знак минуса
0b11111111                    //пустота
};                 
char digit_out[3], cur_dig;  //переменные для работы с LED

unsigned int indication;    //переменная для хранения чисел

void recoding(void) {       //функция для перекодировки из hex в dec

if (indication<1000) {       //начинаем преобразование если число < 1000 так как 3-х
//разрядный LED
digit_out[0]=indication%10;   //Делим на 10 остаток в масив 1-разряд
indication=indication/10;                //Оставляем 2 разряда
digit_out[1]=indication%10;   //Делим на 10 остаток в масив 2-разряд
digit_out[2]=indication/10;     //Делим на 10 целое число в масив 3-разряд
}                                           //*******
}                                          //*******

//таймер 0
interrupt [TIM0_OVF] void timer1_ovf_isr(void)
{
PORTB=0xFF;       //чтобы предотвратить эффект “тени” на соседних индикаторах
switch (cur_dig){
case 0:{digit3=0; digit1=1; break;};  //подаём питание на разряд 3
case 1:{digit1=0; digit2=1; break;};  //подаём питание на разряд 2
case 2:{digit2=0; digit3=1; break;};  //подаём питание на разряд 1
}
PORTB=digits[digit_out[cur_dig]];    //выводим с каждым срабатыванием таймера число с//мссива в порт В, но не для всех разрядов сразу

cur_dig++;                                           //с каждым срабатыванием таймера, увеличиваем
//переменную cur_dig на 1
if(cur_dig==3) cur_dig=0;                  //если cur_dig = 3 обнуляем
}

void main(void)
{
// Инициализация портов ввода/вывода
// Port B initialization
PORTB=0xFF;
DDRB=0xFF;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0xFF;
DDRD=0x70;

// Настраиваем таймер 0// Clock source: System Clock// Clock value: 4000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected


TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// разрешаем прерывания
#asm("sei")
while (1)
{

indication=123;  //пишем число для вывода 123
recoding();           //вызываем функцию обработки
};
}
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

У меня это работает,я для 2-хразрядного переделал.Дай свою схему в Протеусе,попробую .
Реклама
MSP
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Сб фев 14, 2009 01:45:25

Сообщение MSP »

да там сбрасывать нечего
Вложения
1.rar
(13.06 КБ) 455 скачиваний
Контактная информация:
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Вот для индикатора с общим анодом,версия CVAVR-2.03.4
Вложения
IND.rar
(55.54 КБ) 656 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Вот ещё вариант,без прерывания,а так тоже самое.
Вложения
.rar
(34.79 КБ) 469 скачиваний
Реклама
MSP
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Сб фев 14, 2009 01:45:25

Сообщение MSP »

dm211 писал(а):Вот для индикатора с общим анодом,версия CVAVR-2.03.4
Огромное спасибо, все работает, жаль только запятой нет ;)
Контактная информация:
Реклама
MSP
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 31
Зарегистрирован: Сб фев 14, 2009 01:45:25

Сообщение MSP »

Vov123 писал(а):Вот ещё вариант,без прерывания,а так тоже самое.
Почему-то не открывается.
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Я не знал,что кириллица в именах файлов здесь не поддерживается.
Вложения
2.rar
(34.79 КБ) 399 скачиваний
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

жаль только запятой нет
-Можно вывести любой символ,в т.ч. и запятую,внутри прерывания.Второй вариант у меня нормально заработал,после того как в Протеусе в свойствах контроллера указал путь к hex(или cof) файлу.
Man
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Решил тоже поработать с 7 сегментными индикаторами переделал код для 8 знакомест , но тут подруку попался индикатор АЛС318А в нем 9 знакомест.
Проблема заключается в том как использовать ешедну цифру если переменные до 32 бит (как я знаю).
Еше непонятно как убрать нули со старших разрядов например чтобы небыло при индикации цифры 25 на индикаторе 00000025.
Вложения
digit 2.c
исходник для 8
(3.02 КБ) 658 скачиваний
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Если внутри прерывания сделать

Код: Выделить всё

if (cur_dig==7)PORTD=1;
-эта цифра не должна гореть.
А вот так можно вывести запятые и др. символы
Вложения
IND.rar
(57.12 КБ) 392 скачивания
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

На железе нужно поменять местами нули с единицами здесь-

Код: Выделить всё

(cur_dig){
  case 0:{digit4=0;digit1=1;break;};  
  case 1:{digit1=0;digit2=1;break;};
  case 2:{digit2=0;digit3=1;break;};  
  case 3:{digit3=0;digit4=1;break;};

и подобрать частоту таймера.
Man
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Спосибо dm211 за дороботку функцый,доделал также для 8 цифр но вот почему-то неполучается вывести точку у первой цифры:

Код: Выделить всё

if(cur_dig==8)if(a==8)PORTD.7=0;

на остальных 7 цифрах точка выводится нормально.
Но одна проблема нерешилась как были нули в старших разрядах так они и есть :cry: .
Man
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Возникла проблема индикатор оказался с обшим катодом шас обдумываю как переделать .
Кто может подсказать как прально переделать с анода на катод ( пока думаю или просто инвертировать порты "^" или в знакогенераторе заменить 0 на 1 ,а 1 на 0 :)) ) как пральней будет подскажите?
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

С помощью этой программы попробуйте
Вложения
DigPrep.rar
(167.77 КБ) 429 скачиваний
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 35
Зарегистрирован: Пн мар 20, 2006 17:36:38
Откуда: Украина, Луганская обл.

Сообщение Baloo »

По-моему проще в начале программы таблицу переделать!
При этом и разряды можно подключать не последовательно (abcd...), а в произвольной последовательности!!! :))
Как отличить перереременное напряжение от постояяяяяянного???
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

В начале программы в таблице кроме цифр ничего не напишешь,другие символы таким способом не работают.Вот еще программа для 7 сегментников http://files.webi.ru/m_down/kod_dlia7-segm.rar.html
Man
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Переделал на индикатор с катодом работает , попробовал в железе сегодня фото ниже.
Но вот напаролся на страный баг почемуто сегмент "D" у цифр 3, 5 еле горит почти незаметен ,хатя у других цифр этот сегмент нормально горит знач порт целый .В протеусе цифры 3 и 5 отображаются прально :shock: .
Вложения
digit 2.c
Код для индикатора с катодом
(6.73 КБ) 750 скачиваний
318.JPG
фото
(37.26 КБ) 524 скачивания
Родился
Сообщения: 5
Зарегистрирован: Вт мар 24, 2009 23:24:26
Откуда: краснодарский край,г.лабинск

Сообщение andron.kip »

для этого кода ДИ я как-то замутил вывод целых слов на дисплей.
всё в архиве,думаю,разберётесь.
Вложения
counter2313.rar
(48.73 КБ) 426 скачиваний
Родился
Сообщения: 5
Зарегистрирован: Вт мар 24, 2009 23:24:26
Откуда: краснодарский край,г.лабинск

Сообщение andron.kip »

теперь можно ставить запятую в любом месте и тушить старшие разряды
Вложения
dinam.ind.8535.rar
(42.35 КБ) 473 скачивания
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»