ATmega8 и восьмиразрядный семисегментный led индикатор

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

Здравствуйте, Коты и Кошки!

Начал недавно изучать МК. Хочу создать часы на восьмиразрядном дисплее, только на atmega8. Прилагаю схему и код программы на CodeVisionAVR. Пока что это набросок для протеуса. Поэтому некоторых элементов не хватает...

Схема:
Изображение

Текст программы:
Спойлер#include <mega8.h>
#include <delay.h>

#define dl 500

#define A PORTC.0
#define B PORTC.1
#define C PORTC.2
#define D PORTC.3
#define E PORTC.4
#define F PORTC.5
#define G PORTB.0
#define DP PORTB.1

int hours, minutes, seconds, day, month, year;
int mode;

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H = 0;
TCNT1L = 0;
seconds++;
}

// Declare your global variables here

void InitMC(void)
{

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=0 State4=T State3=T State2=T State1=1 State0=1
PORTB=0x03;
DDRB=0x23;

// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTC=0x7F;
DDRC=0x7F;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTD=0xFF;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 0,032 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x20;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")
}


// Процедура вывода на 7ми сегментный дисплей
void LedOn(int digit, int dot)
{
//A=1; B=1; C=1; D=1; E=1; F=1; G=1;
switch(digit)
{
case 0: {A=0; B=0; C=0; D=0; E=0; F=0; G=1; break;} // 0
case 1: {A=1; B=0; C=0; D=1; E=1; F=1; G=1; break;} // 1
case 2: {A=0; B=0; C=1; D=0; E=0; F=1; G=0; break;} // 2
case 3: {A=0; B=0; C=0; D=0; E=1; F=1; G=0; break;} // 3
case 4: {A=1; B=0; C=0; D=1; E=1; F=0; G=0; break;} // 4, Ч
case 5: {A=0; B=1; C=0; D=0; E=1; F=0; G=0; break;} // 5
case 6: {A=0; B=1; C=0; D=0; E=0; F=0; G=0; break;} // 6, Б
case 7: {A=0; B=0; C=0; D=1; E=1; F=0; G=1; break;} // 7
case 8: {A=0; B=0; C=0; D=0; E=0; F=0; G=0; break;} // 8, В
case 9: {A=0; B=0; C=0; D=0; E=1; F=0; G=0; break;} // 9
case 10: {A=1; B=1; C=1; D=1; E=1; F=1; G=0; break;} // -
case 11: {A=0; B=0; C=0; D=1; E=0; F=0; G=1; break;} // П
case 12: {A=1; B=0; C=0; D=1; E=0; F=0; G=0; break;} // Н
case 13: {A=0; B=0; C=0; D=1; E=1; F=1; G=1; break;} // Т
case 14: {A=0; B=1; C=1; D=0; E=0; F=0; G=1; break;} // С
case 15: {A=0; B=0; C=1; D=1; E=0; F=0; G=0; break;} // Р
}
if(dot) DP = 0; else DP = 1;
}

// Вывод данных на дисплей
void DispData(void)
{
int i, dp, j=0;
int digit[8];

switch (mode)
{
case 1: // Вывод времени чч-мм-сс
{
digit[0] = hours/10;
digit[1] = hours-10*(hours/10);
digit[2] = 10;
digit[3] = minutes/10;
digit[4] = minutes-10*(minutes/10);
digit[5] = 10;
digit[6] = seconds/10;
digit[7] = seconds-10*(seconds/10);
for (i=1; i<256; i*=2)
{
PORTD = i;
LedOn(digit[j], 0);
j++;
delay_us(dl);
}
break;
}
case 2: // Вывод даты дд.мм.гггг
{
digit[0] = day/10;
digit[1] = day-10*(day/10);
digit[2] = month/10;
digit[3] = month-10*(month/10);
digit[4] = (year % 100-(year % 10))/10;
digit[5] = year % 10;
for (i=1; i<256; i*=2)
{
PORTD = i;
if (j==1 || j==3) dp=1; else dp=0;
LedOn(digit[j], dp);
j++;
delay_us(dl);
}
break;
}
case 3: // Вывод даты
{

for (i=1; i<256; i*=2)
{
PORTD=i;
LedOn(digit[j], 0);
j++;
delay_us(dl);
}
}
}
}

// MAIN
void main(void)
{
InitMC();

// Проверка дисплея (прогон всех символов)
/*PORTC = 0b111111;
for (mode=0; mode<18; mode++)
{
LedOn(mode, 1);
delay_ms(100);
} */

// Инициализация переменных
hours = 20;
minutes = 15;
seconds = 0;
day = 28;
month = 12;
year = 2013;
mode = 1;

while (1)
{
// Условия времени
if (seconds == 60)
{
minutes++;
seconds = 0;
if (minutes == 60)
{
hours++;
minutes = 0;
if (hours == 24)
{
day++;
hours = 0;
}
}
}

// Опрос кнопок


// Вывод данных на дисплей
DispData();
}
}


Хочу собрать такую схему без дополнительных микросхем...

А вот вопросы:
Не могу настроить нормальную динамическую индикацию на частоте 32768Гц, на 8МГц нормально. В чем ошибка?
Можно ли вообще применить данную схему с использованием всех портов?

Есть советы по поводу схемы?
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

И еще, я хочу прицепить выводы кнопок к PORTD, параллельно с разрядами. Каким куском кода можно организовать опрос кнопок с этого порта?
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение vAv »

1. 32768 используется для таймера, сам проц тактируется другой частотой. если 8 мгц нормально, то так и оставить, настроив фьюзы на внутренний генератор.
2. Про "все порты" что-то нифиг не понял.
3. Опрос можно организовать любым способом, но я ничего вообще в твоем коде не вижу про кнопки. И организовывать надо как угодно, только не так как у тебя на схеме. Зачем там резисторы 22к???
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

1. Разве проц и таймер не тактируются от одного генератора? Как же тогда можно использовать внешний кварц для часов (таймера), а внутренний для программы? Извините за (может быть) глупый вопрос, но в ДШ я ничего подобного не нашел.
2. Я имел в виду использовать все порты на мк без исключения.
3. Резисторы по 2.2 к. А разве можно тупо кнопкой коротить вывод мк на землю? Наверное должен быть какой-то определенный уровень... Опрос кнопок пока не создал.

И еще вопрос. Как можно организовать опрос длинных и коротких нажатий клавиш программно?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение zero648 »

Я подозреваю, что при таком количестве разрядов с динамической индикацией, яркость будет недостаточной.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

Планирую добавить регулятор яркости... Кстати можно ли регулировать уровень напряжения на выходной ноге мк?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение zero648 »

MrFarik писал(а):Кстати можно ли регулировать уровень напряжения на выходной ноге мк?

Можно с помощью ШИМа.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

Спасибо! Надо освободить PORTB для ISP программирования. Куда можно подключить кнопки?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение zero648 »

MrFarik писал(а):Спасибо! Надо освободить PORTB для ISP программирования. Куда можно подключить кнопки?

Можно оставить так, кнопки не мешают программированию, просто их не нажимать во время прошивки и все.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение Engineer_Keen »

Регулировать яркость ШИМом можно, но у вас и так динамическая индикация, а значит ток для нормальной яркости нужно будет выдавать побольше номинального (см. импульсный ток индикатора в даташите). Допустимый ток вывода контроллера 40мА, т.е. около 6мА на сегмент - это мало, нужно ставить транзисторы как минимум на общие катоды(или аноды), а ток ограничивать резисторами, ими можно регулировать яркость и не будет ее зависимости от количества включенных в цифре сегментов.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение uk8amk »

MrFarik писал(а):1. Разве проц и таймер не тактируются от одного генератора? Как же тогда можно использовать внешний кварц для часов (таймера), а внутренний для программы?

TIMER/COUNTER2 в асинхронном режиме. Там целый раздел в даташите есть.

MrFarik писал(а):3. Резисторы по 2.2 к. А разве можно тупо кнопкой коротить вывод мк на землю?

Если этот вывод включен как вход с подтяжкой. Посмотрите, многие схемы используют подобное решение.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

40 мА на один вывод и не более 200мА на все выводы. Я добавлю транзисторы на общие аноды - по схеме на порт D. В таком случае можно регулировать яркость ШИМом? Подскажите пожалуйста, как рассчитать транзисторы и ограничительные сопротивления на сегменты, если известен ток потребления светодиодного дисплея.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение Engineer_Keen »

Яркость ШИМом можно регулировать в любом случае, вопрос в том, как вы сможете это реализовать - либо программно, каким-либо образом прерывая динамическую индикацию, либо аппаратно, поставив дополнительный ключ на аноды или катоды и управляя им с одного вывода OCRx. Как рассчитать ограничительные резисторы есть спец. тема, только учесть, что на биполярном транзисторе упадет еще примерно 0,6В. Транзисторы подобрать по току коллектора (скорее всего любой подойдет). Если ставить коллектором на аноды (PNP), то нужно инвертировать сигнал на PORTD. Базовый резистор килоом на 10 (можно больше).
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение SmarTrunk »

Зачем ставить транзисторы? Современные сверхъяркие индикаторы очень экономичны. У меня 7 разрядов, высота цифр 12мм, при индикации восьмерок потребляют 80 мА суммарно.

Конечно я не знаю, какой индикатор используется, может быть в данном конкретном случае это и правильно.

Еще можно поставить MAX7219, MAX7220, и они будут делать все сами, но это дороже. Зато транзисторов точно не понадобится, и программа упростится.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

Планируется использовать четыре двухразрядных индикатора paralight a-562g. Максимальный ток потребления 100ма. Регулирование яркости хочу сделать программно, зачем при этом останавливать динамическую индикацию?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение Engineer_Keen »

MrFarik писал(а):Регулирование яркости хочу сделать программно, зачем при этом останавливать динамическую индикацию?

Под остановкой я имел ввиду гашение цифры при совпадении уровня яркости со счетчиком ШИМ.
Аватара пользователя
MrFarik
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн июн 24, 2013 08:22:05
Откуда: Узбекистан, г. Навои

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение MrFarik »

Непонятна таблица в даташите...
Изображение

Неужели ток потребления данного индикатора 25мА (макс 100мА) на один сегмент? Не многовато?
И можно ли использовать ШИМ для моей схемы?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение Engineer_Keen »

MrFarik писал(а):Неужели ток потребления данного индикатора 25мА (макс 100мА) на один сегмент? Не многовато?

Типовое значение тока индикаторного светодиода 20мА, так что это нормально.
MrFarik писал(а):И можно ли использовать ШИМ для моей схемы?

Я уже сказал что можно в любом случае.
SmarTrunk
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Re: ATmega8 и восьмиразрядный семисегментный led индикатор

Сообщение SmarTrunk »

MrFarik
Это таблица МАКСИМАЛЬНО ДОПУСТИМЫХ параметров. А фактический ток будет зависеть от требуемой яркости. Очень может быть, что для одиночного индикатора будет нужен ток сильно меньше (порядка, скажем, 5мА), а вот при динамической индикации, с восемью индикаторами, где-нибудь 20-50мА. Это нужно экспериментально выяснять!

Кстати, для этих индикаторов, т.к. они имеют среднюю яркость и средние размеры, транзисторы ставить придется.

Программное изменение яркости, изменением длительности импульсов выбора разряда, при постоянной частоте сканирования, всегда возможно.
Ответить

Вернуться в «AVR»