Пытался днём на бумаге прикинуть программу.
В основном коде программы:
Код
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