Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Пт окт 06, 2023 00:03:30
Немного не в тему - TM1628 посмотрите, если хочется много выводить инфы. Во первых она до 8 разрядов умеет, во вторыху нее подключение на SPI чем то смахивает, только вместо CS у нее вывод STB есть - по сути тот же CS. Я с 1628, 1637, 1650 много работал - очень простые и удобные они. Если библиотеки не использовать, то без проблем с любым МК работают, даже с самыми чахлыми.
Пт окт 06, 2023 06:54:40
Viper_Snake, есть у вас для ТМ1637 программка для AVR контроллера и модель для Протеуса? Хочу в симуляторе опробовать этот индикатор, пока реальные из Китая жду.
Пт окт 06, 2023 09:06:50
К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать - лично у меня это программный I2C и буфер для вывода на дисплей 4-х байтный в виде массива. Я использую фиксированную адресацию при работе с этими контроллерами, сначала собираю изображение в буфер, к потом скармливаю его контроллеру. По сути у меня эти дисплеи в графическом режиме работают.
Пт окт 06, 2023 09:08:40
К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать
Посмотрите последнее сообщение на предыдущей странице.
Пт окт 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). Вот и все, что надо.
Пт окт 06, 2023 12:18:46
Там же ещё порядок бит обратный.
Пт окт 06, 2023 12:37:56
Там же ещё порядок бит обратный.
Кстати да, вы совершенно правы!
Добавлено after 7 minutes 6 seconds:Я когда вынужденно с TM1650 переходил на ТМ1637 очень долго плевался, так как сразу этого нюанса не увидел. Надо было на плату с ОК индикатором впилить ОА индикатор - пригодился китайский шилд на 1637. Но грабли нападают изза угла неожиданно - не сразу сообразил, чего он у меня не кажет.
Добавлено after 7 minutes 55 seconds:TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628
Пт окт 06, 2023 12:39:48
Но вы и сами ее вполне можете написать...
Зачем, когда есть 1000 уже написанных? Одна из.
https://github.com/DetSimen/TM1637.
Пт окт 06, 2023 12:47:22
Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...
Пт окт 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
посмотри, может, поможет тебе.
Пт окт 06, 2023 13:12:47
Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...
Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?
Пт окт 06, 2023 13:33:16
ATtiny13A + TM1637 + библ. DetSimen/TM1637. Даже с ArduinoIDE, MicroCore в Attiny13A остается место для других функций.
Proteus v8.13
- Вложения
-
- attiny13a_tm1637_proteus.zip
- (27.83 KiB) Скачиваний: 27
Пт окт 06, 2023 15:02:35
Не, ну если так, к чему тогда вопросы: берите библиотеку и вперёд. Просто все эти библиотеки не дают понимания как работает железяка и в случае если надо сделать что-то нестандартное - начинается период глубокого непонимания и затяжного отупения. Вот, например, попробуйте с помощью вышеуказанной библиотеки кнопочки опросить, или энкодер, подключенные к этой микросхеме. Тут и начнутся главные вилы, ибо в библиотеку этот функционал автор по причине лени не завез. А перевести весь интерфейс управления на плечи ТМки и освободив несколько портов МК, иногда которых и так не всегда хватает, это вполне себе отличное решение.
Пт окт 06, 2023 15:11:34
Согласно поставленным целям:
- готовый код/библиотека: с идеями/ограничениями автора, но запускается быстро, самому ничего не придумываешь
- собственный код, скомпилированный из чужых программ: с необходимых функций, но все равно большим по объему, сборка кода требует времени
- собственный код, для конкретной задачи, используя pdf упр. устройтво: минимальный по объёму кода, учтенные функции и анализ алгоритмов, оптимизированные по времени, используется память, функции конкретного устройства и т.д., но это требует времени, испытаний и собственного мышления.
Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).
Пт окт 06, 2023 16:59:50
Да я и не спорю, просто найти качественную библиотеку, которая не перегружает процессор избыточными операциями и не жрет память как собака мясо сейчас гораздо труднее, чем увидеть как паровоз @бет козу. Например - прикупил по случаю два дисплейчика TFT 160x80 на ST7735. Ну, решил посмотреть, что к чему. Так как проще всего их пощупать с помощью ардуины - к ней же и подключил, а в качестве либы Адафрутовское поделие взял. И хоть я пытался по минимуму код написать - фиг вам получился. Подтянулась еще пачка либ, которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world" высрать на экран?
Пт окт 06, 2023 17:10:27
... которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world"...
Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.
После того, как сделаете основной код/функции, напр. приду и спрошу: А где функция для ... ? - чего-то особенного или никогда не используемого
. Но это делает код неуниверсальным. И будет версия 1,2,3..100 ... написано годами. Дело не в том, что они не могли писать "простой код". Они ушли оттуда, чтобы код стал универсальным. И всегда найдется тот, кому что-то не-ОК по какой-то причине.
Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)
Пт окт 06, 2023 17:26:40
veso74, я вас прекрасно понимаю и ваши доводы вполне весомы, но есть другая сторона этого библиотечного безумия: вы ни на шаг не можете отступить от рамок, в которые вас загоняет библиотека, так как вынуждены использовать только ее функции. Свои вы не можете добавить, так как не понимаете, как именно работает железо. Это тупиковая ветвь развития, свойственная всем любителям Arduino которые пользуются исключительно возможностями языка Wiring. Да и сами библиотеки для Arduino зачастую на этом языке и написаны, поэтому кроме базовых возможностей человек, пользующийся подобным, больше ничего не может. А пересилить себя и копнуть чуть глубже многим откровенно лень. Я тоже был таким, пока не нарвался на ситуацию, когда для интересующей меня железки библиотеки рабочей просто не нашлось и мне самому пришлось узнавать, насколько глубока кроличья нора. Теперь я стараюсь избегать любых библиотек - лучше написать свои функции в коде, но только те, которые нужны и самому понятны, чем пытаться вникнуть в логику автора. Было время, я на проклятом модуле с TM1637 точки не мог зажечь нормально - просто не понимал, что и куда писать надо, а сейчас, когда потроха данной микросхемы мне известны, я могу сделать из нее все что угодно в рамках ее функционала. А сделать можно очень много.
Пт окт 06, 2023 17:32:47
Открываете файл .C и берете то, что вам нужно. Есть одна проблема: надо думать головой автора: что он хотел написать и что он написал, чтобы решить вопрос. Поверьте, это тоже сложно.
Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать
/ отправляетесь в соответствующее место для исправления. В противном случае, напр. с пр. кодом из 1 000..10 000 строк, происходит большая "прокрутка" от одного конца программы к другому изменить напр. один бит.
Пт окт 06, 2023 18:40:27
изменить напр. один бит.
А чтобы подобного не было, нужно заранее продумать, какие биты могут быть подвержены изменениям и удобно оформить их. На чужих мозгах далеко не уехать в любом случае.
Сб окт 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) Скачиваний: 20
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.