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

 
 
> затруднение с 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
Ответов
prm
сообщение Oct 24 2007, 07:10
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 4-04-07
Пользователь №: 26 760



Работу слейва,как вариант, можно описать следующим образом. Будем считать пакет принятым, если после приема последнего байта пакета истекла пауза равная времени передачи трех байтов, в течение которой не было принято ни одного байта. Если же во время паузы принимаем байт, то считаем его последним и вновь отслеживаем истечение паузы. И так далее пока пауза не истечет и пакет не будет принят. Отслеживанием паузы занимается таймер, в прерывании которого просто устанавливаем какой-либо флаг. К примеру:

//-------------------------------------------------------------------------------------------
unsigned char Read_USART(unsigned char kol) // kol - число байт, которое хотим принять
{
unsigned char i;

for(i=0;i<kol;i++)
{
TimerFlag0=0; //очищаем флаг срабатывания таймера

TCNT0=0xC8; //значение, соответсвующее паузе ~1.75мс
TCCR0=0x04; //запускаем таймер
//ожидаем приема байта
while (!(UCSRA & (1<<RXC)))
{
if(TimerFlag0) //проверка, время ожидания истекло
{
//возвращаем число реально принятых байт
return i;
}
//сбрасываем сторожевой таймер
WDR();
}
//считываем байт
buf[i]=UDR;
TCCR0=0x00;
}
return i;
}

//---------------------------------------------------------------------------------------
//Прерывание от таймера 0, свидетельствует о превышении интервала ожидания для приема байта

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCCR0=0x00; //останавливаем таймер
TimerFlag0=1; //устанавливаем флаг срабатывания
}

В основной программе:
//принимаем пакет
k=Read_USART(IN_BUF_LEN);
//анализируем его
error = AnalizeBuf(k);

smile.gif
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
- - 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, 16:22
|- - Прохожий   Цитата(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 Текстовая версия Сейчас: 30th July 2025 - 14:51
Рейтинг@Mail.ru


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