Ir ao conteúdo
  • Cadastre-se
siltech

DTMF com 16f628a

Recommended Posts

Ola pessoal, to tentando mudar o acionamento de uma sirene por DTMF e não estou conseguindo, no programa abaixo a sirene é ativada pressionando a tecla " *" e desativada com a tecla "#".

A tecla "#" sera configurada para chamar uma função de comparar senha para outro acionamento. (estou quase finalizando)

O objetivo é acionar apenas com a tecla  "*" ou seja, enquanto " * " estiver pressionada, sirene ligada, se tecla "*" solta, sirene desligada.

O problema é que apos a interrupção externa eu não consigo aproveitar a informação de STD do MT8870.

Ja tentei um jumper entre PORTB.RB0  e PORTA.RA7 configurado como entrada e não consegui.

Alguem tem alguma ideia de como resolver esse problema?

 

 

// Programa decodificador de DTMF
// Tecla "*" , liga sirene
// Tecla "#", desliga sirene
 
 
//                          D   1   2   3   4   5   6   7   8   9   0  *   #   A    B   C
const int dtmf2ascii[16] = {68, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 42, 35, 65, 66, 67};
// *****************************************************************************************
 
//===========================Variaveis==========================================
int dv = 0;                 // DTMF valido
int dtmf_nibble = 0;
char txt[4];
char ascii_char;
//===============================interrupção externa============================
void interrupt() {
  if (INTF_bit == 1) {
   INTF_bit = 0;
    dv       = 1;
   }
}
//==============================================================================
void convert(int nibble) {
     ascii_char = dtmf2ascii[nibble]; // Converte nibble em ascii
 }
//==============================================================================
 
void main() {
CMCON       = 0x07;
TRISA       = 0xEF;
TRISB       = 0x01;
PORTB.B1    = 0;
OPTION_REG  = 0xC0;
INTCON      = 0xC0;
INTE_bit    = 1;
INTF_bit    = 0;
 
 do {
 
 if (dv == 1){
 dtmf_nibble = PORTA;
  ByteToStr(dtmf_nibble, txt);         // converte  4 bit para string
   dtmf_nibble = dtmf_nibble & 0x0F;
    convert(dtmf_nibble);
    
    if (ascii_char == '*') {
       portb.rb1 = 1;
      }
      
      if (ascii_char == '#') {
       portb.rb1 = 0;
      }
      dv  = 0;
    }
    
 
  } while(1);
 
}  // Fim
 

sirene.bmp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×