Например TDA7294

 Форум РадиоКот • Просмотр темы - Помогит с семисегментиком
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пн авг 21, 2017 15:36:57



Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 09:46:14 
Открыл глаза

Карма: -1
Зарегистрирован: Сб ноя 12, 2016 10:41:00
Сообщений: 53
Рейтинг сообщения: 0
Народ а как сделать чтобы тут разные цифры были. ПРОграммирую я на с++ в атмел студио.
Немного почитал в инэте написал программу, но почему у меня не отображаетс число 13, а отображается 33????
#define F_CPU 4000000l
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int i;
unsigned char direction;
unsigned char R1=0, R2=0;

void ledprint(unsigned int number)
{
R1 = number%10; // младший разряд
R2 = number; // старший разпряд
}
void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
case 0: PORTD = 0b11000000; break;
}
}
unsigned char n_count=0;

ISR (TIMER1_COMPA_vect)
{
i++;
if (n_count==0)
{
PORTB &=~(1<<PB0);
PORTB |= (1<<PB1);
segchar(R1);
}
//---
if (n_count==1)
{
PORTB &=~(1<<PB1);
PORTB |= (1<<PB0);
segchar(R2);
}
n_count++;

if(n_count>1)
{
n_count =0;
}
}






int main(void)
{
DDRC = 0x00;
PORTC |= (1 << PC0); // Подключаем внутренний подтягивающий резистор
DDRD = 0xFF;
PORTD = 0x00;
DDRB = 0xFF;
PORTB = 0xFF;
TCCR1B = (1 << CS12)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
OCR1A = 1; // Выбор коэффициента деления
TIMSK |= (1 << OCIE1A); // Разрешение прерывания по совпадению



sei(); // Разрешение прерываний
ledprint(13);
while(1)
{

}
}


Вложения:
Безымянный.png [161.31 KiB]
Скачиваний: 27


Последний раз редактировалось narius985 Сб авг 19, 2017 11:17:11, всего редактировалось 1 раз.
Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 09:52:15 
Мудрый кот
Аватар пользователя

Карма: 21
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 1842
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Почитать про динамическую индикацию.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
От идеи до готового устройства! Нужен только EasyEDA!

Бесплатный инструмент для проектирования печатных плат - нарисуй свою плату прямо сейчас!

JLCPCB for PCB Prototyping, всего $2 за 10 печатных плат 10×10см. Доставка 2-3 дня.

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 16:44:22 
Держит паяльник хвостом
Аватар пользователя

Карма: 8
Зарегистрирован: Чт июн 10, 2010 21:11:19
Сообщений: 964
Рейтинг сообщения: 0
Так все же почти правильно реализовано, чего вы цепляетесь?
Цитата:
R2 = number; // старший разпряд

Тут автор забыл поделить на 10
R2 = number / 10;
Цитата:
switch (seg)

Тут стоило добавить ветку default с выводом чего-то, что бы сигнализировало о выходе за границы
К тому же сегменты стоит назначать макросами
Код:
#define SEG_A (1<<0)
#define SEG_B (1<<1)
...
switch(seg){
  case 0: PORTD = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F; break;
...

Перед переключением разряда стоит гасить предыдущий: как показывает практика, скорости светодиодов хватает чтобы на следующем разряде оставалось "эхо" от предыдущего.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 16:56:48 
Друг Кота
Аватар пользователя

Карма: 119
Зарегистрирован: Пт фев 04, 2011 18:57:51
Сообщений: 10671
Откуда: Рыбинск
Рейтинг сообщения: 0
Только вот у ТС схема показана не для динамической индикации, а для статической.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 16:59:11 
Друг Кота

Карма: 106
Зарегистрирован: Пн ноя 30, 2009 04:00:01
Сообщений: 17499
Откуда: Нерезиновая
Рейтинг сообщения: 0
Так все же почти правильно реализовано, чего вы цепляетесь?

Перед переключением разряда стоит гасить предыдущий: .

Развели "теорий", и НИКТО НЕ ЗАМЕТИЛ, что у ТС ОБА АНОДА индикатора ПРОСТО ТУПО СОЕДИНЕНЫ!!!!
Изображение
Оба разряда, при таком включении, ВСЕГДА будут показывать ОДНО И ТО ЖЕ!!!
Аноды надо РАЗДЕЛИТЬ, подключить к МК (напрямую, или лучше- через ключи или эмиттерные повторители), и написать программу так, чтобы, когда выводится на индикацию цифра первого разряда, было подано напряжение на анод первого разряда, а, при выводе цифры второго разряда- подано напряжение на анод второго разряда.

зы... Во, Martin76 тоже об этом написал.. :beer:


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Помогит с семисегментиком
СообщениеДобавлено: Сб авг 19, 2017 21:52:21 
Держит паяльник хвостом
Аватар пользователя

Карма: 8
Зарегистрирован: Чт июн 10, 2010 21:11:19
Сообщений: 964
Рейтинг сообщения: 0
Ну, по крайней мере в коде с этим проблемы не было :dont_know: :)))


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y