TODOPIC
FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: omix en 11 de Diciembre de 2006, 09:31:53
-
Hola a todos, estoy intentando comunicarme con el MT8889 para que genere los tonos de marcado de un número de telefono, pero no consigo que funcione correctamente, a veces si me generea todos los tonos de marcado pero en la mayoria de ocasiones solo me genera 3 tonos de los 9 que envio.
Estoy usando un 18F8720 a 20Mhz y lo programo en C con el compilador de Hi-tech, os adjunto el codigo.
#include "mt8889.h"
#include "delay.h"
#include <stdio.h>
/**
* Inicializa el controlador MT8889.
*/
void MT8889_Init() {
MT8889_TRISCS = 0; //salida
MT8889_TRISRW = 0; //salida
MT8889_TRISRD = 0; //salida
MT8889_TRISRS = 0; //salida
MT8889_TRISIRQ = 1; //Entrada
MT8889_CS = 1;
DelayMs(100); //Retardo de estabilización después de activar la alimentación
MT8889_RS = 1; //nos ponemos en modo comando
MT8889_ReadData(); //Lectura del registro de estado
MT8889_WriteData(0x00); //Escritura del registro de control
MT8889_WriteData(0x00); //Escritura del registro de control
MT8889_WriteData(0x08); //Escritura del registro de control
MT8889_WriteData(0x00); //Escritura del registro de control
MT8889_ReadData(); //Lectura del registro de estado
//Inicialización del modo de funcionamiento deseado
//Escritura en CRA
MT8889_WriteData(0x08); //SELECT CRB, NO_IRQ, DTMF_MODE, NO_TONO
//Escritura en CRB
MT8889_WriteData(0x00); //DUAL_TONE, NO_TEST, BURST MODE
MT8889_ReadData();
}
/**
* Habilita la generación de tono (modo transmisión)
*/
void MT8889_EnableTone(){
MT8889_RS = 1; //modo comandos
MT8889_WriteData(0b00000001); //CRA: SELECT CRB, NO IRQ, DTMF_MODE, TONO
// MT8889_WriteData(0b00001101); //CRA: SELECT CRB, IRQ, DTMF_MODE, TONO
// MT8889_WriteData(0b00000000); //CRB: BRUST MODE
MT8889_ReadData();
}
/**
* Deshabilita la generación de tono (modo recepción).
*/
void MT8889_DisableTone(){
MT8889_RS = 1; //modo comandos
MT8889_WriteData(0x04); //NO SELECT CRB, IRQ, CALL PROGRESS, NO TONO
MT8889_ReadData();
}
/**
* Escribe un dato en el controlador MT8889.
*/
void MT8889_WriteData(BYTE data) {
//configura pines de datos como salida
MT8889_TRISD0 = 0;
MT8889_TRISD1 = 0;
MT8889_TRISD2 = 0;
MT8889_TRISD3 = 0;
MT8889_D0 = 0;
MT8889_D1 = 0;
MT8889_D2 = 0;
MT8889_D3 = 0;
DelayUs(1);
//Ponemos el dato
MT8889_D0 = data & 0x01;
MT8889_D1 = (data & 0x02) >> 1;
MT8889_D2 = (data & 0x04) >> 2;
MT8889_D3 = (data & 0x08) >> 3;
DelayUs(1);
//Le indicamos al MT8889 que vamos a escribir en el registro de transmisión
MT8889_RW = 0; //Entramos en modo escritura
MT8889_CS = 0; //chip select
MT8889_RD = 1;
DelayUs(1);
MT8889_RD = 0;
MT8889_CS = 1; //chip select
MT8889_RW = 1; //Volvemos a modo lectura
//configura pines de datos como entrada
MT8889_TRISD0 = 1;
MT8889_TRISD1 = 1;
MT8889_TRISD2 = 1;
MT8889_TRISD3 = 1;
}
/**
* Lee un dato del controlador MT8889.
*/
BYTE MT8889_ReadData() {
BYTE dato = 0;
//configura pines de datos como entradas
MT8889_TRISD0 = 1;
MT8889_TRISD1 = 1;
MT8889_TRISD2 = 1;
MT8889_TRISD3 = 1;
MT8889_RW = 1; //modo lectura
MT8889_CS = 0; //chip select
MT8889_RD = 1;
DelayUs(1);
//leemos dato
if(MT8889_D3)
dato |= 1;
dato = dato << 1;
if(MT8889_D2)
dato |= 1;
dato = dato << 1;
if(MT8889_D1)
dato |= 1;
dato = dato << 1;
if(MT8889_D0)
dato |= 1;
DelayUs(1);
MT8889_RD = 0;
MT8889_CS = 1;
return dato;
}
void MT8889_SendTone(BYTE tone){
//BOOL salir = FALSE;
BYTE dato;
MT8889_RS = 0; //modo datos
MT8889_WriteData(tone);
MT8889_RS = 1; //modo comandos
MT8889_RW = 1; //volvemos a modo lectura
/* printf("MT889_SendTone: Esperando IRQ, Tone: 0x%x\r\n", tone);
while(MT8889_IRQ){ //esperamos interrupcion que nos indique que se ha transmitido el tono
CLRWDT();
}*/
do {
dato = MT8889_ReadData();
if(dato & 0x04) { //se detecto un tono?
MT8889_RS = 0; //modo datos
MT8889_ReadData(); //leemos el tono
MT8889_RS = 1; //modo comandos
}
printf("MT889_SendTone: Tone = 0x%x, dato = 0x%x\r\n",tone, dato);
}while (!(dato & 0x02));
// DelayMs(180);//espera para enviar proximo tono
}
BYTE MT8889_ReceiveTone(){
BYTE dato;
while(MT8889_IRQ){
CLRWDT();
}
dato = MT8889_ReadData();
if(dato & 0x04) { //Si se recibión un tono leerlo
MT8889_RS = 0; //modo datos
dato = MT8889_ReadData();
MT8889_RS = 1; //modo comando
}else{
dato = 0xFF;
}
return dato;
}
A ver si a alguien se le ocurre que es lo que puede estar pasando.
Saludos.
-
Solucionado, bueno en parte, solo me falta solucionar la recepción de tonos que parece que no le llega ninguno cuando pulso una tecla del telefono llamado.
Saludos.