Ув.[ref]seri0shka[/ref]! Приятно общаться с людьми, которым чужд потребительский подход, пытаются разобраться и помочь другим "не наступать на те же грабли". Спасибо Вам! Позвольте кое-что дополнить:
seri0shka писал(а): 01 окт 2019, 18:34
на поиски я потратил больше 6 часов.
Этого можно было избежать. Ну что же, прийдётся повториться и указать где описал уже особенности работы с ТМ16хх.
seri0shka писал(а): 01 окт 2019, 18:34
В библиотеках Батисты задействована внутренняя подтяжка контроллера
Нет, в этом загвоздка, Батиста не использует подтяжку, он просто переключает интерфейсные ноги МК в состояние LOW/HIGH (см. функции его библиотеки TM16xx.cpp- TM16xx::start(); void TM16xx::stop(); void TM16xx::send(byte data) и др.). А после прочитайте пж.
второй абзац сообщения №83,
это сообщение №21 [spoiler title= выборка]...обратите внимание на принудительные (IMHO) переключения состояния пинов Ардуино в High, при наличии подтяжек к Vcc сигнальных линий Data, Clock, Strobe, которые и предназначены для формирования этого уровня. К сожаленью не нашлось альтернативы и на github-е. Впрочем это касается всей линейки ТМ16хх, что у некоторых устройств (ТМ1636, ТМ1637, ТМ1640, ТМ1650, ТМ1651 и т.д. с эрзац-TWI/I2C) неизбежно приведёт к выгоранию вывода Ардуино и/или самого драйвера при удержании линии DIO в LOW (ACK,
ACKnowledge буквально из английского- "подтверждаю получение") подчинённым устройством...(редакт. при потере данных),
...резисторы подтяжки,
которые по протоколу I2C/TWI должны формировать высокий уровень на линиях, когда МК отпускает эти линии. Во всех остальных блоках здесь на форуме, скетчах и библиотеках TM1637 на github (за исключением на С++ от автора avishorp и на С от dhog1) делается это принудительным переключением выводов МК в HIGH. Другими словами подтяжка Clock (CLK) и Data (DIO) резисторами к Vcc, при таких делах, вообще становится лишней. См. описание протокола I2C/TWI и анализируем что будет с выходом МК или ведомого устройства в свете выдержки из описания протокола: "Генерация синхросигнала (ACK) - это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине. Сигнал синхронизации может быть изменен только если он “вытягивается” медленным ведомым устройством (путем удержания линии в низком состоянии)...". А если в этот момент МК переключается принудительно в HIGH? Чей вывод сгорит первым от КЗ?[/spoiler] и
настоятельно рекомендую начав с этого все сообщения ув. dhog1 до конца обсуждения. [spoiler title=цитирование] - на "подтянутых" линиях (которые соединены с питанием через подтягивающие резисторы) используют две операции: освободить линию (перейти в высокоимпедансное состояние, т.е. отключиться от линии, и тогда резисторы подтянут ее в состояние логической единицы), и прижать линию к земле, установив на ней логический ноль. Что-либо писать в подтянутую линию (устанавливая бит порта в "1") смысла не имеет...
На линиях "с подтяжкой к питанию" (pullup) используют операции:
- освободить линию (перейти в высокоимпедансное состояние, т.е. отключиться от линии), что приводит к установлению на линии логической единицы (работают подтягивающие к питанию резисторы). Это означает перевод пина МК в состояние (input, low), т.е. DDR(PIN) -> 0, PORT(PIN) -> 0...
-
Включив внутреннюю подтяжку (DDRx->0, PORTx->1), вы определяете "1" на линии. Если "с другой стороны" прижмут линию к земле, от вас потечет ток, чего "другая сторона" может не ожидать. (Pxn will source current if ext. pulled low. из даташита).
- прижать линию к земле (установить на линии логический ноль). Это означает перевод пина МК в состояние (output, low), т.е DDR(PIN) -> 1, PORT(PIN) -> 0
Линии данных и синхроимпульсов для TM163x подтягиваются внешними резисторами, их нормальное состояние "1". Именно они (резисторы) вытягивают линии к "1", когда вы со своей стороны перестаете их прижимать к земле ("0"). Состояние линии данных после сгенерированного восходящего фронта синхроимпульса считывается через соответствующий пин регистра PINx.
- ...при считывании байта командой scan_key выдать ACK прийдется...[/spoiler]
seri0shka писал(а): 01 окт 2019, 18:34
Так что нужно или ставить резисторы,
- это указано в даташите без альтернативы (без "или") [spoiler title=последний абзац стр.2]▲ Note: When DIO outputs data, it is an NMOS open drain output. To read the keypad, an
external pull-up resistor should be provided to connect 1K-10K. The Company recommends a
10K pull up resistor. At falling edge of the clock, DIO controls the operation of NMOS, at which point, the
reading is unstable until rising edge of the clock.[/spoiler] или схемах которыя я публиковал выше.
seri0shka писал(а): 01 окт 2019, 18:34
или править библиотеку
- Да, увы, сеньйор Батиста заблуждается уже много лет. Но если с ТМ1638 и др. MC (SPI или 3-Wire протокол)
такой фокус (вместо подтягивающих резисторов используется источник тока) проходит безболезненно, то с TM1637 (I2C или 2-Wire)
будет пшик при задержке ACK
Желаю всем удачи и большего внимания при чтении описаний!
