|
затруднение с RS485 |
|
|
|
Oct 24 2007, 04:09
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238

|
По RS485 объединены мастер и несколько слейвов (все на mega128) мастер с интервалом в 100мс шлёт команду вида: префикс ":", байт - номер команды, байт - id слейва, 2 байта - аргументы для команды, постфикс ";". 1 из слейвов должен ответить что он подключен. Вот фрагмент кода слейва (codevisionAVR): Код while (1) { delay_ms(50); command=0; number=0;
while (getchar() != ':');
command=getchar(); number=getchar();
if ((command==1)&&(number==id)) { PORTE.7=1; printf(":%d online;",id); PORTE.7=0; } // delay_ms(50);
}; } на деле отвечает только 1 раз первый запрошенный слейв. что я делаю неправильно подскажите плз поигрался интервалом отправки команд с мастера, начали отвечать несколько слейвов
|
|
|
|
|
 |
Ответов
|
Oct 24 2007, 16:22
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238

|
Пытался днём на бумаге прикинуть программу. В основном коде программы: Код while (rx_counter0==0); // ждём когда будет принят байт в буфер delay_ms(25); TCCR1B=0x05; // запускаем таймер (период 50мс) В прерывании по таймеру: Код interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (rx_counter0>0) // если буфер не пуст { while (getchar()!=':'); // считываем по байту пока не попадётся префикс ':' command=getchar(); // номер команды number=getchar(); // номер слейва if ((command==1)&&(number==number_temp)) // если была послана команда №1 для текущего слейва { PORTE.7=1; // переключаем max487 на выход delay_ms(1); printf(":%d online;",number_temp); // ответ PORTE.7=0; // переключаем max487 на вход } }
TCNT1H=0x00; // обнуляем таймер TCNT1L=0x00; // } Мастер шлёт команды всем по очереди слейвам с периодом 100мс тоже по таймеру. Идея такая: в момент включения ждём хотябы 1 байт и через 25мс (чтобы обеспечить смещение во время которого смогут быть приняты следующие команды мастера) запускаем таймер (50мс). Далее каждые 50мс: ищем в буфере префикс ":", читаем № команды и id слейва в команде и отвечаем если команда адресована данному слейву. Вот такая задумка была. На деле отвечает только слейв, которому была адресована 1я команда Завтра попробую другой подход  Пошёл читать доки
Сообщение отредактировал Athlon128 - Oct 24 2007, 16:38
|
|
|
|
|
Oct 24 2007, 16:36
|
Cундук
    
Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269

|
Цитата(Athlon128 @ Oct 24 2007, 20:22)  Пытался днём на бумаге прикинуть программу. ... Завтра попробую другой подход  Я одного не пойму. Зачем изобретать велосипед там, где это давно уже сделано? Есть хороший стандарт MODBUS. Задача проста - ознакомиться с документами и сделать так, как там написано. Все преимущества такого подхода справедливо отметил alexander55. Если нужны бОльшие скорости - для этого существует MODBUS over TCP/IP, что тоже достаточно легко реализуемо в настоящее время. В качестве бонуса - полнейшая совместимость с туевой хучей девайсов. От себя могу добавить, что изобретать что либо в области RS485-строения в настоящее время уже просто неприлично.
|
|
|
|
|
Oct 24 2007, 18:18
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Прохожий @ Oct 24 2007, 20:36)  От себя могу добавить, что изобретать что либо в области RS485-строения в настоящее время уже просто неприлично. Добавлю, что для хороших протоколов существуют картинки алгоритмов для мастера и для слэйва с указанием все возможных состояний и переходов. Без опыта лучше не изобретать. Или изобретать, только изучив подобные картинки. Цитата(DASM @ Oct 24 2007, 16:35)  RS485 вообще программный уровень не стандартизирует. А с чем доводилось работать - было либо ASCII либо и то и то вместе. А еще чаще просто текстовые строки - любят юзера, чтобы в обычной терминалке можно было бы с прибором поговорить. Хм, меня юзером назвали! Люблю в терминалке и поговорить, и послушать. А уж лог-файл вообще автоматом получается.
--------------------
Уходя, оставьте свет...
|
|
|
|
Сообщений в этой теме
Athlon128 затруднение с RS485 Oct 24 2007, 04:09 DASM Не понял - это симулятор ? А где код вкл-выключени... Oct 24 2007, 04:20 Athlon128 код вкл-выключения 485 драйвера на передачу
КодPOR... Oct 24 2007, 04:28 DASM Ничего не понял. Какого буфера переполнение ? Заче... Oct 24 2007, 04:32 Палыч ИМХО, слэйв отвечает на команду мастера не дождавш... Oct 24 2007, 04:51 alexander55 Цитата(Палыч @ Oct 24 2007, 08:51) ИМХО, ... Oct 24 2007, 05:19 Athlon128 Цитата(Палыч @ Oct 24 2007, 10:51) ИМХО, ... Oct 24 2007, 05:21  Палыч Цитата(Athlon128 @ Oct 24 2007, 09:21) Бу... Oct 24 2007, 07:54   alexander55 Цитата(Палыч @ Oct 24 2007, 11:54) В глаз... Oct 24 2007, 08:09 DASM Точно Oct 24 2007, 04:59 prm Работу слейва,как вариант, можно описать следующим... Oct 24 2007, 07:10 DASM В данном случае думаю проще Modbus ASCII использов... Oct 24 2007, 08:05 prm Либо ModBus RTU, тоже вещь очень хорошая. Я бы даж... Oct 24 2007, 08:08 DASM Modbus RTU не люблю по причине определенных сложно... Oct 24 2007, 08:13 prm Пользую ModBus RTU (вернее ModBus RTU-подобный про... Oct 24 2007, 09:22 DASM Цитатаесли данные не идут в течении определенного ... Oct 24 2007, 09:32 alexander55 Цитата(DASM @ Oct 24 2007, 13:32) А Modbu... Oct 24 2007, 10:07 defunct Цитата(DASM @ Oct 24 2007, 12:32) А Modbu... Oct 24 2007, 11:41  alexander55 Цитата(defunct @ Oct 24 2007, 15:41) Рабо... Oct 24 2007, 11:48 prm Нет, перед приемом пакета устанавливаю время, в те... Oct 24 2007, 10:41 alexander55 Цитата(prm @ Oct 24 2007, 14:41) Нет, пер... Oct 24 2007, 11:02 DASM Ну так в любом случае этот ложный таймаут может по... Oct 24 2007, 10:52 DASM Мужики, то, что ложных пакетов таким образом не на... Oct 24 2007, 11:10 alexander55 Цитата(DASM @ Oct 24 2007, 15:10) Мужики,... Oct 24 2007, 11:16 DASM Ну не знаю.. меня системы на жесткой времянке нерв... Oct 24 2007, 11:43 defunct Цитата(DASM @ Oct 24 2007, 14:43) Ну не з... Oct 24 2007, 12:01 DASM А зачем ? Если есть Wake ? Стаффинг и ноль проблем... Oct 24 2007, 12:04 defunct Цитата(DASM @ Oct 24 2007, 15:04) А зачем... Oct 24 2007, 12:15  alexander55 Цитата(defunct @ Oct 24 2007, 16:15) Приг... Oct 24 2007, 12:22 DASM RS485 вообще программный уровень не стандартизируе... Oct 24 2007, 12:35 alexander55 Цитата(DASM @ Oct 24 2007, 16:35) RS485 в... Oct 24 2007, 12:53 Athlon128 Ладно, всем спасибо, буду читать про modbus Oct 25 2007, 01:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|