Перейти к содержанию

    

3 PICа по RS485

Всем здравствуйте!

Недавно начал разбираться с МК , точнее с их передачей данных на другие МК, остановился на USART, такой вопрос:

Мне нужно обмениваться данными между 3 МК, но мне не понятно, допустим 1 передает, а 2 других принимают, как передатчик понимает, что приемник готов принять данные?

Вдруг случится так, что в регистр передатчика я уже записал какие либо данные, а другие МК еще не успели включиться на прием(МК включился с задержкой), как это решается?

Будет ли передатчик ждать появления приемника и как он это поймет?

Не могли бы направить в какую сторону мне рыть по правильному алгоритму обмена.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти проблемы решаются протоколом.

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

 

Допустим устройство 2 должно переслать пакет устройству 3. Мастер устройство 1 посылает команду устройству 2. Устройство 2 после обработки команды переключается на передачу и передает требуемый пакет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Эти проблемы решаются протоколом.

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

 

Допустим устройство 2 должно переслать пакет устройству 3. Мастер устройство 1 посылает команду устройству 2. Устройство 2 после обработки команды переключается на передачу и передает требуемый пакет.

 

Понятно. А вот если я записал в регистр передатчика 1 байт и продолжаю выполнять свою программу дальше, судя из описания на микроконтроллер передача начнется немедленно, а что если в тот момент когда я записывал на микроконтроллере приемнике еще даже питания нету или его код еще не дошел до строчки включения приемника uart , будет ли передатчик ждать подключения приемника или этот байт просто пропадет куда то? Как происходит эта синхронизация?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы сейчас говорите о контроле потока. Существуют разные методы контроля: программные (например XON XOFF) и аппаратные (например CTS/RTS в RS-232), в которых сигналы готов/занят передаются по отдельным проводам. В случае простого полудуплексного RS-485 никто конечно же никого ждать не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вы сейчас говорите о контроле потока. Существуют разные методы контроля: программные (например XON XOFF) и аппаратные (например CTS/RTS в RS-232), в которых сигналы готов/занят передаются по отдельным проводам. В случае простого полудуплексного RS-485 никто конечно же никого ждать не будет.

Вот это я и хотел узнать... Спасибо

Изменено пользователем Артемko

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз здравствуйте!

Появился у меня тут новый вопрос. Вот к примеру есть приемник и передатчик UART, идет передача- всё нормально, передача заканчивается- и тут приемник должен освободить буфер для приема новых данных, мы копируем содержимое буфера в какую либо переменную и буфер пуст. На это ушло у нас допустим 10 тактов. А передатчик тем самым временем готовит новую партию данных сразу после отправки и допустим он эти данные закинул за 8 тактов, это получается буфер приемника еще не готов и произойдет рассинхронизация? Что делать в этом случае, добавлять задержку перед посылкой очередного байта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ждать не нужно.

В приемнике УАРТа есть сдвиговый регистр, который принимает байт и есть регистр приемника, из которого вы читаете байт, когда он весь принят и переписан УАРТом в регистр приемника. Прерывание возникает когда принятый байт уже в регистре приемника и сдвиговый регистр пустой и готов принимать следующий байт. У вас есть время в один байт, чтобы прочесть принятый байт, иначе возникнет ошибка Overrun.

В ПИКах кроме того есть фифо на прием, от одного до четырех байт.

 

 

А вообще, вам лучше скачать с сайта Микрочипа примеры и в них поразбираться, сразу большая часть вопросов отпадет :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ждать не нужно.

В приемнике УАРТа есть сдвиговый регистр, который принимает байт и есть регистр приемника, из которого вы читаете байт, когда он весь принят и переписан УАРТом в регистр приемника. Прерывание возникает когда принятый байт уже в регистре приемника и сдвиговый регистр пустой и готов принимать следующий байт. У вас есть время в один байт, чтобы прочесть принятый байт, иначе возникнет ошибка Overrun.

В ПИКах кроме того есть фифо на прием, от одного до четырех байт.

 

 

А вообще, вам лучше скачать с сайта Микрочипа примеры и в них поразбираться, сразу большая часть вопросов отпадет :)

 

Спасибо, да байта для чтения вполне должно быть достаточно... А на сайте микрочипа на оффициальном?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

возьмите к примеру проект бутлоадера на уарт. там сразу и рабочий протокол будет.

 

например мастер посылает пакет, заканчивающийся контрольной суммой

ведомый отвечает <ок> если пакет принят.

 

http://ww1.microchip.com/downloads/en/AppNotes/01310a.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А на сайте микрочипа на оффициальном?

Конечно. Документацию лучше читать в оригинале, меньше ошибок :)

 

возьмите к примеру проект бутлоадера на уарт. там сразу и рабочий протокол будет.

Думаю, для начинающего тяжеловато будет, там описание краткое и картинок нет :rolleyes:

 

Какое у вас семейство ПИКов?

Вот для 8-битных можете посмотреть:

Asynchronous Communications with the PICmicro® USART

Там и описание и код есть.

 

з.ы. глянул код, он там на асме. Да, старая Апликуха. Ну хоть почитайте описание. И поищите что-нибудь новее.

Хотя знание ассемблера никогда не повредит, хотя сейчас программировать нужно на Си, время ускоряется... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Конечно. Документацию лучше читать в оригинале, меньше ошибок :)

 

 

Думаю, для начинающего тяжеловато будет, там описание краткое и картинок нет :rolleyes:

 

Какое у вас семейство ПИКов?

Вот для 8-битных можете посмотреть:

Asynchronous Communications with the PICmicro® USART

Там и описание и код есть.

 

з.ы. глянул код, он там на асме. Да, старая Апликуха. Ну хоть почитайте описание. И поищите что-нибудь новее.

Хотя знание ассемблера никогда не повредит, хотя сейчас программировать нужно на Си, время ускоряется... :)

 

У меня пики 8 битные, pic18. Ассемблер я знаю, но давно им не пользовался и еще сейчас с ним разбираться не очень хочется, понадобится много времени на продумывание кода... Спасибо. в принципе мне бы алгоритм, а как написать я разберусь. Пишу всё дело в МИКРОС , там есть встроенная библиотека, но там тупо передача и прием, а мне нужно, чтоб еще адрес распознавался, 9 бит... Спасибо, читаю мануал, там вроде есть, как делается, буду пробывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда взялось это идиотское "пробЫвать" у каждого третьего? Вы, что, в школах не учились? Задрали уже!

Предлагаю банить на день за такое написание. Включая модераторов (есть).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Предлагаю банить на день за такое написание.

к вашэму нещастью это не форум грамарнацы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация