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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Немного не в тему - TM1628 посмотрите, если хочется много выводить инфы. Во первых она до 8 разрядов умеет, во вторыху нее подключение на SPI чем то смахивает, только вместо CS у нее вывод STB есть - по сути тот же CS. Я с 1628, 1637, 1650 много работал - очень простые и удобные они. Если библиотеки не использовать, то без проблем с любым МК работают, даже с самыми чахлыми.
Не важно чем все начнется. Важно чем кончится!
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

Viper_Snake, есть у вас для ТМ1637 программка для AVR контроллера и модель для Протеуса? Хочу в симуляторе опробовать этот индикатор, пока реальные из Китая жду.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать - лично у меня это программный I2C и буфер для вывода на дисплей 4-х байтный в виде массива. Я использую фиксированную адресацию при работе с этими контроллерами, сначала собираю изображение в буфер, к потом скармливаю его контроллеру. По сути у меня эти дисплеи в графическом режиме работают.
Не важно чем все начнется. Важно чем кончится!
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485483#p4485483"]К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать[/uquote]
Посмотрите последнее сообщение на предыдущей странице.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Что то там каша... Смотрите, вкратце: в даташите подробно описан формат посылки для корректной работы контроллера: сначала мы сообщаем ему что хотим делать (писать в регистры чтобы выводить изображение или читать состояние кнопок), после этого сообщаем адрес регистра, куда будем писать данные(соответственно какой разряд будем показывать), затем пишем сами данные и в конце байт управления дисплеем(включен/выключен) какая яркость.

Добавлено after 16 minutes 46 seconds:
Грубо говоря, чтобы вывести символ единицы в старшем сегменте надо скормить контроллеру следующее: START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP
Тут мы сообщаем, что будем писать в фиксированный адрес (0x44 - в даташите таблица 1 Data command setting), собственно говоря сообщаем адрес первого разряда (0xC0 - табл. 2 Adress command setting), пихаем то, что хотим записать (0x06 - по той же таблице 2) и в конце сообщаем, что дисплей включен на максимальной яркости (0x8F - табл 3 Display control). Вот и все, что надо.
Не важно чем все начнется. Важно чем кончится!
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5724
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

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

Сообщение >TEHb< »

Там же ещё порядок бит обратный.
"Привет!" - соврал он.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

[uquote=">TEHb<",url="/forum/viewtopic.php?p=4485540#p4485540"]Там же ещё порядок бит обратный.[/uquote]
Кстати да, вы совершенно правы!

Добавлено after 7 minutes 6 seconds:
Я когда вынужденно с TM1650 переходил на ТМ1637 очень долго плевался, так как сразу этого нюанса не увидел. Надо было на плату с ОК индикатором впилить ОА индикатор - пригодился китайский шилд на 1637. Но грабли нападают изза угла неожиданно - не сразу сообразил, чего он у меня не кажет.

Добавлено after 7 minutes 55 seconds:
TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628
Не важно чем все начнется. Важно чем кончится!
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485483#p4485483"]Но вы и сами ее вполне можете написать...[/uquote]
Зачем, когда есть 1000 уже написанных? Одна из. https://github.com/DetSimen/TM1637.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...
Не важно чем все начнется. Важно чем кончится!
Аватара пользователя
Starichok51
Модератор
Сообщения: 19040
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

Vlad_RK, посмотри мой код на ассемблере.

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

.def count_bits		= R24	; счетчик битов

.equ pin_TM1637	= pinD
.equ ddr_TM1637	= ddrD
.equ port_TM1637	= portD
.equ pin_clk		= 0
.equ pin_data		= 1

;--- Порт D ---
; Порт D0 - clock
; Порт D1 - data

ldi R26, (1<<pin_clk)
out port_TM1637, R26
out ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки.
;data - вход без внутренней подтяжки, работает внешняя подтяжка.

; подпрограммы
;---  ---
start:
sbi ddr_TM1637, pin_data ; data = 0
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
ret

;---  ---
stop:
sbi port_TM1637, pin_clk ; clock = 1
nop
nop
cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки
ret

;---  ---
;R26 - передаваемый байт
write_byte:
ldi count_bits, 8		; счетчик битов
cycle_write_byte:
cbi port_TM1637, pin_clk   ; clock = 0
lsr R26				; сдвиг байта вправо
brcc set_0				; если бит = 0, переходим на метку set_0
cbi ddr_TM1637, pin_data  ; если бит = 1, data = 1, за счет внешней подтяжки
rjmp yes_1			; и переходим на метку set_1
set_0:
sbi ddr_TM1637, pin_data  ; если бит = 0, data = 0, тут data - активный выход
nop
yes_1:
nop
nop
sbi port_TM1637, pin_clk   ; clock = 1
dec count_bits
brne cycle_write_byte

; далее действия на время ответного нулевого импульса.
cbi port_TM1637, pin_clk   ; clock = 0
cbi ddr_TM1637, pin_data  ; data = 1 за счет внешней подтяжки
sbi port_TM1637, pin_clk  ; clock = 1, data = 1 за счет ответного нулевого импульса
nop
nop
cbi port_TM1637, pin_clk  ; clock = 0
sbi ddr_TM1637, pin_data  ; data = 0, тут data - активный выход
ret
посмотри, может, поможет тебе.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485560#p4485560"]Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...[/uquote]
Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?
veso74
Поставщик валерьянки для Кота
Сообщения: 1905
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

ATtiny13A + TM1637 + библ. DetSimen/TM1637. Даже с ArduinoIDE, MicroCore в Attiny13A остается место для других функций.
Proteus v8.13

Изображение
Вложения
attiny13a_tm1637_proteus.zip
(27.83 КБ) 128 скачиваний
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Не, ну если так, к чему тогда вопросы: берите библиотеку и вперёд. Просто все эти библиотеки не дают понимания как работает железяка и в случае если надо сделать что-то нестандартное - начинается период глубокого непонимания и затяжного отупения. Вот, например, попробуйте с помощью вышеуказанной библиотеки кнопочки опросить, или энкодер, подключенные к этой микросхеме. Тут и начнутся главные вилы, ибо в библиотеку этот функционал автор по причине лени не завез. А перевести весь интерфейс управления на плечи ТМки и освободив несколько портов МК, иногда которых и так не всегда хватает, это вполне себе отличное решение.
Не важно чем все начнется. Важно чем кончится!
veso74
Поставщик валерьянки для Кота
Сообщения: 1905
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Согласно поставленным целям:
- готовый код/библиотека: с идеями/ограничениями автора, но запускается быстро, самому ничего не придумываешь
- собственный код, скомпилированный из чужых программ: с необходимых функций, но все равно большим по объему, сборка кода требует времени
- собственный код, для конкретной задачи, используя pdf упр. устройтво: минимальный по объёму кода, учтенные функции и анализ алгоритмов, оптимизированные по времени, используется память, функции конкретного устройства и т.д., но это требует времени, испытаний и собственного мышления.

Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Да я и не спорю, просто найти качественную библиотеку, которая не перегружает процессор избыточными операциями и не жрет память как собака мясо сейчас гораздо труднее, чем увидеть как паровоз @бет козу. Например - прикупил по случаю два дисплейчика TFT 160x80 на ST7735. Ну, решил посмотреть, что к чему. Так как проще всего их пощупать с помощью ардуины - к ней же и подключил, а в качестве либы Адафрутовское поделие взял. И хоть я пытался по минимуму код написать - фиг вам получился. Подтянулась еще пачка либ, которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world" высрать на экран?
Не важно чем все начнется. Важно чем кончится!
veso74
Поставщик валерьянки для Кота
Сообщения: 1905
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485637#p4485637"]... которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world"...[/uquote]
Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.

После того, как сделаете основной код/функции, напр. приду и спрошу: А где функция для ... ? - чего-то особенного или никогда не используемого :). Но это делает код неуниверсальным. И будет версия 1,2,3..100 ... написано годами. Дело не в том, что они не могли писать "простой код". Они ушли оттуда, чтобы код стал универсальным. И всегда найдется тот, кому что-то не-ОК по какой-то причине.

Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

veso74, я вас прекрасно понимаю и ваши доводы вполне весомы, но есть другая сторона этого библиотечного безумия: вы ни на шаг не можете отступить от рамок, в которые вас загоняет библиотека, так как вынуждены использовать только ее функции. Свои вы не можете добавить, так как не понимаете, как именно работает железо. Это тупиковая ветвь развития, свойственная всем любителям Arduino которые пользуются исключительно возможностями языка Wiring. Да и сами библиотеки для Arduino зачастую на этом языке и написаны, поэтому кроме базовых возможностей человек, пользующийся подобным, больше ничего не может. А пересилить себя и копнуть чуть глубже многим откровенно лень. Я тоже был таким, пока не нарвался на ситуацию, когда для интересующей меня железки библиотеки рабочей просто не нашлось и мне самому пришлось узнавать, насколько глубока кроличья нора. Теперь я стараюсь избегать любых библиотек - лучше написать свои функции в коде, но только те, которые нужны и самому понятны, чем пытаться вникнуть в логику автора. Было время, я на проклятом модуле с TM1637 точки не мог зажечь нормально - просто не понимал, что и куда писать надо, а сейчас, когда потроха данной микросхемы мне известны, я могу сделать из нее все что угодно в рамках ее функционала. А сделать можно очень много.
Не важно чем все начнется. Важно чем кончится!
veso74
Поставщик валерьянки для Кота
Сообщения: 1905
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Открываете файл .C и берете то, что вам нужно. Есть одна проблема: надо думать головой автора: что он хотел написать и что он написал, чтобы решить вопрос. Поверьте, это тоже сложно.

Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать :)/ отправляетесь в соответствующее место для исправления. В противном случае, напр. с пр. кодом из 1 000..10 000 строк, происходит большая "прокрутка" от одного конца программы к другому изменить напр. один бит.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1046
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

изменить напр. один бит.
А чтобы подобного не было, нужно заранее продумать, какие биты могут быть подвержены изменениям и удобно оформить их. На чужих мозгах далеко не уехать в любом случае.
Не важно чем все начнется. Важно чем кончится!
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

[uquote="Starichok51",url="/forum/viewtopic.php?p=4485567#p4485567"]Vlad_RK, посмотри мой код на ассемблере.
Спойлер

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

.def count_bits		= R24	; счетчик битов

.equ pin_TM1637	= pinD
.equ ddr_TM1637	= ddrD
.equ port_TM1637	= portD
.equ pin_clk		= 0
.equ pin_data		= 1

;--- Порт D ---
; Порт D0 - clock
; Порт D1 - data

ldi R26, (1<<pin_clk)
out port_TM1637, R26
out ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки.
;data - вход без внутренней подтяжки, работает внешняя подтяжка.

; подпрограммы
;---  ---
start:
sbi ddr_TM1637, pin_data ; data = 0
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
ret

;---  ---
stop:
sbi port_TM1637, pin_clk ; clock = 1
nop
nop
cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки
ret

;---  ---
;R26 - передаваемый байт
write_byte:
ldi count_bits, 8		; счетчик битов
cycle_write_byte:
cbi port_TM1637, pin_clk   ; clock = 0
lsr R26				; сдвиг байта вправо
brcc set_0				; если бит = 0, переходим на метку set_0
cbi ddr_TM1637, pin_data  ; если бит = 1, data = 1, за счет внешней подтяжки
rjmp yes_1			; и переходим на метку set_1
set_0:
sbi ddr_TM1637, pin_data  ; если бит = 0, data = 0, тут data - активный выход
nop
yes_1:
nop
nop
sbi port_TM1637, pin_clk   ; clock = 1
dec count_bits
brne cycle_write_byte

; далее действия на время ответного нулевого импульса.
cbi port_TM1637, pin_clk   ; clock = 0
cbi ddr_TM1637, pin_data  ; data = 1 за счет внешней подтяжки
sbi port_TM1637, pin_clk  ; clock = 1, data = 1 за счет ответного нулевого импульса
nop
nop
cbi port_TM1637, pin_clk  ; clock = 0
sbi ddr_TM1637, pin_data  ; data = 0, тут data - активный выход
ret
[/uquote]
Спасибо, конечно, за подпрограммки, но можно бы какой-то пример вывода цифр и точек на экран? С кнопками потом буду разбираться.
Я вот пытаюсь что-то подобное выдать: ;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP, но на индикаторе не "1", а что-то совсем другое.
Вот такой вариант (все есть в прикрепленном архиве):
Спойлер

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

.include "m32def.inc"
.def	temp	=	r16		;Временный регистр
.def	count_bits = R24	;Счетчик битов

.equ pin_TM1637 = pinC
.equ ddr_TM1637 = ddrC
.equ port_TM1637 = portC
.equ pin_clk = 0
.equ pin_data = 1

;--- Порт C ---
; Порт C0 - clock
; Порт C1 - data

;***** Векторы Прерываний *****

.CSEG
.org	$000
		rjmp	RESET		;Сброс вектор
.org	$002
		reti
.org	$004
		reti
.org	$006
		reti
.org	$008
		reti
.org	$00A
		reti
.org	$00C
		reti
.org	$00E
		reti
.org	$010
		reti
.org	$012
		reti
.org	$014
		reti
.org	$016
		reti
.org	$018
		reti
.org	$01A
		reti
.org	$01C
		reti
.org	$01E
		reti
.org	$020
		reti
.org	$022
		reti
.org	$024
		reti
.org	$026
		reti
.org	$028
		reti

RESET:				ldi		temp,high(RAMEND)	;назначить стек
					out		SPH,temp
					ldi		temp,low(RAMEND)
					out		SPL,temp

					ldi		R26, (1<<pin_clk)
					out		port_TM1637, R26
					out		ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки
;data - вход без внутренней подтяжки, работает внешняя подтяжка

;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP

PROG:				rcall	start
					ldi		R26, 0x44
					rcall	write_byte
					rcall	stop

					rcall	start
					ldi		R26, 0xC0
					rcall	write_byte
					ldi		R26, 0x06
					rcall	write_byte
					rcall	stop

					rcall	start
					ldi		R26, 0x8F
					rcall	write_byte
					rcall	stop
					
					rjmp	PROG


; подпрограммы
;--- ---
start:
					sbi		ddr_TM1637, pin_data	;data = 0
					nop
					nop
					cbi		port_TM1637, pin_clk	;clock = 0
					ret

;--- ---
stop:
					sbi		port_TM1637, pin_clk	;clock = 1
					nop
					nop
					cbi		ddr_TM1637, pin_data	;data = 1, за счет внешней подтяжки
					ret

;--- ---
;R26 - передаваемый байт
write_byte:
					ldi		count_bits, 8			;счетчик битов
cycle_write_byte:
					cbi		port_TM1637, pin_clk	;clock = 0
					lsr		R26						;сдвиг байта вправо
					brcc	set_0					;если бит = 0, переходим на метку set_0
					cbi		ddr_TM1637, pin_data	;если бит = 1, data = 1, за счет внешней подтяжки
					rjmp	yes_1					;и переходим на метку set_1
set_0:
					sbi		ddr_TM1637, pin_data	;если бит = 0, data = 0, тут data - активный выход
					nop
yes_1:
					nop
					nop
					sbi		port_TM1637, pin_clk	;clock = 1
					dec		count_bits
					brne	cycle_write_byte

;далее действия на время ответного нулевого импульса
					cbi		port_TM1637, pin_clk	;clock = 0
					cbi		ddr_TM1637, pin_data	;data = 1 за счет внешней подтяжки
					sbi		port_TM1637, pin_clk	;clock = 1, data = 1 за счет ответного нулевого импульса
					nop
					nop
					cbi		port_TM1637, pin_clk	;clock = 0
					sbi		ddr_TM1637, pin_data	;data = 0, тут data - активный выход
					ret
veso74, ваш код работает, но С++ я не знаю, сейчас Си изучаю.
Вложения
TM1637 (Asm).rar
(43.5 КБ) 97 скачиваний
Ответить

Вернуться в «Периферия»