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!!
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2023 Criado por Marcelo Rodrigues.
Ativado por