Вопрос про динамическую индикацию!

Обсуждаем контроллеры компании Atmel.
Максим Пахтусов
Родился
Сообщения: 2
Зарегистрирован: Ср окт 15, 2025 21:42:15

Вопрос про динамическую индикацию!

Сообщение Максим Пахтусов »

Здравствуйте! Я начинающий. Прошу помощи старших коллег по следующему вопросу: Пишу код под атмега8 для вывода на 4х разрядном семисегментнике числа 9578, проблема вот в чем,
при попытке вывести 9578 по отдельности на 4х одноразрядных семисигментниках все получается как надо, но при попытке отобразить его на 4х или 6и разрядном семисегментнике вылезает какая то билеберда!
Может это протеус глючит? Или я...Сталкивались ли с такой проблемой? У меня ничего не выходит.
Вложения
Proteus+AVR.zip
(37.02 КБ) 127 скачиваний
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

да нормально показывает))

Изображение

:tea:
лучше сразу выкладывать исходник... отдельно.))
main.c
(2.93 КБ) 118 скачиваний
:roll:

Добавлено after 36 minutes 45 seconds:
с динамической индикацией не сталкивался...
от динамической индикации в глазах рябит))
:shock:
мне нравится статическая))
8)

зато я сталкивался с синхронизацией...

в исходнике прерывание таймера не синхронизировано с другой программой...
это не правильно.
:tea:
Вложения
Screenshot_1.jpg
(146.75 КБ) 744 скачивания
Максим Пахтусов
Родился
Сообщения: 2
Зарегистрирован: Ср окт 15, 2025 21:42:15

Re: Вопрос про динамическую индикацию!

Сообщение Максим Пахтусов »

Ничего не понял) "в исходнике прерывание таймера не синхронизировано с другой программой...
это не правильно" с какой другой программой?
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

-в программе есть главная функция int main(void).
-в программе есть функция перевода числа в разряды void chislo(unsigned int result).
-в программе есть функция прерывания таймера ISR(TIMER0_OVF_vect).
и всё это не синхронизировано.
:tea:
см. Семафор (англ. semaphore) в программировании.
:)

подробнее...
:roll:

1 -в главной функции int main(void) мы вызываем функцию void chislo(unsigned int result) и передаём число 9578.

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

   while (1) 
    {
		chislo(9578);
    }
2 -в функции void chislo(unsigned int result) мы переводим число в разряды.

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

void chislo(unsigned int result)
{
	res_1000 = result / 1000;
	res_100 = result % 1000 / 100;
	res_10  = result % 100/10;
	res_1   = result % 10;
}

3 - в прерывании таймера мы выводим разряды на индикатор.

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

ISR(TIMER0_OVF_vect)
{
	if (++z > 4) {z = 1;}
		
	if (z==1)
	{
		PORTB &= ~(1<<2);
		PORTB |= (1<<5) | (1<<4) | (1<<3);
		obrabotka(res_1000);
	}
	if (z==2)
	{
		PORTB &= ~(1<<3);
		PORTB |= (1<<5) | (1<<4) | (1<<2);
		obrabotka(res_100);
	}
	if (z==3)
	{
		PORTB &= ~(1<<4);
		PORTB |= (1<<5) | (1<<3) | (1<<2);
		obrabotka(res_10);
	}
	if (z==4)
	{
		PORTB &= ~(1<<5);
		PORTB |= (1<<4) | (1<<3) | (1<<2);
		obrabotka(res_1);
	}
}
и всё бы ничего... вот только есть обна проблемка)) нет синхронизации с таймером.
:shock:

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

вызываем в функцию void chislo(unsigned int result)...

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

void chislo(unsigned int result)
{
	res_1000 = result / 1000;
	res_100 = result % 1000 / 100;
       
        // в этом месте сработало прерывание таймера.
        // уходим в прерывание таймера.

     ISR(TIMER0_OVF_vect)
    {
	if (++z > 4) {z = 1;}
		
	if (z==1)
	{
		PORTB &= ~(1<<2);
		PORTB |= (1<<5) | (1<<4) | (1<<3);
		obrabotka(res_1000);
	}
	if (z==2)
	{
		PORTB &= ~(1<<3);
		PORTB |= (1<<5) | (1<<4) | (1<<2);
		obrabotka(res_100);
	}
	if (z==3)
	{
		PORTB &= ~(1<<4);
		PORTB |= (1<<5) | (1<<3) | (1<<2);
		obrabotka(res_10);
	}
	if (z==4)
	{
		PORTB &= ~(1<<5);
		PORTB |= (1<<4) | (1<<3) | (1<<2);
		obrabotka(res_1);
	}
    }

        // выходим из прерывания таймера.
        // продолжаем переводить число в разряды.
        
        res_10  = result % 100/10;
	res_1   = result % 10;
}
в итоге на индикаторе мы увидим неправильное число))
это не правильно.
:tea:
Последний раз редактировалось roman.com Чт окт 16, 2025 12:10:56, всего редактировалось 3 раза.
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Вопрос про динамическую индикацию!

Сообщение linux_rulezz »

Внешне код рабочий, хоть и страшный
1.png
(40.65 КБ) 118 скачиваний
Ладно, опустим комментарии на русском (хоть это странно), но названия функций…
Ну и главный вопрос: зачем в суперлупе постоянно молотить преобразование одного и того же числа? Можно же было просто вот так сделать:

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

chizlo(9578);
while(1){}
Добавлено after 2 minutes 31 second:
roman.com, ну, в данном случае у него проблем не будет, т.к. он постоянно молотит одно и то же.
Да и вообще, это не страшно для динамической индикации: момент смены числа будет достаточно быстрым, глаз просто не заметит "засады".
Windows must die!
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4754580#p4754580"]Ладно, опустим комментарии на русском (хоть это странно), но названия функций…[/uquote]
пофигу)) кому как удобней.
главное что всем понятно.
:tea:
linux_rulezz писал(а):это не страшно для динамической индикации: момент смены числа будет достаточно быстрым, глаз просто не заметит "засады".
страшно... не страшно... это вопрос десятый.))
главное что это не правильно.
:tea:

программа может например остановиться в любом месте...
или МК может уйти в сон в любом месте программы... "sleep"...
или МК может просто тупо зависнуть в любом месте программы... while(1){};
или... ещё может быть миллион вариантов))

главное что в любом случаев (из миллиона вариантов) на индикаторе мы увидим последнее обработанное число...
и с высокой вероятностью это число будет не 9578.
это не правильно.
:tea:
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Вопрос про динамическую индикацию!

Сообщение linux_rulezz »

кому как удобней
Ну вот когда я вижу китайский код с иероглифами в комментариях, возникает желание кому-нибудь двинуть… Ну неужели на международном языке нельзя писать? Сразу к культуре надо приучаться. И функции называть не "zafiga4it_otpravku", а, скажем, "send_data".
Windows must die!
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

"zafiga4it_otpravku"...
да можно и так.))
:tea:
[uquote="Максим Пахтусов",url="/forum/viewtopic.php?p=4754471#p4754471"]при попытке отобразить его на 4х или 6и разрядном семисегментнике вылезает какая то билеберда![/uquote]
а где 6-ти разрядный семисегментник ?
:roll:

Добавлено after 16 minutes 41 second:
а ещё можно сделать так...

Изображение

или так...

Изображение

но это всё динамическая индикация...
я бы так делать не стал))
:tea:
Вложения
Screenshot_2.jpg
(76.79 КБ) 1106 скачиваний
Screenshot_1.jpg
(93.83 КБ) 590 скачиваний
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Вопрос про динамическую индикацию!

Сообщение linux_rulezz »

roman.com, статическая индикация последнее время "не в моде". Взять те же светодиодные панели: там мало того, что для изменения яркости отдельного светодиода нужно долбить индикатор с частотой 16-24Гц, так еще и индикатор фактически поделен на 4 квадранта! И каждый обслуживается поочередно. И ничего, вполне себе работает. Я шутки ради делал "игровую приставку" (арканоид, тетрис и змейка) на STM32F103. Видео.
Windows must die!
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

повторяю...
roman.com писал(а):от динамической индикации в глазах рябит))

мне нравится статическая))
поэтому далем так...

сдвиговый регистр + регистр буфера + блок синхронизации (на схеме не показан).

Изображение

-индикация статическая. в глазах не рябит))
8)
-для индикатора используется всего один вывод МК. экономия выводом МК))
:)
класс ! ))
:tea:
Вложения
Screenshot_1.jpg
(62.23 КБ) 558 скачиваний
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Вопрос про динамическую индикацию!

Сообщение veso74 »

Оффтоп: roman.com, всегда можно сделать лучше :П. Например так:

Изображение
СпойлерНо станет похоже на анекдот: "Хорошие часы! (А батарейки: в чемоданах)".
Изображение
Последний раз редактировалось veso74 Чт окт 16, 2025 14:14:27, всего редактировалось 3 раза.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос про динамическую индикацию!

Сообщение BOB51 »

https://img.radiokot.ru/files/20529/1st7ni12lm.jpg
https://img.radiokot.ru/files/20529/1st7nh5zvs.jpg
Та же динамическая индикация...
От такого индикатора "в глазах рябит"?
:wink:
При правильно организованной работе "побочных эфектов" у динамики не будет.
Вот только сделать это без ущерба основной программе не всегда удачно получается.
Желательно иметь свободный таймер и блок обслуживания развертки отображения по прерыванию плюс пару буферных массивов размером по количеству знакомест дисплея.
На сегодня при наличии большого количества готовых модулей индикаторов "с мозгами" как бы данный вопрос уже давно подзабыт...
8)
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Вопрос про динамическую индикацию!

Сообщение veso74 »

Да, MAX7219 работает с высокой частотой обновления LED, мерцания не видно, легко управляется, три провода.
В кодировйки даже ATtiny13 легко справляется.

Изображение

Динамическое управление LED по RF очень мешает, но это понятно.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос про динамическую индикацию!

Сообщение BOB51 »

Для снятия "мерцания" достаточно и 62 Герца выставить...
Там просто рутинные операции не забыть выполнять. Плюс стабильность развертки, не зависящая от выполнения основной программы.
"Трещит" конечно весьма (для радиочастот при мощной нагрузке) - но до 8 индикаторов вполне свободно можно соорудить. Большее количество уже может и проиграть статике. Но только не в вопросах энергопрожорливости - там статика в явном проигрыше.
8)
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

veso74 писал(а):всегда можно сделать лучше :П. Например так:
там нет элемента XOR.
а это главный элемент. без него ничего работать не будет.
:tea:
BOB51 писал(а):От такого индикатора "в глазах рябит"?
о любого...

-у меня на столе LED часы мерцают...
-гуляя по ночному городу "в глазах рябит"...

Изображение

-особенно бесит "бегущая строка"...

Изображение

:facepalm:
BOB51 писал(а):в вопросах энергопрожорливости - там статика в явном проигрыше.
вопрос спорный...
:roll:
хотя... когда вопрос касается комфорта... и здоровья... остальное уже не важно))
:tea:
Вложения
Screenshot_2.jpg
(44.64 КБ) 468 скачиваний
Screenshot_1.jpg
(106.06 КБ) 478 скачиваний
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос про динамическую индикацию!

Сообщение BOB51 »

Динамическую индикацию надо уметь готовить .
Особо в случае рекламных щитов...
:))
Да и на сегодня огромное количество "шустроумных" светиков в тех экранах применяется - а то уже не динамика в чистом виде, а построчно/покадровый вывод (аналогия телевизионной картинки).
Там другие "особенности" основанные на специфике восприятия глазом "мультипликации" у усредненного человечика.
Кстати... вариант "заморозки" изображения при резком повороте головы обычное явление.
Но то совсем не "мерцание" (несколько иной механизм восприятия).
8)
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Вопрос про динамическую индикацию!

Сообщение linux_rulezz »

Вот насчет светодиодных панелей, специально предназначенных для "бегущей строки", все время недоумевал: почему до сих пор нет для них стандартных параллельных буферов? Скажем, на 32 пикселя по вертикали. Соединяешь на плате 128 таких буферов - вуаля, у тебя "бегущая строка" в 128 пикселей шириной и 32 высотой. Подключаешь через параллельный интерфейс следующий - и побежала строчка дальше.
МК мог бы этой фигней (правда, без изменения яркости светодиодов) по трем проводам управлять: такт для сдвигового регистра (заполняющего столбцы), данные для него и такт для сдвига столбцов. И, как тут некоторые любят, была бы "чисто статическая" индикация (покуда не сдвинешь дальше).
Windows must die!
Аватара пользователя
AlexS4
Друг Кота
Сообщения: 6646
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Re: Вопрос про динамическую индикацию!

Сообщение AlexS4 »

[uquote="BOB51",url="/forum/viewtopic.php?p=4754631#p4754631"]h
При правильно организованной работе "побочных эфектов" у динамики не будет.
Вот только сделать это без ущерба основной программе не всегда удачно получается.
Желательно иметь свободный таймер и блок обслуживания развертки отображения по прерыванию плюс пару буферных массивов размером по количеству знакомест дисплея.[/uquote]

для светодиодов допустим оочень широкий диапазон частот разверток
~ 50Hz...500kHz частоты полных циклов. :)
так что отдельный таймер обычно не нужен, достаточно общего таймера системных процессов
обычно ж и другие алгоритмы требуют выравниваний своих задач по таймерам.

чтоб не было интерференционных мельканий при низких частотах разверток - надо синхронизировать с 50Hz. (ну или 60Hz, если вы иноземный кот :) )
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Вопрос про динамическую индикацию!

Сообщение roman.com »

BOB51 писал(а):Динамическую индикацию надо уметь готовить .
не знаю как её готовить... она всё равно будет мерцать...

сделал себе дома гирлянду... а она мерцает... через всякие тринисторы...

Изображение

:facepalm:

в итоге.. всё повыкидывал и подключил напрямую от стабилизированного источника питания постоянного тока.
теперь просто светит... вместо освещения))
больше ничего не мерцает и не раздражает))
8)

Добавлено after 5 minutes 51 second:
а вообще... если сравнивать разные лампы... то приятней всего лампа накаливания...

Изображение

поэтому в доме лучше всего использовать именно лампа накаливания... причём много... для лучшего распределения света... без теней... и лучше на постоянном токе... чтоб не мерцали...

Изображение

:tea:
Вложения
Screenshot_3.jpg
(74.86 КБ) 408 скачиваний
Screenshot_4.jpg
(24.55 КБ) 422 скачивания
Screenshot_2.jpg
(47.05 КБ) 435 скачиваний
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопрос про динамическую индикацию!

Сообщение BOB51 »

AlexS4 писал(а):...

для светодиодов допустим оочень широкий диапазон частот разверток
~ 50Hz...500kHz частоты полных циклов. :)... )
Частотный диапазон светика не одно и то же, что и допустимый интервал свечения позиции в строке развертки.
Значительное уменьшение времени индикации требует увеличения яркости светика.
Нужен компромисс как по параметрам самого светика так и по времени индикации позиции в блоке развертки.
Второй параметр - время на смену данных в позиции (скорость загрузки регистров).
Собственно время индикации позиции не может быть меньше времени на ее загрузку.
Хорошо, ежли позиций до 8 и параллельная загрузка в два регистра.
А если допустим 8 строк по 64 точки? (или более длинная строка)
:wink:
Ответить

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