Нужно передать данные из одного контроллера в другой...
|
|
Klim |
Дата: Вс, 12.09.2010, 18:48 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Имею PIC16F877A в количестве 6 штук. Находятся они в разных местах (5 работают с датчиками температуры (печь из 5-ти модулей), 1 осуществляет функции управления всей печью). Надо каждые 10 секунд передавать температуры (с каждого модуля) (от 20 до 600 градусов) в центральный модуль. Я уже поседел над этим. Никак не могу разобраться с этими SerIn и SerOut. Нужно получить десятичное число в переменную. Не дайте сойти с ума... Если кто сможет, напишите просто кусочек кода с передачей, скажем, числа 210 из одного контроллера в другой. С меня пиво
|
|
|
|
retas |
Дата: Вс, 12.09.2010, 20:46 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
Схожий вопрос я сдесь поднимал - мне надо было на одной плате передавать данные с одного МК другому и сдесь мне помогали советами, но мне не хватило ума понять, потом я смог обойтись одним МК. ПМ, вам следует конкретизировать что именно у вас не получается - спецам будет легче сообразить что к чему.
|
|
|
|
Klim |
Дата: Вс, 12.09.2010, 21:21 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Для упрощения: Есть управляющий модуль и управляемый. Соединить их в кучу нельзя по техпричинам. Управляющий модуль должен каждые 10 секунд получать значение температуры из управляемого модуля (управляемый модуль читает его с термопары и через АЦП получаем значение температуры). Эта часть проэкта реализована. Сейчас никак не могу справиться с задачей передачи 3-х значного десятичного числа из одного в другой МК. Скоро точно поседею. В кратце обьясняю, почему все нельзя сделать в одном блоке - управляющий модуль всего один, а управляемых может быть от одного до двух десятков. И они все абсолютно идентичные и выполняют одну и туже функцию. В управляющий модуль необходимо собирать инфу с управляемых. Вся инфа - это всего лишь значение температуры.
Сообщение отредактировал
Klim - Вс, 12.09.2010, 21:24
|
|
|
|
Dmitry |
Дата: Пн, 13.09.2010, 00:17 | Сообщение # 4 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
"И еще вопрос, надо принимать данные из нескольких МК, как их идентифицировать? " Если есть "свободный порт" и все датчики типовые, то сделать кодирование с помощью разъема подключения, т.е. задать "номер" устройства и передавать данные по запросу. При инициализации (старте) МК считывает и запоминает код, работает, "слушает" линию и если пришел запрос с его номером передает данные. Основной МК работает или по программе или по круговому циклу. Если позволит память всё (программа датчика и основного) зашивается в типовой МК на типовой плате. Функции определяются местом установки.
|
|
|
|
DAlexV |
Дата: Пн, 13.09.2010, 21:35 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (Klim) Надо каждые 10 секунд передавать температуры (с каждого модуля) (от 20 до 600 градусов) в центральный модуль. примерно такая же тема уже поднималась раньше только она имела другое название http://www.picbasic.ru/forum/15-61-1 реализовывается либо на RS485 или CAN что бы не было конфликтов на линиях передачи, приема. Базовый модуль(Master) в заданное время отправляет запрос в линию с адресом того устройства с которого нужно получить данные. Все остальные процессоры(Slave) принимают пакет и сверяют его со своим внутренним адресом. Если совпал, то передача для него и Slave отправляет ответ, а остальные просто сбрасывают принятое как мусор. Из практики лучше всего использовать прерывания по приему из COM порта и по окончанию приема данных уже работать с полностью принятым пакетом данных. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
Klim |
Дата: Вт, 14.09.2010, 09:49 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 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 Почему не работает, не пойму...
Сообщение отредактировал
Klim - Вт, 14.09.2010, 10:02
|
|
|
|
terrarus |
Дата: Вт, 14.09.2010, 12:24 | Сообщение # 9 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Тут я Вам все исправил, теперь работает. Посмотрите внимательно проги, что я туда добавил. И самое важное внимательно смотрите как нужно правильно указывать в протеусе частоты микроконтроллеров и какие файлы подключаются для каждого микроконтроллера .
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Вт, 14.09.2010, 13:18
|
|
|
|
Klim |
Дата: Вт, 14.09.2010, 22:18 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Действительно работает. Огромное спасибо. Теперь буду сам копать дальше по идентификации разных МК. Будете в Киеве, с меня пиво
|
|
|
|
Dmitry |
Дата: Ср, 15.09.2010, 01:50 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
А че там копать-то, передавай две переменные да и все: SerOut PORTC.0, 396, [adress, temperature] Правда, как правильно заметил DAlexV, возникает проблема конфликта, если два устройства будут кричать в один провод одновременно, то главный блок ниче не поймет. Нужно, чтобы он их опрашивал, т.е. он отправляет адрес, а то устройство, у кого адрес совпал, отвечает, повторив свой адрес и прибавив туда температуру. Т.е. два провода надо. А чтоб не спалить выходы процов (некорректно как-то, если два выхода начнут за один провод бороться, один ноль хочет, другой 1-цу, кто победит неизвестно), еще надо какой-нибудь драйвер RS-485 влепить к каждому процу, заодно и помехоустойчивость улучшится. В общем системка-то недетская получается...
|
|
|
|
terrarus |
Дата: Ср, 15.09.2010, 11:40 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Quote (Dmitry) еще надо какой-нибудь драйвер RS-485 влепить к каждому процу, заодно и помехоустойчивость улучшится. Абсолютно верно! Дело в том, что если линии связи между устройствами более 5-10 метров то без RS-485 вообще не обойтись, иначе плохая помехоустойчивость сведет к нулую все ваши усилия.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Klim |
Дата: Ср, 15.09.2010, 22:46 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
У меня расстояния равны десяткам сантиметров. До 1 метра максимум.
|
|
|
|
Dmitry |
Дата: Ср, 15.09.2010, 23:38 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
На 2400 бод 20 метров витой парой тянет нормально и без драйверов. Есть у меня такая системка, рядом частотник, даллас при включении частотника дохнет в этом же кабеле, а serin/serout нет. А можно ведь и 300 бод поставить...
|
|
|
|
DNM |
Дата: Чт, 06.11.2014, 09:49 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
75
Замечания:
±
На сайте с 29.09.2011
Статус:
Offline
|
Совсем впал в ступор. а как быть, если скорость передачи данных ограничена 1 кб/с? То даже на Т300 не получится?
может кто посоветует?
Более подробно здесь: http://asemlab.net/
|
|
|
|