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!
ola, muito bom o tutorial. sabe como posso colocar este sinal (dtmf) na linha telefônica?
ResponderExcluirOlá, no datasheet do componente geralmente vem como se liga a linha telefônica .
ResponderExcluir