roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 09:19

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: таймеры в ардуино
СообщениеДобавлено: 27 фев 2014, 13:35 
Не в сети

Зарегистрирован: 27 фев 2014, 13:20
Сообщения: 1
Идет сообщение по интерфейсу I2C. Имеется 1 MASTER (М) и 2 SLAVEа (S1, S2). М делает запрос к S1 и S2 по порядку, получает ответ и в зависимости от их состояния совершает определенные действия. Загвоздка в том, что в момент отправки запроса мастером, слейв может отключиться (по некоторым обстоятельствам), т.е. мастер ждет ответа, но ответ не приходит, и он зависает. Вопрос в следующем: можно ли каким-то образом, перед тем как делать запрос к слэйву, включить таймер на время равное максимальному времени прохождения функции по опросу состояния S1, по истечении которого программа продолжалась с проверки S2 (в случае зависания). И остановить таймер при нормальной работе после выполнения мастером действия, соответствующего ответу опрошенного слэйва.

Код:
#include <Wire.h>

// ----------------НАЗНАЧЕНИЕ ВЫВОДОВ-------------------------------

int led_fail_1=3; // красный светодиод стенда 1
int led_ok_1=8; // зеленый светодиод стенда 1
int led_fail_2=9; // красный светодиод стенда 2
int led_ok_2=10; // зеленый светодиод стенда 2
int st_1=4; // работает стенд 1
int st_2=5; // работает стенд 2
int TWI_adr_1=3; // адрес опрашиваемого устройства 1
int TWI_adr_2=3; // адрес опрашиваемого устройства 2
char now_status;

void setup()
{
// -----------------НАСТРОЙКА ВЫВОДОВ-----------------------------
pinMode(led_fail_1, OUTPUT);
digitalWrite(led_fail_1, LOW);
pinMode(led_ok_1, OUTPUT);
digitalWrite(led_ok_1, LOW);
pinMode(led_fail_2, OUTPUT);
digitalWrite(led_fail_2, LOW);
pinMode(led_ok_2, OUTPUT);
digitalWrite(led_ok_2, LOW);
pinMode(st_1, INPUT_PULLUP);
pinMode(st_2, INPUT_PULLUP);

Wire.begin(); // подключаемся по I2C к ведомому устройству
Serial.begin(9600); // start serial for output
}

void loop()
{
// ----------------------ОПРОС ПЕРВОГО СТЕНДА---------------------------------------------
{
if (digitalRead(st_1)==LOW) // если стенд 1 включен
{
Wire.requestFrom(3, 1); // request 1 bytes from slave device #3
while(Wire.available()) // slave may send less than requested
{
char now_status = Wire.read(); // receive a byte as character
switch(now_status)
{
case 0: // если статус ОК
digitalWrite(led_fail_1,LOW); // гасим красный светодиод
digitalWrite(led_ok_1,HIGH); // зажигаем зеленый светодиод
break;
case 1: // если СДУ<<
digitalWrite(led_ok_1,LOW);
digitalWrite(led_fail_1,HIGH);
delay(250);
digitalWrite(led_fail_1,LOW);
delay(250); // мигаем красным светодиодом
break;
case 2: // если СДУ>>
digitalWrite(led_ok_1,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_1,HIGH);
delay(250);
digitalWrite(led_fail_1,LOW);
delay(250); // мигаем красным светодиодом
break;
case 3: // ошибка
digitalWrite(led_ok_1,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_1,HIGH); // зажигаем красный светодиод
break;
}
}
}
else {
digitalWrite(led_ok_1,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_1,LOW); // гасим красный светодиод
}
}

// ----------------------ОПРОС ВТОРОГО СТЕНДА---------------------------------------------
{
if (digitalRead(st_2)==LOW) // если стенд 1 включен
{
Wire.requestFrom(3, 1); // request 1 bytes from slave device #3
while(Wire.available()) // slave may send less than requested
{
char now_status = Wire.read(); // receive a byte as character
switch(now_status)
{
case 0: // если статус ОК
digitalWrite(led_fail_2,LOW); // гасим красный светодиод
digitalWrite(led_ok_2,HIGH); // зажигаем зеленый светодиод
break;
case 1: // если СДУ<<
digitalWrite(led_ok_2,LOW);
digitalWrite(led_fail_2,HIGH);
delay(250);
digitalWrite(led_fail_2,LOW);
delay(250); // мигаем красным светодиодом
break;
case 2: // если СДУ>>
digitalWrite(led_ok_2,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_2,HIGH);
delay(250);
digitalWrite(led_fail_2,LOW);
delay(250); // мигаем красным светодиодом
break;
case 3: // ошибка
digitalWrite(led_ok_2,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_2,HIGH); // зажигаем красный светодиод
break;
}
}
}
else {
digitalWrite(led_ok_2,LOW); // гасим зеленый светодиод
digitalWrite(led_fail_2,LOW); // гасим красный светодиод
}
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: таймеры в ардуино
СообщениеДобавлено: 27 фев 2014, 23:13 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
С библиотекой дефолтной - ЕМНИП нет. Жаже ели вызывать проверки из обраотика таймера. Надо самосоотельно реализовать протокол, предусмотрев в нем в циклах хадержки проверку максимального количества выполнений.

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO