Autor Tema: Problemas con MT8889  (Leído 1829 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 236
Problemas con MT8889
« 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.

Código: [Seleccionar]

#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.

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 236
Re: Problemas con MT8889
« Respuesta #1 en: 11 de Diciembre de 2006, 17:57:31 »
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.