Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Светодиодный индикатор на базе TM1637

Сб окт 07, 2023 22:28:40

Vlad_RK, при последовательной передаче цифр нельзя применять команду 0x44 - фиксированного адреса. всё будет записываться в стартовый адрес.
нужно применять команду 0x40 - автоматический инкремент адреса.
я в самом начале передаю команду 0x88+плюс код яркости - управление дисплеем.
поэтому у меня есть определения:
.equ command_auto = 0x40
.equ start_address = 0xc0
.equ control_display= 0x88 ; плюс код яркости

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

вот мой код вывода 4-х символов:
ldi ZL, digits_for_out
rcall start
ldi R26, command_auto
rcall write_byte
rcall stop
rcall start
ldi R26, start_address
rcall write_byte
ld R26, Z+
rcall write_byte
ld R26, Z+
rcall write_byte
ld R26, Z+
rcall write_byte
ld R26, Z+
rcall write_byte
rcall stop

digits_for_out - у меня адрес в ОЗУ (буфер), откуда брать символы.
но ты для проверки можешь сам каждый раз загружать в R26 нужный проверочный код символа.

ещё.
тут в теме писали, что в модули на входы TM1637 ставят конденсаторы большой емкости (до 10 нФ), вместо 100 пФ, как указано в даташите. поэтому модули оказываются очень медленные. я на своих модулях эти конденсаторы вообще убрал с платы.

Re: Светодиодный индикатор на базе TM1637

Вс окт 08, 2023 09:45:35

Vlad_RK, при последовательной передаче цифр нельзя применять команду 0x44 - фиксированного адреса. всё будет записываться в стартовый адрес.
А если мне надо поменять только одну цифру в третьем разряде? Или точку куда-нибудь поставить?
я в самом начале передаю команду 0x88+плюс код яркости - управление дисплеем.
Где это в коде?
Можно вас попросить написать простейший код для вывода конкретной цифры в конкретный разряд? Без использования буферов в ОЗУ и пр.
Про задержки я читал, про конденсаторы тоже, но реальных модулей у меня пока нет, только заказал, потому проверить могу только в Протеусе. Я выкладывал все это в предыдущем посте, если вам не сложно, можете написать код и проверить его в Протеусе?

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 10:55:48

если надо поменять только одну цифру в третьем разряде, тогда можно применить команду фиксированного адреса 0x44, а адрес третьего разряда 0xC2.

контроль дисплея я подаю один раз в самом начале программы:
rcall start
ldi R26, control_display
ori R26, 2 ; 4/16
rcall write_byte
rcall stop
к управляющему байту добавляю код яркости 2 == 4/16 яркости.

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

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 11:50:38

зачем мне проверять свой код в Протеусе...

Потому что у меня в Протеусе он не работает.
Мне нужен пример рабочего кода, дальше я сам уже для своих задач все сделаю.

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 13:06:24

Ошибся(.

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 19:20:04

Vlad_RK, у меня Протеус 8.6 SP2, модель ТМ1637 в нем есть, но эта модель в нем не работает.
я не знаю, какая версия у тебя Протеуса, могу дать сделанный проект. может, в твоем Протеусе заработает.
там еще в исходнике есть закомментированный блок чтения клавиатуры.
реализована для теста "бегущая строка"цифр - от 0 до F и плюс между F и 0 идет 4 "минуса".

Добавлено after 55 minutes 14 seconds:
я там в проекте забыл нарисовать резисторы подтяжки на входах. нарисовал, но модель ТМ1637 все равно не работает.
наверно, нужно установить другую версию Протеуса.
Вложения
TM1637 sourse 4x7s.zip
(20.32 KiB) Скачиваний: 38

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 20:14:27

Вот теперь работает.
У меня Протеус 8.15 SP1. Я отключил TM1637 от батарейки и подключил элемент POWER (иначе возникает ошибка Internal Exception: access violation in module 'TM1637.DLL' [00000965]). Ну и резисторы добавил.

Изображение

Re: Светодиодный индикатор на базе ТМ1637

Вс окт 08, 2023 20:42:31

контроль дисплея я подаю один раз в самом начале программы:
Вот это на мой взгляд не совсем правильно: Если случайно прилетает помеха, иногда регистры ТМки имеют свойство сбрасываться, особенно в случае присутствия рядом источника ЭМ помех высокого напряжения. У меня такое было - коронный разрядник недалеко от платы с ТМкой иногда вызывал сбой в ее работе и она тушила дисплей, поэтому я при каждом обновлении данных обновляю и содержимое управляющих регистров. Само обновление данных в регистрах ТМки происходит не по таймингу, а по событию, когда в выходном буфере есть новые данные на вывод.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 09:59:35

Vlad_RK писал(а):Я отключил TM1637 от батарейки и подключил элемент POWER (иначе возникает ошибка Internal Exception: access violation in module 'TM1637.DLL' [00000965]).
у меня то же самое показывало. я решил, что модель не работает. а про элемент POWER я не знал.

Добавлено after 9 hours 52 minutes 45 seconds:
что-то я не могу найти, как подключить элемент POWER.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 10:24:43

Левая панель - Terminals Mode.

Изображение

В архиве проект, который у меня работает.
Вложения
TM1637 sourse 4x7s.rar
(21.11 KiB) Скачиваний: 37

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 13:58:43

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

как я уже ранее сказал, на время передачи байта у меня оба выхода (клок и данные) активные.
можно попробовать сделать также, как это сделано в интерфейсе I2C - для передачи "1" порт переключается на вход, а подтяжка обеспечивает единичный уровень.
а для передачи "0" порт включается на выход и устанавливает ноль.
но в "железе" меня нужно было "убить" влияние входных конденсаторов, а это можно сделать только активными выходами.
а без конденсаторов на входах подтяжка будет быстро устанавливать "1", и можно для передачи "1" не использовать активный выход.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 14:32:42

Как по мне, логичнее и понятнее для передачи "1" не переключать порт на вход, а выдавать на него "1".
А вот насчет ACK - нужно ли вообще обращать на него внимание? Дожидаться его и, если он не пришел, отправлять данные заново?

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 15:10:47

обращать внимание на ответ нужно.
сейчас посмотрел свой код - по данным у меня уже сделан не активный выход при передаче "1".
сначала я его сделал активным, но если последний бит был "1", то ответ своим нулем делает кз выходу данных, а это очень плохо. пришлось исправлять программу.
как только кончается восьмой клок, тут же начинается ответ (судя по диаграмме в даташите), и нужно сразу освободить линию данных.
и если выход активный, то ответ тут же сделает кз выходу.
а у меня для передачи "1"порт переключается на вход, а "1" создается подтяжкой.
а если восьмой бит "0", то ответ своим нулем ничего не испортит.
для клока можно сделать, и у меня сделан, выход активным.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 15:31:52

Буду разбираться, спасибо.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 15:55:26

я в "железе" в натуре осциллом видел это кз.
когда последний бит "1", там получалась ступенька примерно в половину питания. пришлось срочно отказываться от активной "1" на выходе данных.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 17:12:06

Некоторое время назад столкнулся с той же проблемой. Ток у микросхемы в АСК не большой (4 mA?), но потребление есть. А сколько общих кодов в инeте с активным сигналом HIGH в DATA... Даже симулятор дает уровень половинного :). Проблема решена с помощью I2c (и rev_data) или просто 1 в "открытого стока".

Изображение

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 17:29:52

достаточно одного кода стартового адреса 0xC0 с восьмым последним битом, чтобы получить кз.
а так только код с десятичной точкой для ТМ1637 имеет старший бит "1".
аппаратный модуль I2C у меня не получилось применить - не заработало.
даже в даташите на ТМ1637 сказано, что метод связи не полностью соответствует протоколу шины I2C, поскольку в нем отсутствует адрес подчиненного устройства.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 17:35:23

Да, по I2c отправляю без адреса. И с реверсными данными. На AVR и на PIC работает (C).

Re: Светодиодный индикатор на базе TM1637

Пн окт 09, 2023 17:55:06

Vlad_RK, при последовательной передаче цифр нельзя применять команду 0x44 - фиксированного адреса. всё будет записываться в стартовый адрес.

А если каждый раз указывать адрес разряда, потом цифру, которую туда надо вывести? Каждый раз перезаписывать все цифры как-то не очень удобно.
Можно, конечно, использовать буфер, менять в нем, что там изменилось, и потом выводить все цифры на дисплей, но мне так не нравится.

Re: Светодиодный индикатор на базе ТМ1637

Пн окт 09, 2023 23:09:06

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

Добавлено after 2 minutes 48 seconds:
Vlad_RK, я сделал версию проекта для работы с кнопками.
добавил в схему кнопки и снял комментарий с "кнопочного" блока текста и поставил комментарий на блок текста с бегущей строкой.
Вложения
TM1637 sourse 4x7s работа клавиатуры.zip
(22.67 KiB) Скачиваний: 34
Ответить