Зарегистрирован: Чт май 28, 2020 15:42:37 Сообщений: 2
Рейтинг сообщения:0
Есть такая плата. Решил с ней разобраться. Плату подключил к микроконтроллеру 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
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
Когда такие вещи не работают сходу, самое лучшее средство диагностики - логический анализатор. В работе с МК он даже нужнее, чем осциллограф.
Теоретически, если с индикацией проблем нет, значит данные отправляются правильно. У этого МК какие-нибудь средства дебаггинга имеются? Вообще странный выбор МК, совершенно голого, как я понял из его ДШ, и это при наличии однотактовых 8051 клонов от STC или Silabs.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Я имел дело с ТМ1637, да и то только с его индикацией. Таких 4-разрядных индикаторов за пару баксов полно на ибей и али. Кстати, подключал его тоже с 51-му в лице C8051F340, но писал на Си и к тому же там протокол обмена отличный от 1638: некое подобие извращенного I2C (присутствует start, stop, ack, но полностью отсутствует адресация слейва). Чтение с кнопок я тоже расписал, но чисто теоретически, т.к. кнопок на индикаторе не предусмотрено, а свои припаивать было неохота.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
подобный комплект но на чипах тм1640 16 разрядоф и 20 кенопок применяется в десятках моделей кетянски весоф на LED на 51мк с внутреней памятью исходник для них открытый есть на сайте производителя
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Зарегистрирован: Чт май 28, 2020 15:42:37 Сообщений: 2
Рейтинг сообщения:1
Кажись разобрался. Данные в регистрах микросхемы присутствуют только когда кнопки нажаты, они там не сохраняются. Для того чтоб вычитывать кнопки, нужно постоянно вертеться в цикле. Содержимое регистров обновляется каждый цикл динамической индикации микрухи, частота динамической индикации в районе 300-400 Гц, довольно мало времени чтоб успеть прочитать.
Поэтому для клавиатуры их никто не использует. А для 8-разрядной индикации гораздо удобнее MAX7219 с SPI - готовых платок на Али полно. Там легко работает аппаратный SPI.
прекрасно работает чтение кнопок, и спешить никуда не надо. совершенно по фигу, как часто обновляются регистры кнопок. если кнопка нажата, то и чтение покажет, что она нажата.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
а никак специально не решал - просто делаю чтение, когда нужно проверить кнопки. а периодичность запуска чтения прямо связана со скоростью реакции человека. чаще, чем способен человек нажимать кнопки, опрашивать нет смысла. я думаю, достаточно опрашивать кнопки 10-20 раз в секунду. если кнопка нажата, то при следующих опросах нужно сначала определить отпускание этой же кнопки, а уже потом проверять нажатие следующей (или этой же) кнопки. то есть, с чтением (опросом) проблем нет, а дальнейшую логику работы с кнопками каждый определяет сам.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
В принципе это равноценно "независимому контроллеру дисплея/клавиатуры", выполняемому на том же МК при помощи прерываний. Вполне вписывается в ход основной программы и не мешает ее исполнению (ежли конечно там чего высокоскоростного не используется).
Только тогда смысл во внешнем контроллере теряется...
Shuspano, я же сказал, что проверять кнопки нужно 10 раз в секунду. а внутри интервала 100 мс программа будет делать всё, что тебе угодно. а прерывание от таймера обязательно должно быть, чтобы отмерять нужные интервалы времени. в том числе и интервал 100 мс для опроса кнопок.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
прерывание от таймера обязательно должно быть, чтобы отмерять нужные интервалы времени
Можно и без прерываний. Обнуляем таймер, и через насколько операндов ( пишу на С ), приращиваем счётчики времени чего угодно на значение таймера, обнуляем последний, и до следующего захода. Это в случае если не нужна большая точность. Но для нажатия кнопок вполне покатит.
_________________ Не спрашивай по ком звонит колокол, он звонит по тебе !
для часоф /таймера способ не годный ибо дает погрешность но для серфинга по менюшкам и выбора режима наверно сайдет а вот кнопку пуск /стоп таймера или корекция часоф в хх часоф 00 мин и секунд надо обработать мгновено минуя эти ципки по вазможности но там и клок счета задает внешним RTC который можно и повесить часть функций
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Можно и вообще без МК В программистском форуме встечаю задачки от ленивых студентов: "Выполнить ..., не используя циклы и ветвления" и т.п. Ну если это в учебных целях, то ещё можно как-то понять: развить у стюденей разнообразие приёмов программирования. Для конкретной же работы, считаю, лучше применять самый эффективный и экономный метод. Если прерывания, к примеру, по таймеру имеются в МК - зачем запрещать себе их использовать? Не надо их бояться. Человек, не использующий предоставленные дивайсом возможности, напоминает мне персонажа анекдота: билет купил, но пошёл пешком за трамваем. Насчёт точности АЦП - да, вроде есть рекомендации для уменьшения шумов на время преобразования останавливать всю периферию. Но если точность выбрана на пределе возможностей МК и только "всем молчать!" обеспечивает уменьшение шума в cамом младшем разряде - значит, неверно выбран МК и(или) обрабатывающий софт. Такое моё IMHO
_________________
Последний раз редактировалось Jack_A Сб мар 25, 2023 17:58:34, всего редактировалось 2 раз(а).
Хорошо старичёк ! Давай тогда расскажи как видишь ты ? Я расскажу как думаю я . Работает программа , происходит считывание АЦП, и тут .... прерывание то таймеру ... АЦП идёт накуй , само собой , прерывание же ! Да таймеры времени правильно считают время. НО а что с прерванным АЦП происходит ? Он ( АЦП ) получает неизвестно что !?
_________________ Не спрашивай по ком звонит колокол, он звонит по тебе !
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения