roboforum.ru

Технический форум по робототехнике.

 

таймеры в ардуино

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

таймеры в ардуино

Сообщение tatyana » 27 фев 2014, 13:35

Идет сообщение по интерфейсу 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); // гасим красный светодиод
}
}
}
tatyana
 
Сообщения: 1
Зарегистрирован: 27 фев 2014, 13:20

Re: таймеры в ардуино

Сообщение RootAdmin » 27 фев 2014, 23:13

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


Вернуться в Микроконтроллеры

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

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

Mail.ru counter