Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Нужно передать данные из одного контроллера в другой...
Klim Дата: Вс, 12.09.2010, 18:48  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Имею PIC16F877A в количестве 6 штук. Находятся они в разных местах (5 работают с датчиками температуры (печь из 5-ти модулей), 1 осуществляет функции управления всей печью). Надо каждые 10 секунд передавать температуры (с каждого модуля) (от 20 до 600 градусов) в центральный модуль. Я уже поседел над этим. Никак не могу разобраться с этими SerIn и SerOut. Нужно получить десятичное число в переменную. Не дайте сойти с ума... Если кто сможет, напишите просто кусочек кода с передачей, скажем, числа 210 из одного контроллера в другой. С меня пиво smile
ЯНДЕКС Дата: 12.09.2010
retas Дата: Вс, 12.09.2010, 20:46  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Схожий вопрос я сдесь поднимал - мне надо было на одной плате передавать данные с
одного МК другому и сдесь мне помогали советами, но мне не хватило ума понять, потом
я смог обойтись одним МК.

ПМ, вам следует конкретизировать что именно у вас не получается - спецам будет легче
сообразить что к чему.

Klim Дата: Вс, 12.09.2010, 21:21  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Для упрощения: Есть управляющий модуль и управляемый. Соединить их в кучу нельзя по техпричинам. Управляющий модуль должен каждые 10 секунд получать значение температуры из управляемого модуля (управляемый модуль читает его с термопары и через АЦП получаем значение температуры). Эта часть проэкта реализована. Сейчас никак не могу справиться с задачей передачи 3-х значного десятичного числа из одного в другой МК. Скоро точно поседею. В кратце обьясняю, почему все нельзя сделать в одном блоке - управляющий модуль всего один, а управляемых может быть от одного до двух десятков. И они все абсолютно идентичные и выполняют одну и туже функцию. В управляющий модуль необходимо собирать инфу с управляемых. Вся инфа - это всего лишь значение температуры.
Сообщение отредактировал Klim - Вс, 12.09.2010, 21:24
Dmitry Дата: Пн, 13.09.2010, 00:17  |                                                                                                                Сообщение # 4
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Ну просто передавай переменную типа Word и все. Диапазона 0-65535 хватит?

Вот так передаешь:
SerOut Out_Pin, 396, [temperature] ' передача на 2400

а так принимаешь:
SerIn Input_Pin, 396, 100, [temperature] ' прием на 2400, ждать 100 мс

Или хочется по взрослому, пакет данных, контрольная сумма и т.п.?

P.S. А не проще было провода от термопар в один пик стянуть? Ближайший аналог 16F887 имеет 13 входов АЦП.

Сообщение отредактировал Dmitry - Пн, 13.09.2010, 02:13
Klim Дата: Пн, 13.09.2010, 09:30  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Одного провода достаточно, скажем на порту PORTC ? Стянуть все в кучу нельзя по той простой причине, что каждый блок имеет отдельную индикацию, отдельные настройки, управляет отдельными нагревательными элементами и 2-3 исполнительных устройства. Ног ни на одном проце не хватит. А теперь правильно ли я понял: Беру два проца (я так понял, что кроме переменной temperature ничего больше обьявлять не надо?), связываю их по одной ноге порта С.
На одном проце: SerOut PORTC.0, 396, [temperature]
На втором проце: SerIn PORTC.0, 396, 100, [temperature]

Пример:

Передающий проц:

temperarure var Word

loop:
temperature = 1 // для примера
SerOut Out_Pin, 396, [temperature]
DelayMs 100
goto loop

Принимающий проц:

temperature var Word

loop:
SerOut Out_Pin, 396, [temperature]
If temperature = 1 Then PORTB.0 = 1 //На порту висит светодиод, который надо зажечь
goto loop

Такая связка будет работать?
И еще вопрос, надо принимать данные из нескольких МК, как их идентифицировать?

P.S. Проверил в Протеусе, заработало. Спасибо огромное. Еще теперь остался вопрос по идентификации разных МК, т.е. как по одному проводу принимать параметры от многих МК.

Сообщение отредактировал Klim - Пн, 13.09.2010, 10:10
anatol Дата: Пн, 13.09.2010, 11:15  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

"И еще вопрос, надо принимать данные из нескольких МК, как их идентифицировать? "
Если есть "свободный порт" и все датчики типовые, то сделать кодирование с помощью разъема подключения, т.е. задать "номер" устройства и передавать данные по запросу.
При инициализации (старте) МК считывает и запоминает код, работает, "слушает" линию и если пришел запрос с его номером передает данные.
Основной МК работает или по программе или по круговому циклу. Если позволит память всё (программа датчика и основного) зашивается в типовой МК на типовой плате. Функции определяются местом установки.
DAlexV Дата: Пн, 13.09.2010, 21:35  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (Klim)
Надо каждые 10 секунд передавать температуры (с каждого модуля) (от 20 до 600 градусов) в центральный модуль.

примерно такая же тема уже поднималась раньше только она имела другое название http://www.picbasic.ru/forum/15-61-1
реализовывается либо на RS485 или CAN что бы не было конфликтов на линиях передачи, приема. Базовый модуль(Master) в заданное время отправляет запрос в линию с адресом того устройства с которого нужно получить данные. Все остальные процессоры(Slave) принимают пакет и сверяют его со своим внутренним адресом. Если совпал, то передача для него и Slave отправляет ответ, а остальные просто сбрасывают принятое как мусор. Из практики лучше всего использовать прерывания по приему из COM порта и по окончанию приема данных уже работать с полностью принятым пакетом данных.
Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Klim Дата: Вт, 14.09.2010, 09:49  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Поторопился я малость. Ничего не заработало.... Вот код:

1-й МК

Device = 16F877

temperature var Word

loop:
temperature = 1
SerOut PORTC.0, 396, [temperature]
DelayMS 500
GoTo loop

2-й МК

Device = 16F877

TRISB=%00000000
PORTB=%00000000

temperature var Word

loop:
SerOut PORTC.0, 396, [temperature]
If temperature = 1 Then PORTB.0 = 1
DelayMS 500
GoTo loop

Почему не работает, не пойму...

Прикрепления: TestData.dsn (25.5 Kb) · InData.bas (0.2 Kb) · OutData.bas (0.1 Kb)

Сообщение отредактировал Klim - Вт, 14.09.2010, 10:02
terrarus Дата: Вт, 14.09.2010, 12:24  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Тут я Вам все исправил, теперь работает. Посмотрите внимательно проги, что я туда добавил. И самое важное внимательно смотрите как нужно правильно указывать в протеусе частоты микроконтроллеров и какие файлы подключаются для каждого микроконтроллера .
Прикрепления: _____.rar (58.4 Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал terrarus - Вт, 14.09.2010, 13:18
Klim Дата: Вт, 14.09.2010, 22:18  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Действительно работает. Огромное спасибо. Теперь буду сам копать дальше по идентификации разных МК. Будете в Киеве, с меня пиво smile
Dmitry Дата: Ср, 15.09.2010, 01:50  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

А че там копать-то, передавай две переменные да и все:

SerOut PORTC.0, 396, [adress, temperature]

Правда, как правильно заметил DAlexV, возникает проблема конфликта, если два устройства будут кричать в один провод одновременно, то главный блок ниче не поймет. Нужно, чтобы он их опрашивал, т.е. он отправляет адрес, а то устройство, у кого адрес совпал, отвечает, повторив свой адрес и прибавив туда температуру. Т.е. два провода надо. А чтоб не спалить выходы процов (некорректно как-то, если два выхода начнут за один провод бороться, один ноль хочет, другой 1-цу, кто победит неизвестно), еще надо какой-нибудь драйвер RS-485 влепить к каждому процу, заодно и помехоустойчивость улучшится. В общем системка-то недетская получается...

ЯНДЕКС Дата: 15.09.2010
terrarus Дата: Ср, 15.09.2010, 11:40  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Quote (Dmitry)
еще надо какой-нибудь драйвер RS-485 влепить к каждому процу, заодно и помехоустойчивость улучшится.

Абсолютно верно! Дело в том, что если линии связи между устройствами более 5-10 метров то без RS-485 вообще не обойтись, иначе плохая помехоустойчивость сведет к нулую все ваши усилия.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Klim Дата: Ср, 15.09.2010, 22:46  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

У меня расстояния равны десяткам сантиметров. До 1 метра максимум.
Dmitry Дата: Ср, 15.09.2010, 23:38  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

На 2400 бод 20 метров витой парой тянет нормально и без драйверов. Есть у меня такая системка, рядом частотник, даллас при включении частотника дохнет в этом же кабеле, а serin/serout нет. А можно ведь и 300 бод поставить...
DNM Дата: Чт, 06.11.2014, 09:49  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 75
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2011

Статус: Offline

Совсем впал в ступор.
angry
а как быть, если скорость передачи данных ограничена 1 кб/с? То даже на Т300 не получится?

может кто посоветует?


Более подробно здесь: http://asemlab.net/
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: