sábado, 7 de julho de 2012

ATMEGA328 gerando DTMF !

            A forma mais simples de gerar tom DTMF é por meio de CIS que fazem isso(exemplo: MV5089, EF71189, LC7365, MT8880, TP5088) aqui vou demonstrar como usar o chip da holtek HT9200A este chip é de fácil montagem visto que necessita de poucos componentes externos(dois capacitores e um crital),observado a figura abaixo que foi retirada do datasheet do fabricante é fácil perceber como é simples  sua utilização:


            Para comunicar é preciso envia um pacote de pulsos(clock) e então colocar os dados de forma serial , lembrando que o pino de habilitação do chip "CE" deve ser colocado em nível baixo para comuinicar   veja a figura:

            Bom então vamos ao código fonte:
/*
 *                                                 usando gerador de DTMF HT9200
 *   Version    : 1.0
 *   microcontrolador : AVR ATMega328
 *   descrição  : exemplo usando o HT9200, neste exemplo gera tom de 0 a 9 ao iniciar e depois o programa para.
 *   criado: 07/07/2012 
 *   autor: aguivone moretti fogia
 */
//sempre deixar as otimizações em 01 pra não ter surpresas em teu codigo

#define F_CPU 16000000  // 16 MHz
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>

#define alterna_pino(x,y) x ^= _BV(y)   
#define liga_pino(x,y) x |= _BV(y)
#define desliga_pino(x,y) x &= ~(_BV(y))


 //SERIAL DTMF

 #define DTMF_DADOS PD2 //gera sinal de dados
 #define DTMF_CLOCK PD3 // gera sinal de clock
 #define DTMF_HABILITA PD4//habilita chip HT9200



//////////////////////////////////////////////////////////////////////////////////////////////////////////
//DTMF

void DTMF_envia(int DT)
{
      int X=1;
      desliga_pino(PORTD,DTMF_HABILITA);//habilita chip
      _delay_ms(10);//espera oscilador do chip estabilizar
      while(X > 0)
      {
          if((DT & X) > 0)
            {// igual a 1
             liga_pino(PORTD,DTMF_DADOS);//nivel um            
            }
            else
            {///igual a zero
            desliga_pino(PORTD,DTMF_DADOS);//nivel zero
            }
            X=X*2;//o mesmo que rotacionar
            _delay_ms(5);//espera estabilizar pinos
            desliga_pino(PORTD,DTMF_CLOCK);//habilita leitura de dados 
            _delay_ms(10);//espera ler
            liga_pino(PORTD,DTMF_CLOCK);//mantem clock en nivel alto

      }
      desliga_pino(PORTD,DTMF_DADOS);//sem dados
      

}
  
//////////////////////////////////////////////função principal///////////////////////////////////////////
int main(void)
{
           DDRD = 0XFE;  //inicializa portD,somente D0 é entrada
           DDRC = 0XFF;  //inicializa portD,somente D0 é entrada
          //////////////////////////

          liga_pino(PORTD,DTMF_HABILITA);//desabilita chip
          liga_pino(PORTD,DTMF_CLOCK);//mantem clock en nivel alto
          desliga_pino(PORTD,DTMF_DADOS);//sem dados

          for(;;)
            { 
                  DTMF_envia(10);//o zero é 10 em DTMF
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(1);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(2);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(3);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(4);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(5);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(6);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(7);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(8);
                  _delay_ms(500);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)

                  DTMF_envia(9);
                  _delay_ms(2000);//tempo para reconhecer o dtmf(simula aperta da tecla do telefone)
                    DTMF_envia(31);//Stop bit//manda para o som dtmf
                  liga_pino(PORTD,DTMF_HABILITA);//desabilita chip    
          
                  _delay_ms(2000);                        
            }
                 
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
até a próxima pessoal!


2 comentários :

  1. ola, muito bom o tutorial. sabe como posso colocar este sinal (dtmf) na linha telefônica?

    ResponderExcluir
  2. Olá, no datasheet do componente geralmente vem como se liga a linha telefônica .

    ResponderExcluir

olá,digite aqui seu comentário!