|Timeout não zera dentro da interrupção

Estou fazendo um codigo para transferencia de dados entre 2 Arduinos usando a biblioteca EasyTransfer por interrupção na Serial1 do Leonardo Beetle. Está fucionando OK com codigo abaixo. Mas quero colocar o envio de dados pelo ETout.sendData para ser executado logo apos o recebimento de dados dentro da interrupção. Porém se desabilitar a função que está dentro do loop() o contador timeout não zera quando ocorre a interrupção. Consigo confirmar que a interrupção ocorre porque os dados do outro Arduino são recebidos corretamente e o print "updated" funciona. O que pode estar ocorrendo ?

#include <EasyTransfer.h>

struct RECEIVE_DATA_STRUCTURE {
  // Coloque suas definições de variáveis aqui para os dados que deseja receber
  // ISSO DEVE SER EXATAMENTE IGUAL NO OUTRO ARDUINO
  unsigned int data1rx;
  long data2rx;
};

struct SEND_DATA_STRUCTURE {
  // Coloque suas definições de variáveis aqui para os dados que deseja enviar
  // ISSO DEVE SER EXATAMENTE IGUAL NO OUTRO ARDUINO
  float data1tx;
  unsigned int data2tx;
  char message[50]; // container de string
};

// Inicializar as instâncias EasyTransfer
EasyTransfer ETin, ETout;

// Dar um nome ao grupo de dados
RECEIVE_DATA_STRUCTURE rxdata;
SEND_DATA_STRUCTURE txdata;

volatile bool newDataReceived = false;
String message;
unsigned int timeout;

void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);// comunicação externa

  while (!Serial) ; // necessario se quiser imprimir desde o setup 32u4
  Serial.println ("///////////////////////////////////////////////////////////");
  Serial.println (F("Software: ACEasyTransferInterrupt "));
  Serial.println (F("Hardware: Arduino B  "));
  Serial.println (F("programado por ACJacques"));
  Serial.println (F("Obs."));
  const char compile_date[] = __DATE__ " " __TIME__;
  Serial.print   (F("Compilado em "));
  Serial.println (compile_date);
  Serial.println( F(__FILE__));
  Serial.print(F( "Arduino IDE version: ")); Serial.println( ARDUINO, DEC);
  Serial.println ("///////////////////////////////////////////////////////////");
  delay (3000); // tempo para exibir
  ETin.begin(details(rxdata), &Serial1);
  ETout.begin(details(txdata), &Serial1);
  pinMode(13, OUTPUT); //LED
  attachInterrupt(digitalPinToInterrupt(0), receiveInterrupt, CHANGE); // Use o pino que desejar
}
///////////////////////////////////////
void receiveInterrupt() {
   if (ETin.receiveData()) {
    Serial.println("updated");
    timeout = 0;
    //ETout.sendData();
  }
}
//////////////////////////////////////
void loop() {

  //       Serial.print("RX1: ");
  //       Serial.println(rxdata.data1rx);
  //       Serial.print("RX2: ");
  //       Serial.println(rxdata.data2rx);

  digitalWrite(13, !digitalRead(13));//   LED BLINK

  // Defina os valores das variáveis
  txdata.data1tx = 123.0874;
  txdata.data2tx = 556;
  message = "teste"; //
  strcpy(txdata.message, message.c_str()); //container para a string
  Serial.println(timeout);
  // Envie os dados pela porta Serial1
  ETout.sendData();
  // Aguarde um curto período de tempo
  delay(70);
  timeout++;
}

Talvez porque estás a assumir imenso acerca de como as funções estão a ser chamadas?

Quando dizes que não zera, significa que não vês um zero ou que continua sempre a somar sem interrupção? Do género ir em 300 e veres um updated e o próximo número é 301? Ou aparece a interrupção e mostra um 1?

Se a interrupção ocorrer entre o print do timeout e o timeout++, nunca irás ver um zero como o valor do timeout... e como tens esse delay(70) a realidade é que o teu código passa a maior parte do tempo aí parado. Logo é improvável que alguma vez vejas a variável timeout enviar um zero, pode acontecer, mas é extremamente improvável e podes até calcular a probabilidade medindo os tempos entre essas instruções pelos dois sentidos.

Consegues perceber o que disse?

Se quiseres evitar isto, tens de "sincronizar" as duas funções. Faz assim:

//dentro da inetrrupção
int_flag = 1; 


//dentro do loop 
delay(70); 
if int_flag {
   int_flag=0; 
   timeout = 0; 
} else{
   timeout++;
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.