Как перевести статус с 8 пинов в десятичное число?
- Войдите на сайт для отправки комментариев
Ср, 02/04/2014 - 13:42
Все добрый день. Начал немного разбираться с програмированием Ардуино. Включаю 8 релейный модуль через компьютер, то есть на каждый пин с 3 по 10 подцеплены к релейному модулю(всего 8). Включение и выключение работает.
Хочу после посылки команды с компа на реле получить ответную команду о подтверждение вкл/выкл реле. Опрашиваем 8 пинов, если реле включено, то 1, если выключена, то 0. Всего задействовано 8 ног получается 8 бит - 1 байт(в бинарном представление), надо его перевести в десятичную и послать в порт.
Помогите пожалуйста.
Состояние всех выводов одного порта можно просто считать из регистров PORTx ,где х -имя порта ,например PORTB..
Вот понятне может будет http://easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-rabota-portov-vvoda-vyvoda.html
почему это не имеет смысла? У меня так и сделано - digitalRead(relayPin[i]) - если там HIGH, то реле включено.
Да, это не 100% однозначность (0,5% что реле может быть неисправно), но лучше чем 50% (либо включено, либо нет :} )
Состояние всех выводов одного порта можно просто считать из регистров PORTx ,где х -имя порта ,например PORTB..
Вот понятне может будет http://easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-rabota-portov-vvoda-vyvoda.html
Ардуино Uno порты вроде бы не полные, чтобы разом узнать. может я чего то не понимаю.
Допустим считаю пин digitalRead(relayPin[i]) в цикле, записываю их в строку или массив, как потом привести к десятичному числу от 0 до 255.
Вот набросок, но надо проверять
А вообще, тут нужно еще нужно разобратся что за задача такая "нужно перевести в десятичное". Никаких "переводов" в десятичное - не существует. Все всегда хранится двоично. Десятично/двоично/шестнадцатерично - это только уже "для человека". "Вывести в 10-тичном виде".
А если почитать Прямое управления выходами через регистры микроконтроллера Atmega
И повести ноги (для uno/nano и т.п.) на пины с 8-го, по 13-тый, то "прочитать состояние 8-ми ног и вывести десятично в Serial" можно вообще одной строкой.
Большое спасибо, вечером попробую. Результат сообщу.
Хотя нет. 8-13 это шесть ног. Прийдется тогда два порта использовать (На PORTB PB6,PB7 - заняты под резонатор).
Тогда как-то так должно быть.
Так прочитаем ноги от D6 до D13.
Научите правильно вставлять код программы. Вот так написал. Почему то у меня изночально реле находится в состояние выключено, а показывает 11111111 (вкл.). Может я как-то покорректней написать вкл/выкл реле не через case.
Либо оно у тебя инвертированное - при отсутствии сигнала открыто, а при наличии питания закрыто.
Switch сократить можно, но тогда надо определиться с командами, которые ты будешь вводить: сейчас команда для одного реле, причём на включение и выключение раздельные. Можно упростить: повторная команда на тот же адрес (например "3") выключает реле.
Можно реализовать по другому: команда - это двузначное число: первый разряд - номер реле, второй - действие, т.е. "31" - это включить 3-е реле, "50" - это выключить 5-е реле.
Можно реализовать так, что управлять - можно сразу всеми реле через бинарную восьмизнаковую команду ("00100100" -включить 3 и 6 реле) или через десятичную команду ("70" = 01000110- включить 2, 3 и 7 реле, отсчёт справа налево).
Спасибо, оставлю пока как есть.