Go Down

Topic: 2 Interrupções com tempos diferentes (Read 91 times) previous topic - next topic

joaovitorpd

Estou fazendo a seguinte aplicação: estou usando o attachInterrupt() para contagem rápida de um sensor no pino 2, com interrupção por hardware. Também estou utilizando a MsTimer2 para uma interrupção por tempo, afim de calcular a velocidade. Precisaria de uma outra interrupção com um outro timer, para de 30 em 30 segundos gravar o valor da contagem atual na EEPROM. Alguém saberia como posso resolver isto, sem que prejudique a função de interrupção por hardware?

Code: [Select]

#include <MsTimer2.h>

// Declaração das variáveis de contagem de pulsos e metragem
int   sensor_pulsos = 2,
      metragem=0,
      mtr_atual=0,
      mtr_anterior=0;
long  cnt_absoluto = 0,
      cnt_atual = 0,
      cnt_anterior = 0;
//Decaração das variáveis de contagem de velocidade
int   velocidade;

// Esta função "setup" roda uma vez quando a placa e ligada ou resetada
void setup() {
  pinMode(sensor_pulsos, INPUT); // Configura o pino como entrada para o sensor
  attachInterrupt(0,contagemRapida,RISING); //Configurando a interrupção para ser chamada em borda de subida
  MsTimer2::set(1000, calc_velocidade); // período de interrupção por timer de 1000ms
  MsTimer2::start();
  Serial.begin(9600);
}

// Função que se repete infinitamente quando a placa é ligada
void loop() {
  calc_metragem();
}

//Inicialisa Rotina do Serviço de Interrupção
void contagemRapida(){
  cnt_absoluto ++;
  Serial.print(cnt_absoluto); // Imprime o valor atual do cnt_absoluto
  Serial.println();
}

void calc_metragem(){
  cnt_atual = cnt_absoluto - cnt_anterior;
  cnt_anterior = cnt_absoluto;
  metragem = 284 * cnt_absoluto;
}

void calc_velocidade(){
  mtr_atual = metragem - mtr_anterior;
  velocidade = mtr_atual / 1000; //cálculo com base no timer setado para 1 segundo
}
 

luisilva

Qual é a necessidade de utilizar a interrupção no último caso? Isso não poder ser feito utilizando simplesmente a função millis()?

joaovitorpd

#2
Jun 24, 2015, 04:43 pm Last Edit: Jun 24, 2015, 04:44 pm by joaovitorpd
Como esta funcionalidade não requer precisão, então considerei usar o millis(). Porém, gostaria de saber dos colegas de fórum se há a possibilidade de ser usada como uma segunda interrupção, pois em outra aplicação, terei que ler 2 velocidades (pulsos de sensor), o que requer precisão nos intervalos de tempo!
Mesmo assim, agradeço sua ajuda!

Go Up