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

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

Пт окт 06, 2023 00:03:30

Немного не в тему - TM1628 посмотрите, если хочется много выводить инфы. Во первых она до 8 разрядов умеет, во вторыху нее подключение на SPI чем то смахивает, только вместо CS у нее вывод STB есть - по сути тот же CS. Я с 1628, 1637, 1650 много работал - очень простые и удобные они. Если библиотеки не использовать, то без проблем с любым МК работают, даже с самыми чахлыми.

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

Пт окт 06, 2023 06:54:40

Viper_Snake, есть у вас для ТМ1637 программка для AVR контроллера и модель для Протеуса? Хочу в симуляторе опробовать этот индикатор, пока реальные из Китая жду.

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

Пт окт 06, 2023 09:06:50

К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать - лично у меня это программный I2C и буфер для вывода на дисплей 4-х байтный в виде массива. Я использую фиксированную адресацию при работе с этими контроллерами, сначала собираю изображение в буфер, к потом скармливаю его контроллеру. По сути у меня эти дисплеи в графическом режиме работают.

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

Пт окт 06, 2023 09:08:40

К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать

Посмотрите последнее сообщение на предыдущей странице.

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

Пт окт 06, 2023 12:15:18

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

Добавлено 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). Вот и все, что надо.

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

Пт окт 06, 2023 12:18:46

Там же ещё порядок бит обратный.

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

Пт окт 06, 2023 12:37:56

Там же ещё порядок бит обратный.

Кстати да, вы совершенно правы!

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

Добавлено after 7 minutes 55 seconds:
TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628

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

Пт окт 06, 2023 12:39:48

Но вы и сами ее вполне можете написать...

Зачем, когда есть 1000 уже написанных? Одна из. https://github.com/DetSimen/TM1637.

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

Пт окт 06, 2023 12:47:22

Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...

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

Пт окт 06, 2023 13:03:59

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

посмотри, может, поможет тебе.

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

Пт окт 06, 2023 13:12:47

Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...

Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?

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

Пт окт 06, 2023 13:33:16

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

Изображение
Вложения
attiny13a_tm1637_proteus.zip
(27.83 KiB) Скачиваний: 27

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

Пт окт 06, 2023 15:02:35

Не, ну если так, к чему тогда вопросы: берите библиотеку и вперёд. Просто все эти библиотеки не дают понимания как работает железяка и в случае если надо сделать что-то нестандартное - начинается период глубокого непонимания и затяжного отупения. Вот, например, попробуйте с помощью вышеуказанной библиотеки кнопочки опросить, или энкодер, подключенные к этой микросхеме. Тут и начнутся главные вилы, ибо в библиотеку этот функционал автор по причине лени не завез. А перевести весь интерфейс управления на плечи ТМки и освободив несколько портов МК, иногда которых и так не всегда хватает, это вполне себе отличное решение.

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

Пт окт 06, 2023 15:11:34

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

Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).

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

Пт окт 06, 2023 16:59:50

Да я и не спорю, просто найти качественную библиотеку, которая не перегружает процессор избыточными операциями и не жрет память как собака мясо сейчас гораздо труднее, чем увидеть как паровоз @бет козу. Например - прикупил по случаю два дисплейчика TFT 160x80 на ST7735. Ну, решил посмотреть, что к чему. Так как проще всего их пощупать с помощью ардуины - к ней же и подключил, а в качестве либы Адафрутовское поделие взял. И хоть я пытался по минимуму код написать - фиг вам получился. Подтянулась еще пачка либ, которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world" высрать на экран?

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

Пт окт 06, 2023 17:10:27

... которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world"...

Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.

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

Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)

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

Пт окт 06, 2023 17:26:40

veso74, я вас прекрасно понимаю и ваши доводы вполне весомы, но есть другая сторона этого библиотечного безумия: вы ни на шаг не можете отступить от рамок, в которые вас загоняет библиотека, так как вынуждены использовать только ее функции. Свои вы не можете добавить, так как не понимаете, как именно работает железо. Это тупиковая ветвь развития, свойственная всем любителям Arduino которые пользуются исключительно возможностями языка Wiring. Да и сами библиотеки для Arduino зачастую на этом языке и написаны, поэтому кроме базовых возможностей человек, пользующийся подобным, больше ничего не может. А пересилить себя и копнуть чуть глубже многим откровенно лень. Я тоже был таким, пока не нарвался на ситуацию, когда для интересующей меня железки библиотеки рабочей просто не нашлось и мне самому пришлось узнавать, насколько глубока кроличья нора. Теперь я стараюсь избегать любых библиотек - лучше написать свои функции в коде, но только те, которые нужны и самому понятны, чем пытаться вникнуть в логику автора. Было время, я на проклятом модуле с TM1637 точки не мог зажечь нормально - просто не понимал, что и куда писать надо, а сейчас, когда потроха данной микросхемы мне известны, я могу сделать из нее все что угодно в рамках ее функционала. А сделать можно очень много.

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

Пт окт 06, 2023 17:32:47

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

Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать :)/ отправляетесь в соответствующее место для исправления. В противном случае, напр. с пр. кодом из 1 000..10 000 строк, происходит большая "прокрутка" от одного конца программы к другому изменить напр. один бит.

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

Пт окт 06, 2023 18:40:27

изменить напр. один бит.
А чтобы подобного не было, нужно заранее продумать, какие биты могут быть подвержены изменениям и удобно оформить их. На чужих мозгах далеко не уехать в любом случае.

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

Сб окт 07, 2023 13:49:01

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

Спасибо, конечно, за подпрограммки, но можно бы какой-то пример вывода цифр и точек на экран? С кнопками потом буду разбираться.
Я вот пытаюсь что-то подобное выдать: ;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 KiB) Скачиваний: 19
Ответить