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

 
 
> затруднение с 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

Сообщений в этой теме
- 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 @ Oct 24 2007, 20:22) Пы...   Oct 24 2007, 16:36
|- - Dog Pawlowa   Цитата(Прохожий @ Oct 24 2007, 20:36) От ...   Oct 24 2007, 18:18
|- - Т.Достоевский   hттp://ru.wikipedia.org/wiki/Modbus Удивительно х...   Oct 24 2007, 20:28
- - Athlon128   Ладно, всем спасибо, буду читать про modbus   Oct 25 2007, 01:01


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

 


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


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