Go Down

Topic: 2 Interrupções com tempos diferentes (Read 205 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy