[DUVIDA][comunicação i2c] quando slave é desligado, master para de processar, is

Olá Pessoal,

Tava olhando o forum e vi um post do nosso amigo zé gustavo sobre comunicação i2c, dai resolvi fazer uns testes.

Aproveitando os exemplos da biblioteca WIRE do proprio arduino, gravei o sketch master_write em um arduino mega, e o sketch slave_receiver em um arduino UNO.

Teste 1 - normal - liguei os dois com os cabos corretos e liguei o monitor serial no UNO, tudo lindo, comunicação perfeita.

Teste 2- Acrescentei um detalhe no codigo do mega, acrescentei no master_write que toda vez que ele transmitisse um led deveria acender e piscar.

Resultado - Tudo lindo: cada vez que aparece um resultado no receiver que [e o arduino UNO, o led do arduino mega pisca, indicando funcionamento.

Tá aqui o codigo:

// Wire Master Writer
// by Nicholas Zambetti a href="http://www.zambetti.com>">http://www.zambetti.com>;

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.

int led = A7;

#include <Wire.h>

void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
pinMode(led, OUTPUT); 
}

byte x = 0;

void loop(){
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)

Wire.beginTransmission(4); // transmit to device #4
Wire.write("x is "); // sends five bytes
Wire.write(x); // sends one byte 
Wire.endTransmission(); // stop transmitting

x++;
delay(500);
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(500); 
}

Teste 3 - Eu simplesmente desliguei o arduino UNO ou seja o slave_receiver, - RESULTADO: o Arduino mega deixou de funcionar e processar, ou seja, quando se desliga o slave o master simplesmente para.

A DUVIDA: ISSO É NORMAL ??????????

Quer dizer, você criar uma aplicação onde um nucleo master se comunica com algum periferico, e se esse for desplugado o master para de funcionar???? e todo o restante do processamento? e se a comunicação for só pra uma funcao de visualização e o importante mesmo for o processamento no nucleo master, então tudo sera travado se um slave cair ????

Não conheço profundamente essas funções, mas ao que tudo indica, uma delas está a bloquear quando o slave não responde.
Deveria, em primeiro lugar tentar determinar qual das 3 funções é que está a provocar a paragem. Pode escrever qualquer coisa para o serial monitor após a conclusão de cada uma das funções. Por exemplo:

(...)
void loop(){
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)

Wire.beginTransmission(4); // transmit to device #4
Serial.println("beginTransmission");   
Wire.write("x is "); // sends five bytes
Serial.println("write(1)");   
Wire.write(x); // sends one byte
Serial.println("write(2)");   
Wire.endTransmission(); // stop transmitting
Serial.println("endTransmission");   

x++;
delay(500);
(...)

(se por algum motivo não conseguir usar a porta série, pode usar o LED para fornecer a mesma informação)

Após concluir qual dos passos está a bloquear a execução do programa, poderá procurar no código da biblioteca a razão pela qual a função bloqueia quando o slave não existe (ou não responde).
Uma coisa é certa. Já trabalhei alguma coisa com o barramento I2C em outras plataformas e posso assegurar que isso não é uma característica do barramento, mas sim da biblioteca que o Arduino usa para controlar esse barramento.

Alguém já reparou nisso...

http://playground.arduino.cc/Main/WireLibraryDetailedReference