Pues bien despues de leer un poco y darme muchos golpes de pecho por mi "Fluido" ingles logre realizar esta libreria en mikrobasic 7.02 para controlar el cm8888
hasta ahora (por cuestioes de hard pues no he podido montar la baquela) solo he podido probar las funciones de escribir en los registros de control y la funcion de enviar algun tono DTMF.
las otras dos funciones (la de leer el registro status y la de leer el registro de datos) las comprobare tan pronto como sea posible... pero segun el datasheet y segun los resultados k obtuve con las otras dos funciones que funcionaron (valga la redundancia) me imagino k deberian funcionar sin problemas...
bueno la libreria es esta...
module CM8888
'*******************************************************************************
'*******************************************************************************
' LIBRERIA PARA CONTROLAR EL CM8888 CREADA POR MATEO DUQUE - ekud_87@hotmail.com -
' 10 DE MARZO DEL 2009
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
' CONSTANTES
'*******************************************************************************
'*******************************************************************************
'Constantes para el registro de control
Const TOUT_ON = 1
Const TOUT_OFF = 0
Const CP = 1
Const DTMF = 0
Const IRQ_ON = 1
Const IRQ_OFF = 0
Const REGB = 1
Const REGA = 0
Const BURST_OFF = 1
Const BURST_ON = 0
Const TEST_ON = 1
Const TEST_OFF = 0
Const DUAL_OFF = 1
Const DUAL_ON = 0
Const COLUMNA = 1
Const FILA = 0
'*******************************************************************************
'*******************************************************************************
' VARIABLES
'*******************************************************************************
'*******************************************************************************
'PUNTEROS DE LOS PUERTOS DE CONFIGURACION Y DATOS
Dim PUERTO_CONTROL as ^byte
Dim PUERTO_DATOS as ^byte
Dim PUERTO_CONFIG_DATOS as ^byte
'VARIABLES QUE CONTIENEN EL BIT DEL DETERMINADO PIN
'Pines de control
Dim RSO_PIN as byte
Dim RD_PIN as byte
Dim WR_PIN as byte
'Pines de datos
Dim D3_PIN as byte
Dim D2_PIN as byte
Dim D1_PIN as byte
Dim D0_PIN as byte
'Pin que genra la interrupcion
Dim IRQ_PIN as byte
'Pin que habilita el cm8888
Dim CS_PIN as byte
'*******************************************************************************
'*******************************************************************************
' PROCEDIMIENTOS Y FUNCIONES "INTERNOS"
'*******************************************************************************
'*******************************************************************************
'Procedimiento para configurar como entrada o salida las lineas D3 a D0
Sub Procedure CONFIG_ENT_SALIDA(Dim IO as boolean)'1=entrada 0=salida
'Configuro D0 a D3 como entrada o salida
PUERTO_CONFIG_DATOS^.D0_PIN = IO
PUERTO_CONFIG_DATOS^.D1_PIN = IO
PUERTO_CONFIG_DATOS^.D2_PIN = IO
PUERTO_CONFIG_DATOS^.D3_PIN = IO
'Retardo para estabilizar
Delay_ms(2)
end sub
'Procedimiento para escribir un dato en el puerto de datos
Sub procedure ESCRIBIR_DATO(Dim data as byte)
PUERTO_DATOS^.D0_PIN = data.0
PUERTO_DATOS^.D1_PIN = data.1
PUERTO_DATOS^.D2_PIN = data.2
PUERTO_DATOS^.D3_PIN = data.3
end sub
'Procedimiento para terminar cualkier procedimiento de lectura o escritura del cm8888
Sub procedure CM8888_FIN()
'Pausa para estabilizar...
Delay_ms(10)
'Desabilito el CM8888
PUERTO_CONTROL^.CS_PIN = 1
'Desabilito la lectura
PUERTO_CONTROL^.RD_PIN = 1
'Direcciono a registros de transmicion y recepcion de datos
PUERTO_CONTROL^.RSO_PIN = 0
'Desabilito la escritura
PUERTO_CONTROL^.WR_PIN = 1
'Pausa para estabilizar...
Delay_ms(10)
'Configuro como entrada las lineas D3 a D0
CONFIG_ENT_SALIDA(1)
end sub
'Procedimiento para escribir 4 bits en el registro de control
Sub procedure ESCRIBIR_REG_CONTROL(Dim B0 as byte,Dim B1 as byte,Dim B2 as byte,Dim B3 as byte)
'Habilito el CM8888
PUERTO_CONTROL^.CS_PIN = 0
'Deshabilito lectura
PUERTO_CONTROL^.RD_PIN = 1
'Selecciono status o control
PUERTO_CONTROL^.RSO_PIN = 1
'Habilito la escritura
PUERTO_CONTROL^.WR_PIN = 0
'Retardo para "estabilizar"
Delay_us(1)
'Configuro el puerto como salida
CONFIG_ENT_SALIDA(0)
'Escribo el valor en el puerto
PUERTO_DATOS^.D0_PIN = B0
PUERTO_DATOS^.D1_PIN = B1
PUERTO_DATOS^.D2_PIN = B2
PUERTO_DATOS^.D3_PIN = B3
'"Finalizo" el cm8888
CM8888_FIN()
end sub
'Funcion para leer los datos de las lineas D3 a D0
Sub Function LEER_DATOS()as byte
'Variable auxiliar
Dim dat as byte
'Inicializo la variable
dat = 0
'Obtengo los datos
dat.0 = PUERTO_DATOS^.D0_PIN
dat.1 = PUERTO_DATOS^.D1_PIN
dat.1 = PUERTO_DATOS^.D2_PIN
dat.3 = PUERTO_DATOS^.D3_PIN
'Retorno el valor
LEER_DATOS = dat
end sub
'*******************************************************************************
'*******************************************************************************
' PROCEDIMIENTOS Y FUNCIONES "PUBLICAS"
'*******************************************************************************
'*******************************************************************************
'Procedimiento para configurar el CM8888
Sub Procedure CM8888_CONFIG(Dim Byref P_Control as byte, Dim CS, RSO, RD, WR, IRQ as byte, Dim Byref P_Datos as byte, Dim Byref P_Config_Datos as byte , Dim D3, D2, D1, D0 as byte)
'Obtengo la direccion del puerto de control
PUERTO_CONTROL = @P_Control
'Obtengo las posiciones de los bits de control
CS_PIN = CS
RSO_PIN = RSO
RD_PIN = RD
WR_PIN = WR
IRQ_PIN = IRQ
'Obtengo la direccion del puerto de datos
PUERTO_DATOS = @P_Datos
'Obtengo la direccion del registro de configuracion E/S de datos
PUERTO_CONFIG_DATOS = @P_Config_Datos
'Obtengo las posiciones de los bits de datos
D3_PIN = D3
D2_PIN = D2
D1_PIN = D1
D0_PIN = D0
end sub
'Procedimiento para escribir en el registro de control A y B
sub Procedure CM8888_CONTROL(Dim TONE_OUT as boolean, Dim CP_DTMF as boolean, Dim IRQ as boolean, Dim RSEL as boolean, Dim BURST as boolean, Dim TEST as boolean, Dim S_D as boolean, Dim C_R as boolean )
'Escribo en el registro A
ESCRIBIR_REG_CONTROL(TONE_OUT,CP_DTMF,IRQ,RSEL)
'si hay k escribir en el registro B
if RSEL = 1 then
'Escribo en el registro B
ESCRIBIR_REG_CONTROL(BURST,TEST,S_D,C_R)
end if
end sub
'Procedimiento para escribir en el registro de datos
sub Procedure CM8888_OUT(Dim Tono as char)
'Habilito el cm8888
PUERTO_CONTROL^.CS_PIN = 0
'Desabilito la lectura
PUERTO_CONTROL^.RD_PIN = 1
'Selecciono transmicion/recepcion de datos
PUERTO_CONTROL^.RSO_PIN = 0
'Habilito la escritura
PUERTO_CONTROL^.WR_PIN = 0
'Retardo para estabilizar
Delay_us(1)
'Configuro el puerto como salida
CONFIG_ENT_SALIDA(0)
'Obtengo el codigo del tono a enviar
Select case Tono
Case "1"
'Escribo el valor en el puerto
ESCRIBIR_DATO(1)
Case "2"
'Escribo el valor en el puerto
ESCRIBIR_DATO(2)
Case "3"
'Escribo el valor en el puerto
ESCRIBIR_DATO(3)
Case "4"
'Escribo el valor en el puerto
ESCRIBIR_DATO(4)
Case "5"
'Escribo el valor en el puerto
ESCRIBIR_DATO(5)
Case "6"
'Escribo el valor en el puerto
ESCRIBIR_DATO(6)
Case "7"
'Escribo el valor en el puerto
ESCRIBIR_DATO(7)
Case "8"
'Escribo el valor en el puerto
ESCRIBIR_DATO(8)
Case "9"
'Escribo el valor en el puerto
ESCRIBIR_DATO(9)
Case "0"
'Escribo el valor en el puerto
ESCRIBIR_DATO(10)
Case "*"
'Escribo el valor en el puerto
ESCRIBIR_DATO(11)
Case "#"
'Escribo el valor en el puerto
ESCRIBIR_DATO(12)
Case "A"
'Escribo el valor en el puerto
ESCRIBIR_DATO(13)
Case "B"
'Escribo el valor en el puerto
ESCRIBIR_DATO(14)
Case "C"
'Escribo el valor en el puerto
ESCRIBIR_DATO(15)
Case "D"
'Escribo el valor en el puerto
ESCRIBIR_DATO(0)
'Si no se envia un tono valido...
Case else
'"Finalizo" el cm8888
CM8888_FIN()
'Salgo del procedimiento
exit
end select
'"Finalizo" el cm8888
CM8888_FIN()
end sub
'*******************************************************************************
'*******************************************************************************
' FUNCIONES
'*******************************************************************************
'*******************************************************************************
'Funcion para leer el registro status del cm8888
Sub function CM8888_STATUS() as byte
'Variable Auxiliar
Dim AUX as byte
'Habilito el cm8888
PUERTO_CONTROL^.CS_PIN = 0
'Habilito la lectura
PUERTO_CONTROL^.RD_PIN = 0
'Direcciono hacia los registros status o control
PUERTO_CONTROL^.RSO_PIN = 1
'Desabilito la escritura
PUERTO_CONTROL^.WR_PIN = 1
'Retardo para estabilizar
Delay_us(1)
'Configuro D3 a D0 como entrada
CONFIG_ENT_SALIDA(1)
'Leo los datos
AUX = LEER_DATOS()
'Finalizo el cm8888
CM8888_FIN()
'Retorno el valor
CM8888_STATUS = AUX
end sub
'Funcion para leer el registro de datos del cm8888
Sub function CM8888_LEER_DATOS() as byte
'Variable Auxiliar
Dim BUF as byte
'Habilito el cm8888
PUERTO_CONTROL^.CS_PIN = 0
'Habilito la lectura
PUERTO_CONTROL^.RD_PIN = 0
'Direcciono hacia los registros status o control
PUERTO_CONTROL^.RSO_PIN = 0
'Desabilito la escritura
PUERTO_CONTROL^.WR_PIN = 1
'Retardo para estabilizar
Delay_us(1)
'Configuro D3 a D0 como entrada
CONFIG_ENT_SALIDA(1)
'Leo los datos
BUF = LEER_DATOS()
'Finalizo el cm8888
CM8888_FIN()
'Retorno el valor
CM8888_LEER_DATOS = BUF
end sub
end.
y para probarlas yo use el siguiente codigo...
program proyecto_CM8888
include "LIB_CM8888"
Dim telefono as string [7]
Dim i as byte
main:
TRISC = 0
PORTC = 0
TRISB = 0
PORTB = 0
TRISA = 0
PORTB = 0
LCD_CONFIG(PORTC,4,5,6,7,PORTB,5,6,7)
CM8888_CONFIG(PORTB,4,3,2,1,0,PORTC,TRISC,3,2,1,0)
LCD_CMD(Lcd_Clear)
telefono = "3439487"
Principal:
CM8888_CONTROL(TOUT_ON,DTMF,IRQ_ON,REGB,BURST_ON,TEST_OFF,DUAL_ON,FILA)
for i = 0 to 6
CM8888_OUT(telefono[i])
delay_ms(100)
next i
delay_ms(3000)
goto Principal
end.
con este codigo logro que el micro configure el cm8888 como generador de tonos DTMF y que realize el marcado a un numero telefonico.
para probar el correcto funcionamiento lo que hize fue conectar un parlante y un par de trasitores mas (en configuracion darlington) a la salida del transistor Q2 del circuito que se puede ver acontinuacion (Tambien para probarlo no es necesario conectar ni la parte del trafo ni la parte del rele):

Que como logre probarlo?? pues sencillo acercas la bocina del telefono de tu casa al parlante cuando este este generando los tonos (tener cuidado de acercarlo desde k antes que se esten gerando los tonos para k el telefono no entienda un numero erroneo) y en cuanto termine de generar los tonos el circuito, pueden acercar el telefono a sus oidos para k escuchen como timbra o como suena ocupado el telefono al que llamaron.
y pues bueno como les digo no he podido probar las funciones para leer el registro status y para leer el registro de datos del cm8888 pero como les repito es por que no he podido elaborar la baquela, en cuanto la tenga lista les avisare los resultados y pues nada espero le pueda servir a alguien mas para usar este integrado.
Como nota cabe decir k deberia funcionar de manera trasnsparente para el mt8888 , sinembargo este ultimo requiere una rutina de inicializacion que no es estrictamente necesaria en el cm8888.
Saludos desde Pereira Colombia!