Страница 1 из 2

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

Добавлено: Ср мар 11, 2009 18:06:19
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();           //вызываем функцию обработки
};
}

Добавлено: Ср мар 11, 2009 18:55:16
dm211
У меня это работает,я для 2-хразрядного переделал.Дай свою схему в Протеусе,попробую .

Добавлено: Ср мар 11, 2009 21:56:35
MSP
да там сбрасывать нечего

Добавлено: Ср мар 11, 2009 22:06:10
dm211
Вот для индикатора с общим анодом,версия CVAVR-2.03.4

Добавлено: Чт мар 12, 2009 16:53:16
Vov123
Вот ещё вариант,без прерывания,а так тоже самое.

Добавлено: Чт мар 12, 2009 23:19:28
MSP
dm211 писал(а):Вот для индикатора с общим анодом,версия CVAVR-2.03.4
Огромное спасибо, все работает, жаль только запятой нет ;)

Добавлено: Чт мар 12, 2009 23:20:32
MSP
Vov123 писал(а):Вот ещё вариант,без прерывания,а так тоже самое.
Почему-то не открывается.

Добавлено: Пт мар 13, 2009 01:46:29
Vov123
Я не знал,что кириллица в именах файлов здесь не поддерживается.

Добавлено: Пт мар 13, 2009 06:14:47
dm211
жаль только запятой нет
-Можно вывести любой символ,в т.ч. и запятую,внутри прерывания.Второй вариант у меня нормально заработал,после того как в Протеусе в свойствах контроллера указал путь к hex(или cof) файлу.

Добавлено: Вс мар 15, 2009 09:50:33
Man
Решил тоже поработать с 7 сегментными индикаторами переделал код для 8 знакомест , но тут подруку попался индикатор АЛС318А в нем 9 знакомест.
Проблема заключается в том как использовать ешедну цифру если переменные до 32 бит (как я знаю).
Еше непонятно как убрать нули со старших разрядов например чтобы небыло при индикации цифры 25 на индикаторе 00000025.

Добавлено: Вс мар 15, 2009 12:14:38
dm211
Если внутри прерывания сделать

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

if (cur_dig==7)PORTD=1;
-эта цифра не должна гореть.
А вот так можно вывести запятые и др. символы

Добавлено: Пн мар 16, 2009 08:11:36
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;};

и подобрать частоту таймера.

Добавлено: Пн мар 16, 2009 14:32:13
Man
Спосибо dm211 за дороботку функцый,доделал также для 8 цифр но вот почему-то неполучается вывести точку у первой цифры:

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

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

на остальных 7 цифрах точка выводится нормально.
Но одна проблема нерешилась как были нули в старших разрядах так они и есть :cry: .

Добавлено: Вт мар 17, 2009 15:49:48
Man
Возникла проблема индикатор оказался с обшим катодом шас обдумываю как переделать .
Кто может подсказать как прально переделать с анода на катод ( пока думаю или просто инвертировать порты "^" или в знакогенераторе заменить 0 на 1 ,а 1 на 0 :)) ) как пральней будет подскажите?

Добавлено: Вт мар 17, 2009 21:58:38
dm211
С помощью этой программы попробуйте

Добавлено: Ср мар 18, 2009 00:32:20
Baloo
По-моему проще в начале программы таблицу переделать!
При этом и разряды можно подключать не последовательно (abcd...), а в произвольной последовательности!!! :))

Добавлено: Ср мар 18, 2009 07:00:10
dm211
В начале программы в таблице кроме цифр ничего не напишешь,другие символы таким способом не работают.Вот еще программа для 7 сегментников http://files.webi.ru/m_down/kod_dlia7-segm.rar.html

Добавлено: Ср мар 18, 2009 09:45:14
Man
Переделал на индикатор с катодом работает , попробовал в железе сегодня фото ниже.
Но вот напаролся на страный баг почемуто сегмент "D" у цифр 3, 5 еле горит почти незаметен ,хатя у других цифр этот сегмент нормально горит знач порт целый .В протеусе цифры 3 и 5 отображаются прально :shock: .

Добавлено: Вт мар 24, 2009 23:36:38
andron.kip
для этого кода ДИ я как-то замутил вывод целых слов на дисплей.
всё в архиве,думаю,разберётесь.

Добавлено: Вс май 03, 2009 21:16:53
andron.kip
теперь можно ставить запятую в любом месте и тушить старшие разряды