Dúvida para capturar intervalos de tempo

Olá Galera, Sou novo nesses mares e estou com o seguinte problema:

meu programa precisa medir o tempo entre algumas interrupções(9 ao total) ocorridas no pino 2.

então em minha inocência fiz o seguinte:

1) eu criei um vetor long int com 11 posições e uma variavel pra contar cada vez que uma interrupção ocorre. 2) na rotina da inter. eu apenas incremento a variavel que conta o num. de inter. ocorridas. 3)no meu loop eu eu faço um switch associando ao valor da variavel que conta as inter. 4)cada case do switch eu guardo numa posição do vetor. 5)após as 9 interrupções, dentro de um IF eu printo via serial os valores guardados no vetor.

Ai começa o meu problema pois eu tento fazer a diferença entre esses valores comparando com o tempo lido por um osciloscópio e alguns tempos não estão batendo.

Alguém pode me dar uma luz de como capturar tempos adequadamente com o arduino?

Estou usando um arduino nano rev3 e meu sinal capturado tem frequencia baixa(periodos variando entre 20ms e max 66ms).

Ex do código:

long int tmparray[11]; // onde eu coloco os 9 valores de tempo int contint = 0; // variável pra contar as interrupções

void trataint (void) // para tratar a interrupção { contint ++; }

void loop() { switch(contint) { case 0: tmparray[0] = millis(); case 1: tmparray[1] = millis(); case 2: tmparray[2] = millis(); case 3: tmparray[3] = millis(); case 4: tmparray[4] = millis(); case 5: tmparray[5] = millis(); case 6: tmparray[6] = millis(); case 7: tmparray[7] = millis(); case 8: tmparray[8] = millis(); case 9: tmparray[9] = millis(); }

if(contint == 9) { contint = 0; Serial.println(tmparray[0],DEC); Serial.println(tmparray[1],DEC); Serial.println(tmparray[2],DEC); Serial.println(tmparray[3],DEC); Serial.println(tmparray[4],DEC); Serial.println(tmparray[5],DEC); Serial.println(tmparray[6],DEC); Serial.println(tmparray[7],DEC); Serial.println(tmparray[8],DEC); } }

Me perdoem pelas eventuais atrocidades, ainda sou padawan.

Agradeço desde já

Aloha!

unsigned char contint = 0; 
unsigned char acq = 0; 
void trataint (void)  // para tratar a interrupção
{
  if (acq == 0) {
    tmpArray[contint++] = millis();
    if (contint == 10) {
      acq = 1;
      contint = 0;
    }
  }
} 

void loop() {

if (acq == 1) { 
    Serial.println(tmparray[0],DEC);
    Serial.println(tmparray[1],DEC);
    Serial.println(tmparray[2],DEC);
    Serial.println(tmparray[3],DEC);
    Serial.println(tmparray[4],DEC);
    Serial.println(tmparray[5],DEC);
    Serial.println(tmparray[6],DEC);
    Serial.println(tmparray[7],DEC);
    Serial.println(tmparray[8],DEC);
    acq = 0;
  }


}

bubulindo: ``` unsigned char contint = 0; unsigned char acq = 0; void trataint (void)  // para tratar a interrupção {  if (acq == 0) {    tmpArray[contint++] = millis();    if (contint == 10) {      acq = 1;      contint = 0;    }  } }

void loop() {

if (acq == 1) {    Serial.println(tmparray[0],DEC);    Serial.println(tmparray[1],DEC);    Serial.println(tmparray[2],DEC);    Serial.println(tmparray[3],DEC);    Serial.println(tmparray[4],DEC);    Serial.println(tmparray[5],DEC);    Serial.println(tmparray[6],DEC);    Serial.println(tmparray[7],DEC);    Serial.println(tmparray[8],DEC);    acq = 0;  }

}

em

if (acq == 0) {
    tmpArray[contint++] = millis();

tmpArray é diferente de tmparray no Serial.print. Mesmo assim, belo trabalho simplificando o código

Ainda podia estar melhor...

Pessoal muito obrigado, estou conseguindo guardar os valores de tempo no vetor e depois vou fazer uns testes. O importante é que agora o valor de cada fração de tempo está igual ao medido no osciloscópio.

Eu havia percebido o tmpArray ;)

Então quer dizer que pode-se melhorar ainda mais??? eu achei super simples e muito util...qual seria a idéia?

Deixa eu explicar melhor pra vcs esse projeto:

trata-se de um tx e um rx...tipo esses de abrir portão, porem a fraquencia eh totalmente diferente...bem baixa....entre 15 e 30Hz. O tx dispara um trem de pulsos nos quais a frequencia varia. O rx soh vai validar o sinal recebido se conseguir capturar todas essas variações, ou seja, todas esses intervalos em que a interrupção ocorre.

Obviamente eu tenho filtros pra soh deixar passar a faixa de 15 a 30Hz.

Minha idéia para validar é boa? ou vcs tem um tipo de checksum infalível????

Muito obg mais uma vez, vcs são meus Mestres :D

Abraços

Melhor…

if (acq == 1) { 
    for (unsigned char cc=0; char<9; char++){
    Serial.println(tmparray[cc],DEC);
    acq = 0;
  }

Cuidado:

if (acq == 1) {
    for (unsigned char cc=0; cc<9; cc++){
    Serial.println(tmparray[cc],DEC);
    acq = 0;
  }

Estava com sono... acontece. :P