PIC 16f627, использующий контакт для входа и выхода - PullRequest
2 голосов
/ 26 февраля 2011

Я пытаюсь соединить две микросхемы PIC 16f627 (запрограммированные с помощью PICC-Lite) с одним выводом ввода / вывода (RA2, который изменяет направление в известных точках) и выводом CLK, который приводится в действие одним из чипов.

Первоначально я его настроил, поэтому там был хозяин и раб. Мастер записывает 8-битную команду, биты TRIS входов / выходов переворачиваются, а подчиненный отвечает 16-битным ответом.

Я поместил (временные, большие) задержки, чтобы гарантировать отсутствие проблем с синхронизацией.

Запись / чтение команды работает нормально, и оба конца переворачиваются (TRISA). Однако в этот момент, когда мастер должен считывать данные с булавки, на которую он был записан ранее, он всегда читает 0, даже если физически булавка имеет значение 1!

Насколько я могу судить, TRISA настроено правильно (= установлено для бита, если он введен), как и CMCON (= 7), и я считаю словом CONFIG; это одинаково для обоих чипов (ну, инвертированных), и вход работает на ведомом устройстве ... Я также пытался убедиться, что TRISA никогда не равняется 0 для обоих чипов одновременно.

Что я пробовал: - Изменение ведомого устройства таким образом, чтобы вместо попыток отправить данные обратно, оно просто переключало значение своего выходного контакта с большими интервалами. Это видно по выходному проводу, но не по значению входного контакта. - Просто передать состояние от входного контакта к другому выходному контакту (выход остается нулевым; фиктивное размещение показало, что общий вывод на этом контакте работает) - Запись значений PORTA и TRISA на ЖК-дисплей - TRISA верна, но PORTA равна 0 (даже если провод к контакту высокий) - Подключение линии ввода / вывода к светодиоду показывает, что она меняется, но входное значение на порту не - Подключение вольтметра показывает подходящее напряжение (равное V +) - Я пытался заменить Мастера на замену (он полагал, что мог получить физический урон), хотя это не имело значения - Я читал, что это может быть проблема «чтения-изменения-записи», но я не мог найти совета, чтобы убедиться, что это не так на Pic16s ... (нет портов LAT AFAIK?)

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

Ответы [ 2 ]

0 голосов
/ 13 января 2014

Исходное сообщение устарело, но если у кого-то еще есть эта проблема, вы можете опубликовать свой код.Не говорю, что он / она сделал, но оригинальный плакат мог читать фиксированное значение пина вместо значения порта.То есть чтение того, что было написано последним, а не того, какое напряжение фактически было получено на выводе.

Поддерживать правильную синхронизацию между двумя процессорами тем труднее, чем дольше время между командой и ответом.Почему бы не реализовать протокол, в котором ведущий и ведомый работают над каждым битом.Это приведет к тому, что синхронизация произойдет в 24 раза быстрее, чем предложенная схема OP.

Вот что я вижу: мастер синхронизирует 8-битную команду, используя вывод с открытым стоком (я думаю, что A4 в этом случае) связанвысоко через резистор.Но затем мастер продолжает отсчитывать 16 нулей.О, забыл упомянуть, что 1 - это более длинный, чем тристатный (или hi, так как мы связаны через резистор), а 0 - более короткий, чем тристатный (или hi, так как мы связаны через hi через резистор).Ведомый на другом конце получил 8-битную команду и не наблюдает за 16 нулями.Теперь, каждый раз, когда мастер опускает линию, ведомый ничего не будет делать, если ответ от ведомого устройства равен нулю в этой позиции бита.Однако, если ответ равен 1, ведомый также будет передавать lo в течение более длительного времени, чем ведущий.Поскольку ведущий и ведомый являются выходом с открытым стоком, а электрическая нота, созданная путем соединения этих двух контактов, связана через резистор, проблем нет.Сигнал будет выглядеть как обычный 1. И это то, что подумает мастер программного обеспечения.То есть, пока мастер синхронизирует 16 нулей, мастер считывает значение порта для нулей и для единиц.Все зависит от того, останется ли раб вне дома, потому что он хочет, чтобы мастер думал ноль, если раб будет прыгать и дольше удерживать линию, заставляя мастера думать, ах, это единица.

0 голосов
/ 06 июля 2011

Если у вас есть только два вывода ввода / вывода и вы планируете добавить больше подчиненных устройств в будущем, я бы рекомендовал использовать стандартный протокол вместо создания собственного. I2C будет работать хорошо, но вам нужно будет переключиться на устройство с модулем MSSP.

...