реклама на сайте
подробности

 
 
> затруднение с RS485
Athlon128
сообщение Oct 24 2007, 04:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 раз первый запрошенный слейв.
что я делаю неправильно подскажите плз


поигрался интервалом отправки команд с мастера, начали отвечать несколько слейвов smile.gif
Прикрепленные файлы
Прикрепленный файл  proteus_prj.rar ( 14.59 килобайт ) Кол-во скачиваний: 51
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Athlon128
сообщение Oct 24 2007, 16:22
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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я команда

Завтра попробую другой подход 05.gif
Пошёл читать доки

Сообщение отредактировал Athlon128 - Oct 24 2007, 16:38
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Oct 24 2007, 16:36
Сообщение #3


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(Athlon128 @ Oct 24 2007, 20:22) *
Пытался днём на бумаге прикинуть программу. ...

Завтра попробую другой подход 05.gif

Я одного не пойму. Зачем изобретать велосипед там, где это давно уже сделано? Есть хороший стандарт MODBUS. Задача проста - ознакомиться с документами и сделать так, как там написано. Все преимущества такого подхода справедливо отметил alexander55.
Если нужны бОльшие скорости - для этого существует MODBUS over TCP/IP, что тоже достаточно легко реализуемо в настоящее время. В качестве бонуса - полнейшая совместимость с туевой хучей девайсов.
От себя могу добавить, что изобретать что либо в области RS485-строения в настоящее время уже просто неприлично.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 24 2007, 18:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Прохожий @ Oct 24 2007, 20:36) *
От себя могу добавить, что изобретать что либо в области RS485-строения в настоящее время уже просто неприлично.

Добавлю, что для хороших протоколов существуют картинки алгоритмов для мастера и для слэйва с указанием все возможных состояний и переходов.
Без опыта лучше не изобретать. Или изобретать, только изучив подобные картинки.


Цитата(DASM @ Oct 24 2007, 16:35) *
RS485 вообще программный уровень не стандартизирует. А с чем доводилось работать - было либо ASCII либо и то и то вместе. А еще чаще просто текстовые строки - любят юзера, чтобы в обычной терминалке можно было бы с прибором поговорить.

Хм, меня юзером назвали! smile.gif
Люблю в терминалке и поговорить, и послушать. А уж лог-файл вообще автоматом получается.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
fmdost
сообщение Oct 24 2007, 20:28
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



hттp://ru.wikipedia.org/wiki/Modbus

Удивительно хорошая статья на русском!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 10:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016