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

Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Пн сен 14, 2020 15:01:57

Есть такая плата. Решил с ней разобраться. Плату подключил к микроконтроллеру SM8952AC, это с очень небольшими отличиями 8051- совместимый МК. С индикацией разобрался быстро и без проблем, а вот прочитать кнопки ну никак не удается.
Для начала написал подпрограмму чтения:
1. выводы DIO, CLK в высоком состоянии (входы, активный уровень МК - лог.0).
2. опускаю сигнал CLK
3. Жду 5 мкс.
4. Поднимаю сигнал CLK
5. Копирую состояние DIO в бит переноса МК.
6. Сдвигаю вправо регистр-аккумулятор вместе с битом переноса.
9. делаю так 8 раз, возвращаясь к пункту 2.
10. сдвигаю аккумулятор еще раз вправо.
11. копирую аккумулятор в ячейку памяти, выхожу из подпрограммы.

В даташите указано, чтоб прочитать кнопки, надо опустить STB, отправить микрухе команду 0x42, после чего, не поднимая сигнал STB, 4 раза произвести чтение. Так и делаю:

1. Опускаю STB.
2. выдерживаю паузу
3. Передаю код 0x42.
4. Выдерживаю паузу
5. Вызываю подпрограмму чтения, описанную выше.
6. Возвращаемое значение ложу в первую ячейку памяти.
7. И так 4 раза, пока заполнятся 4 ячейки памяти.
8. Поднимаю сигнал STB
9. Вызываю подпрограмму отображения принятых данных. Так как я не знаю в какой из 4-х ячеек данные, то по очереди с секундной задержкой отображаю их все, а еще 4-мя светодиодами отображаю номер ячейки. Принятые данные отображаются 8-разрядной светодиодной полоской на порте 2.
10. возвращаюсь к п.1 и так циклически. Пробовал возвращатся к п.4, но разницы никакой.

И ничего не работает. Хотя некое шевеление присутствует, при нажатии кнопок загорается 5-й и 0-й разряд индикатора на P2. Хотя в даташите все достаточно просто.
Пробовал по всякому - менял фазу, менял полярность тактовых импульсов в подпрограмме чтения, пробовал менять момент фиксации состояния вывода DIO - по фронту, по полке, по спаду, сдвигал влево, сдвигал вправо, менял команду чтения - 0x41 вместо 0x42, пробовал стробировать отправку команды 0x42 (так отправляется инструкция 0x44 для индикации )- чего только не делал - не работает никак.


Исходный код программы:

Спойлер
Код:
stb_pin      bit   P1.0
clk_pin      bit   P1.1
dio_pin      bit   P1.2

rdata      equ   0x20
ldata      equ   0x21

reg0      equ   0x22
reg1      equ   0x23
reg2      equ   0x24
reg3      equ   0x25


      org   0

main:      clr   stb_pin
      mov   rdata, #0x44
      call   tm1638send
      call   pause
      setb   stb_pin
      call   pause

      clr   stb_pin
      mov   rdata, #0x0C
      call   tm1638send
      mov   rdata, #0xFF
      call   tm1638send
      call   pause
      setb   stb_pin
      call   pause

      clr   stb_pin
      mov   rdata, #0x8D
      call   tm1638send
      call   pause
      setb   stb_pin
      call   pause

o_loop:      clr   stb_pin
      call   pause
      mov   rdata, #0x42
      call   tm1638send
      call   pause
;
      call   read1638
      mov   reg0, ldata
      call   pause

      call   read1638
      mov   reg1, ldata
      call   pause

      call   read1638
      mov   reg2, ldata
      call   pause

      call   read1638
      mov   reg3, ldata
      call   pause

      setb   stb_pin
      call   memread
      jmp   o_loop

memread:   push   ACC
      push   PSW

      setb   P3.7
      mov   A, reg0
      cpl   A
      mov   P2, A
      clr   P3.4
      call   delay1s

      setb   P3.4
      mov   A, reg1
      cpl   A
      mov   P2, A
      clr   P3.5
      call   delay1s

      setb   P3.5
      mov   A, reg2
      cpl   A
      mov   P2, A
      clr   P3.6
      call   delay1s

      setb   P3.6
      mov   A, reg3
      cpl   A
      mov   P2, A
      clr   P3.7
      call   delay1s

      pop   PSW
      pop   ACC
      ret

tm1638send:   push   ACC
      push   PSW
      mov   A, rdata
      rrc   A
      mov   R7, #0x08
rdloop:      clr   clk_pin
      mov   dio_pin, C
      setb   clk_pin
      rrc   A
      djnz   R7, rdloop
      pop   PSW
      pop   ACC
      ret

read1638:   push   ACC
      push   PSW
      mov   R6, #0x08
      setb   dio_pin
      clr   clk_pin
      call   pause
nextbit:   setb   clk_pin
      mov   C, dio_pin
      clr   clk_pin
      rrc   A
      djnz   R6, nextbit
      mov   ldata, A
      pop   PSW
      pop   ACC
      ret

pause:      push   0x30
      mov    0x30, #0x11
next:      djnz    0x30, next
      pop    0x30
      ret

delay1s:   mov   0x30, #0x0A
      mov   0x31, #0x1F
      mov    0x32, #0x90
next1s:      djnz   0x32, next1s
      djnz   0x31, next1s
      djnz   0x30, next1s
      ret   
      end

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Вт сен 15, 2020 10:26:50

Когда такие вещи не работают сходу, самое лучшее средство диагностики - логический анализатор.
В работе с МК он даже нужнее, чем осциллограф.

Теоретически, если с индикацией проблем нет, значит данные отправляются правильно.
У этого МК какие-нибудь средства дебаггинга имеются?
Вообще странный выбор МК, совершенно голого, как я понял из его ДШ, и это при наличии однотактовых 8051 клонов от STC или Silabs.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Вт сен 15, 2020 11:40:01

Там сама микросхема контроллера не такая уж и простая.
Вот вариант несколько читабельного даташита:
tm1638_v1.3_en.pdf
(1.59 MiB) Скачиваний: 288

Пока с таким "чудом" в собственных конструкциях дела не имел...
8)

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Вт сен 15, 2020 12:13:02

Я имел дело с ТМ1637, да и то только с его индикацией.
Таких 4-разрядных индикаторов за пару баксов полно на ибей и али.
Кстати, подключал его тоже с 51-му в лице C8051F340, но писал на Си и к тому же там протокол обмена отличный от 1638: некое подобие извращенного I2C (присутствует start, stop, ack, но полностью отсутствует адресация слейва).
Чтение с кнопок я тоже расписал, но чисто теоретически, т.к. кнопок на индикаторе не предусмотрено, а свои припаивать было неохота.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Вт сен 15, 2020 13:48:47

подобный комплект но на чипах тм1640 16 разрядоф и 20 кенопок применяется в десятках моделей кетянски весоф на LED на 51мк с внутреней памятью исходник для них открытый есть на сайте производителя

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Ср сен 16, 2020 11:03:02

Кажись разобрался. Данные в регистрах микросхемы присутствуют только когда кнопки нажаты, они там не сохраняются. Для того чтоб вычитывать кнопки, нужно постоянно вертеться в цикле. Содержимое регистров обновляется каждый цикл динамической индикации микрухи, частота динамической индикации в районе 300-400 Гц, довольно мало времени чтоб успеть прочитать.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Вт мар 21, 2023 19:14:52

Поэтому для клавиатуры их никто не использует. А для 8-разрядной индикации гораздо удобнее MAX7219 с SPI - готовых платок на Али полно. Там легко работает аппаратный SPI.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Ср мар 22, 2023 12:21:16

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

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 07:09:40

А как вы решили этот вопрос? Мне все еще интересно, т.к эти платы никуда не делись

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 10:32:06

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

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 10:51:44

Просто тут проблема вырисовывается, что программа ничего другого не будет делать, только крутится в цикле на кнопках. Не инта, ничего.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 11:36:29

В принципе это равноценно "независимому контроллеру дисплея/клавиатуры", выполняемому на том же МК при помощи прерываний.
Вполне вписывается в ход основной программы и не мешает ее исполнению (ежли конечно там чего высокоскоростного не используется).
8)
Только тогда смысл во внешнем контроллере теряется...
:dont_know:

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 15:28:36

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

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 16:01:41

Starichok51 писал(а):прерывание от таймера обязательно должно быть, чтобы отмерять нужные интервалы времени

Можно и без прерываний. Обнуляем таймер, и через насколько операндов ( пишу на С ), приращиваем счётчики времени чего угодно на значение таймера, обнуляем последний, и до следующего захода. Это в случае если не нужна большая точность. Но для нажатия кнопок вполне покатит.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:07:11

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

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:22:24

для часоф /таймера способ не годный ибо дает погрешность но для серфинга по менюшкам и выбора режима наверно сайдет а вот кнопку пуск /стоп таймера или корекция часоф в хх часоф 00 мин и секунд надо обработать мгновено минуя эти ципки по вазможности но там и клок счета задает внешним RTC который можно и повесить часть функций

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:36:40

Да вот есть подозрение , что прерывания от таймера плохо влияют на точность показаний АЦП.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:40:24

musor, а где ты в теме увидел речь про часы? речь была только про работу с кнопками.

Добавлено after 2 minutes 18 seconds:
Alex_641, а у меня есть подозрение, что плохо понимаешь архитектуру МК.

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:50:24

Можно и без прерываний.

Можно и вообще без МК :o
В программистском форуме встечаю задачки от ленивых студентов: "Выполнить ..., не используя циклы и ветвления" и т.п.
Ну если это в учебных целях, то ещё можно как-то понять: развить у стюденей разнообразие приёмов программирования. Для конкретной же работы, считаю, лучше применять самый эффективный и экономный метод. Если прерывания, к примеру, по таймеру имеются в МК - зачем запрещать себе их использовать? Не надо их бояться.
Человек, не использующий предоставленные дивайсом возможности, напоминает мне персонажа анекдота: билет купил, но пошёл пешком за трамваем.
Насчёт точности АЦП - да, вроде есть рекомендации для уменьшения шумов на время преобразования останавливать всю периферию. Но если точность выбрана на пределе возможностей МК и только "всем молчать!" обеспечивает уменьшение шума в cамом младшем разряде - значит, неверно выбран МК и(или) обрабатывающий софт. Такое моё IMHO :(
Последний раз редактировалось Jack_A Сб мар 25, 2023 17:58:34, всего редактировалось 2 раз(а).

Re: Плата LED&KEY (TM1638). Чтение кнопок, ассемблер.

Сб мар 25, 2023 17:54:39

Хорошо старичёк ! Давай тогда расскажи как видишь ты ? Я расскажу как думаю я .
Работает программа , происходит считывание АЦП, и тут .... прерывание то таймеру ... АЦП идёт накуй , само собой , прерывание же ! Да таймеры времени правильно считают время. НО а что с прерванным АЦП происходит ? Он ( АЦП ) получает неизвестно что !?
Ответить