Bom dia garagistas!

Pessoal por gentileza, estou desenvolvendo um projeto de grande importância para mim onde eu utilizo a interrupção externa zero (e futuramente utilizarei a 1 também), porém necessito utilizar um controle remoto IR. Quando utilizo o meu controle com a interrupção funcionando, eu não consigo ler o sinal emitido pelo controle, porém ao remover o fio da por 2 onde aciona a interrupção, eu volto a ler corretamente o código emitido pelo controle. Gostaria de saber se é possível desligar a interrupção temporariamente, assim como num Pic, para que eu possa efetuar a leitura do meu controle. Segue um exemplo resumido do meu código abaixo

/*
Pin | Interrrupt # | Arduino Platform
---------------------------------------
2 | 0 | All
3 | 1 | All
18 | 5 | Arduino Mega Only
19 | 4 | Arduino Mega Only
20 | 3 | Arduino Mega Only
21 | 2 | Arduino Mega Only

*/
#include "IRremote.h"
#include "IRremoteInt.h"

int receiver = 11;

IRrecv irrecv(receiver);
decode_results results;

int AC_LOAD = 13; // SAIDA P/ O TRIAC
int dimming = 5; // Dimming level (0-128) 0 = ON, 128 = OFF
int conta=0;

//----------------------------------SETUP----------------------------------------------------------
void setup()
{

Serial.begin(9600);
pinMode(AC_LOAD, OUTPUT);
attachInterrupt(0, zero_crosss_int, RISING);
irrecv.enableIRIn(); // Start the receiver

}

//----------------------------------MAIN PROGRAM----------------------------------------------------------
void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?

{
if (results.value==0x4FBA857 ){
conta=conta+1;
}
else
if (results.value==0x4FBD827 ){
conta=conta-1;
}
Serial.println(results.value);
irrecv.resume(); // receive the next value
}
}

//-----------------------------------ZERO CROSS---------------------------------------------------------
void zero_crosss_int() // function to be fired at the zero crossing to dim the light
{
// Firing angle calculation :: 60Hz-> 8.33ms (1/2 Cycle)
// (8333us - 8.33us) / 128 = 65 (Approx)
int dimtime = (65*dimming);
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
//Serial.println (digitalRead(AC_LOAD));
delayMicroseconds(8.33); // triac On propogation delay
digitalWrite(AC_LOAD, LOW); // triac Off
//Serial.println (digitalRead(AC_LOAD));
}

Se eu desligo o fio da interrupção, a variável conta incrementa e decrementa normalmente a partir dos dois botões lidos pelo controle remoto!

Desde já agradeço a atenção galera!!

Exibições: 2092

Respostas a este tópico

Como sou estudante de programação, gostaria de saber ´para qual uso é, mas acho que é sigilo do seu projeto, ta certo.

abraço

Não não, não é sigiloso. Trata-se de um dimmer que será incrementado pelo controle remoto. este dimmer será usado para controlar a temperatura da resistência de uma estufa de aquecimento de amostras utilizadas em testes de ensaio de tração. O meu problema é que não consigo incrementar os valores com o controle. Até encontrei uma função chamada detachInterrupt(1), porém mesmo assim não consigo executar corretamente sem grandes interferências e erros no programa.

Legal

Veja que em momento algum é definido o pino de disparo da interrupção, isso porque está intrínseco as bibliotecas que vc. está usando. Pode procurar que lá tem outras definições de disparo OU o uso dos timers que provavelmente são necessários para o uso destas interrupções. É possível "quebrar-um-galho" (já ví fazerem, mas eu mesmo ainda não precisei).

Pode "cair pra dentro" da biblioteca e começar a debuga-la para ver o que pode ser feito para estes casos.

Boa sorte.

Opa tinha razão Euclides, realmente tinha conflito na biblioteca IR com a interrupção a qual eu utilizava. Por fim optei por utilizar um outro metodo de detecção de zero o qual não conflita com o IR e assim consegui resolver o problema.

Agradeço pela ajuda!!!!

Então passa aqui pra gente como você fez (montagem/fonte do programa)!

Aí já economiza outro post né?

Obrigado.

Opa, segue o codigo...

#include "IRremote.h"
#include "IRremoteInt.h"

#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT 2 //zero cross detect
#define GATE 13 //triac gate
#define PULSE 11 //trigger pulse width (counts)
int i=0;

IRrecv irrecv(PULSE);
decode_results results;

int conta=483;

void setup(){
Serial.begin(9600);
// set up pins
pinMode(DETECT, INPUT); //zero cross detect
digitalWrite(DETECT, HIGH); //enable pull-up resistor
pinMode(GATE, OUTPUT); //triac gate control

// set up Timer1
//(see ATMEGA 328 data sheet pg 134 for more details)
OCR1A = 100; //initialize the comparator
TIMSK1 = 0x03; //enable comparator A and overflow interrupts
TCCR1A = 0x00; //timer control registers set for
TCCR1B = 0x00; //normal operation, timer disabled


// set up zero crossing interrupt
attachInterrupt(0,zeroCrossingInterrupt, RISING);
//IRQ0 is pin 2. Call zeroCrossingInterrupt
//on rising signal

irrecv.enableIRIn(); // Start the receive

}

//Interrupt Service Routines

void zeroCrossingInterrupt(){ //zero cross detect
TCCR1B=0x04; //start timer with divide by 256 input
TCNT1 = 0; //reset timer - count from zero
}

ISR(TIMER1_COMPA_vect){ //comparator match
digitalWrite(GATE,HIGH); //set triac gate to high
TCNT1 = 65536-PULSE; //trigger pulse width
}

ISR(TIMER1_OVF_vect){ //timer1 overflow
digitalWrite(GATE,LOW); //turn off triac gate
TCCR1B = 0x00; //disable timer stopd unintended triggers
}

void loop(){ // sample code to exercise the circuit

if (irrecv.decode(&results)) 
{
if (results.value==0x4FBA857 ){
conta=conta-1;
}
else
if (results.value==0x4FBD827 ){
conta=conta+1;

}
Serial.println(conta);
irrecv.resume(); // receive the next value

}

i=conta;
OCR1A = i; 
//if (i<40){i=485;}
delay(15);

}

ola Rafael tenho uma duvida como você conseguiu arrumar esse problema ? 

use o comando detachinterrupt(0); para interromper a int0, assim reduz ruidos quando nao se faz necessario interrupçoes, pode ser que vc ja tenha resolvido pelo tempo, mas comentei pra ajudar a outras pessoas que precisem. abraço

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço