UART или нет?

junior_developer
Offline
Зарегистрирован: 27.11.2017
Панель с клавиатурой и контактами RX,TX - скорее всего UART интерфейсом. Нажатия почти всех кнопок отправляют на выход TX правильный фрейм! Кроме кнопки со звездочкой! Она выдает очень-очень короткий отрицательный импульс 1 микросекунду (или меньше)! Могу предположить, что это скорее всего сигнал сброса!
 
Насколько мне известно,  через UART данные передаются только пакетами! Стартовый бит, биты данных, бит четности (если есть) и стоповый бит или биты. 
Если это обычный UART, то каким образом посылается этот короткий сигнал? В UART ведь нет такой команды! Верно?
И ещё вопрос, как можно его обработать?
Если я например хочу подключить к панельке дисплей, чтобы на него выводились символы всех клавиш и "*" в том числе. Посоветуйте пожалуйста, что делать?
 
Если бы не было этого очень короткого сигнала,я бы просто, 
if (Serial.available() > 0)  // проверил, есть ли данные
incomingByte = Serial.read(); //и считал пришедший байт в переменную

 

rkit
Offline
Зарегистрирован: 23.11.2016

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Можно запаралелить выход с клавиатуры на свободный  пин и отлавливать импульс "звездочки" там

junior_developer
Offline
Зарегистрирован: 27.11.2017

Спасибо за идею! Насколько я понимаю, этот pin должен реагировать на прерывание по спаду импульса. И тут же запускаться таймер.
То есть алгоритм такой:
1. Проверка с помощью прерывания, не стал ли уровень на входе pin низким
2. Если стал... то запустить таймер
3. Проверить, прошла ли одна микросекунда
4. Если прошла... то
5. Проверить логический уровень на входе Pin
6. Если уровень высокий, то ... это был импульс подходящей длины, и функция проверки возвращает 1, 
если же уровень ещё низкий, то это начало стартового бита UART, поэтому вернуть из функции 0.

А дальше уже возвращенное функцией значение можно присвоить какой-то переменной, и в зависимости от неё выводить на дисплей символ "*"! Правильно ли я рассуждаю?

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

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

junior_developer
Offline
Зарегистрирован: 27.11.2017

'Это короткий сигнал при нажатии "*"! 
 

Это при нажатии цифры "0"!

Цифры "2"

Цифры "5"

Как видите, всё вроде бы логично! Клеточка по горизонтали это примерно 1 бит! Самый-самый первый бит стартовый! Биты данных ( я не знаю, как правильно их считать с нуля или единицы) тоже выглядят логично. Чтобы получить число 5 нужно к 1 прибавить 4.  И как видите, биты имеющие разрядность 1 и 4 подняты, а остальные опущены! 

rkit
Offline
Зарегистрирован: 23.11.2016

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

junior_developer
Offline
Зарегистрирован: 27.11.2017

Клавиша "*" используется для отмены неправильно введенных данных! На табличке панели написано "При ошибке нажмите * и повторите набор"!  

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

junior_developer пишет:

Клавиша "*" используется для отмены неправильно введенных данных! На табличке панели написано "При ошибке нажмите * и повторите набор"!  

Cудя по осцилограмме действительно похоже на ресет.  А других выходов нет? И зачем нужен RX?

junior_developer
Offline
Зарегистрирован: 27.11.2017

для приема данных с блока управления домофона. Панель вызова не только посылает данные, но и принимает! То есть, насколько я понял, они могут полноценно "общаться" между собой!

Мне интересно, получится ли добавить к панели простенький дисплей, чтобы на нем хорошо были видны символы нажатых клавиш. Как вариант рассматриваю матрицу на базе MAX7219. Но к сожалению в электронике почти не разбираюсь!