TODOPIC
FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: ekud en 10 de Marzo de 2009, 05:46:19
-
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):
(http://img22.imageshack.us/img22/6518/imagent.jpg)
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!
-
Bueno, no se si alguien ha usado el codigo o algo pero ps por ahora quieria notificarles de los avances.
En el ejemplo anterior:
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.
Lo que se hizo con este codigo anterior es hacer que el micro realizara la marcacion del numero telefonico 3439487, este ejemplo funciono adecuadamente para realizar la marcacion a un numero telefonico, sinmembargo no teniamos en cuenta el registro status del cm8888 para verificar que este integrado ya hubiera terminado de realizar la marcacion de cada pulso.
En el siguiente codigo, se usa la lectura del registro status del cm8888 para verificar que el integrado ya halla terminado de realizar la marcacion de cada digito para comenzar con la marcacion del digito siguiente, el codigo es el siguiente:
program proyecto_CM8888
include "LIB_CM8888"
Dim telefono as string [7]
Dim i as byte
Dim estado as byte
Dim dato as char
Dim txt as string [3]
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"
i = 1
Lcd_cmd(lcd_clear)
Lcd_out(1,1,"Configurando reg")
Lcd_out(2,1,"De control...")
CM8888_CONTROL(TOUT_ON,DTMF,IRQ_ON,REGB,BURST_ON,TEST_OFF,DUAL_ON,FILA)
delay_ms(1000)
Principal:
lcd_cmd(lcd_clear)
lcd_out(1,1,"Marcando Status")
for i = 0 to 6
CM8888_OUT(telefono[i])
LCD_Chr(2,i+1,telefono[i])
while true
estado = CM8888_STATUS()
if estado.1 = 1 then
bytetostr(estado,txt)
lcd_out(2,13,txt)
delay_ms(100)
break
end if
wend
next i
delay_ms(2000)
Lcd_cmd(lcd_clear)
lcd_out(1,1,"Leyendo status")
estado = CM8888_STATUS()
bytetostr(estado,txt)
lcd_out(2,2,txt)
delay_ms(3000)
goto Principal
end.
Como podran notar el codigo es extremandamente similar al anterior, la diferencia radica en que ahora se usa el LCD para verificar los datos y el progreso de la marcacion, sinembargo lo mas notable de este codigo es que ahora se hace una lectura al registro status para verificar si ya se termino la marcacion de un digito para continuar con el siguiente, consiguiendo asi una mayor precision en cuanto al momento de marcado de cada digito.
Asi pues de la libreria que hize en mikrobasic ya esta comprobado el funcionamiento de 4 de las 5 funciones principales que forman la libreria
- la funcion CM8888_OUT que sirve para generar un tono DTMF
- la funcion CM8888_CONTROL que sirve para escribir en el registro de control del integrado y asi poder configurarlo segun la necesidad
- la funcion CM8888_CONFIG que sirve para hacerle entender al micro como tenemos conectado el integrado
- la funcion CM8888_STASTUS que sirve para verificar el estado del integrado
Solo queda probar la funcion CM8888_LEER_DATOS que serviria para leer el tono DTMF que detecte el integrado cuando esta configurado en modo "lectura o deteccion".
y por cierto el modo de probarlo sigue siendo el mismo, no hay necesidad de conectar el circuito a la linea telefonica para probarlo solo es necesario que que no conecten el transformador y el rele (pues solo se usarian cuando se tiene conectado a la linea telefonica) y poner un parlante de 8ohmios entre el emisor de Q2 y tierra, luego encienden el circuito y acercan la bocina del telefono al parlante mientras se esten generando los tonos. Ya se que no es un modo muy serio de probarlo pero de que funciona funciona. :mrgreen:
Y pues no es mas... en cuanto logre probar la funcion que falta probar les estare avisando.
Saludos desde Pereira Colombia!
-
Despues de una larga ronda de parciales... y despues de haber podido superar algunos probleas tecnicos... segui trabajando en el proyecto del cm8888.
En este momento pude terminar satisfactoriamente una libreria (que mas que una libreria es una funcion) mas compacta que la anterior.
El por que de hacerla mas compacta es para usar lo minimo de memoria que se pueda... y aun asi esty seguro que esta funcion que desarolle para controlar el cm888 podria comprimirse aun mas hasta casi la mitad de las lineas de codigo pues hay mucho codigo que se repite o k bien podria hacerse mas versatil... mas compacto.
Bueno sin mas rodeos... la libreria es esta:
'*******************************************************************************
'*******************************************************************************
' LIBRERIA PARA CONTROLAR EL CM8888 CREADA POR MATEO DUQUE - ekud_87@hotmail.com -
' 9 DE ABRIL DEL 2009
'*******************************************************************************
'*******************************************************************************
'Pines de datos
Symbol D3 = 3
Symbol D2 = 2
Symbol D1 = 1
Symbol D0 = 0
Symbol PDATA = PORTC
Symbol PCONF = TRISC
'Pines de control
Symbol CS = PORTB.4
Symbol RSO = PORTB.3
Symbol R_D = PORTB.2
Symbol W_R = PORTB.1
Symbol IRQ = PORTB.0
'funciones
Symbol LEER = 0
Symbol ESCRIBIR = 1
'Bancos
Symbol DATOS = 0
Symbol ESTADO = 1
Symbol CONTROL = 1
'*******************************************************************************
'*******************************************************************************
' PROCEDIMIENTOS Y FUNCIONES
'*******************************************************************************
'*******************************************************************************
Sub Function CM8888(Dim Funcion as Boolean, Dim Banco as Boolean, Dim Tono as Byte) as Byte
'Variable Auxiliar
Dim BUF as byte
PDATA.D0 = 0
PDATA.D1 = 0
PDATA.D2 = 0
PDATA.D3 = 0
if FUNCION = LEER then
PCONF.D0 = 1
PCONF.D1 = 1
PCONF.D2 = 1
PCONF.D3 = 1
'Direcciono hacia los registros status o control
RSO = Banco
'Habilito la lectura
R_D = 0
'Desabilito la escritura
W_R = 1
'Habilito el cm8888
CS = 0
BUF = 0
'Leo los datos
BUF.0 = PDATA.D0
BUF.1 = PDATA.D1
BUF.2 = PDATA.D2
BUF.3 = PDATA.D3
'Finalizo el cm8888
CS = 1
'Retorno el valor
CM8888 = BUF
else
'Configuro el puerto como salida
PCONF.D0 = 0
PCONF.D1 = 0
PCONF.D2 = 0
PCONF.D3 = 0
'Selecciono transmicion/recepcion de datos
RSO = Banco
'Desabilito la lectura
R_D = 1
'Habilito la escritura
W_R = 0
'Habilito el cm8888
CS = 0
'Escribo el dato
PDATA.D0 = Tono.0
PDATA.D1 = Tono.1
PDATA.D2 = Tono.2
PDATA.D3 = Tono.3
'"Finalizo" el cm8888
CS = 1
CM8888 = 255
end if
End sub
'Procedimiento para configurar el CM8888 e inicializar el mt8888
Sub Procedure CM8888_INIT()
Dim aux as byte
CS = 0
aux = CM8888(LEER,ESTADO,0)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(ESCRIBIR,CONTROL,8)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(LEER,ESTADO,0)
CS = 1
end sub
end.
Como veran es un codigo bastante sencillo y muchisimo mas ligero que el anterior... la diferencia radica que en el anterior se usaban punteros lo cual apesar de hacer el codigo mas pesado lo hacia mas versatil, en cuanto al funcionamiento y al modo de usar estas librerias que he creado puedo asegurar que es mas sencillo usar esta ultima.
Para ver como se usa mostrare un ejemplo en el cual se le dice al cm8888 que se configure para generar tonos dtmf, que emita el tono deseado (en este caso el tono es el 7) y que luego verique el estado del registro status del cm8888 para verificar si se obtuvo algun tono de entrada, y si lo hubo que se averigue que tono es el que se detecto. y que en un lcd 2 x 16 se muestren los datos que nos entrega el cm8888.
El codigo para el ejemplo seria el siguiente:
program DTMF_8888
include "LIB_CM8888"
'funciones
Symbol LEER = 0
Symbol ESCRIBIR = 1
'Bancos
Symbol DATOS = 0
Symbol ESTADO = 1
Symbol CONTROL = 1
'Variables
Dim actual as byte
Dim valor as char
Dim txt as string [3]
main:
'Configuro los puertos
TRISC = 0
PORTC = 0
TRISB = 0
PORTB = 0
'Configuro e inicializo el cm8888
LCD_CONFIG(PORTC,4,5,6,7,PORTB,5,6,7)
LCD_CMD(Lcd_Clear)
'Inicializo el cm8888 o el mt8888 segun el datasheet
CM8888_INIT()
'Muestro mensajes al usuario
Lcd_out(1,1,"Configurando reg")
Lcd_out(2,1,"De control...")
delay_ms(1000)
Principal:
'CONFIGURO EL CM8888 PARA GENERAR TONOS EN MODO BURST
'RSEL=1, IRQ=1, DTMF/CP=0, TOUT=1
actual = CM8888(ESCRIBIR,CONTROL,%1101)
'C/R=0, S/D=0, TEST=0, BURST = 0
actual = CM8888(ESCRIBIR,CONTROL,0)
'Genero el tono 7
actual = CM8888(ESCRIBIR,DATOS,7)
Delay_ms(102)
'Limpio el lcd y muestro informacion
lcd_cmd(lcd_clear)
lcd_out(1,1,"StaTuS: ")
lcd_out(2,1,"Dato: ")
'OBTENGO EL ESTADO DEL CM8888
actual = CM8888(LEER,ESTADO,0)
bytetostr(actual,txt)
'si se prensento una interrupcion en el cm8888
IF actual.0 = 1 then
'Muestro el valor del registro estatus del cm8888
lcd_out(1,7,txt)
end if
'Si se detecto algun tono con el cm8888...
IF actual.2 = 1 then
'OBTENGO EL TONO DETECTADO CON EL CM8888
valor = CM8888(LEER,DATOS,0)
'muestro por el lcd y hago un retardo...
bytetostr(valor,txt)
lcd_out(2,7,txt)
delay_ms(300)
end if
'retardo y regreso a la rutina
delay_ms(200)
goto Principal
end.
Ya la probe y me funciona a la perfecccion, ahora la idea seria mas en centrarse en controlar la funcion CP para detectar el estado de la linea telefonica...
ojala pueda servirle a alguien mas :mrgreen:
y como nota cabe decir que esta libreria consume apenas el 2% de la memoria de programa del pic, muy bajo comparado con el 14% de la libreria anterior.
un saludo!
-
Hi, sorry, only English for me, I modified some the code to can initialize better the pic's pin about 8880 devices, here my code (made with last mikrobasic compiler 3.8)
this is the library:
module lib_cm8888
dim D3 as bit
dim D2 as bit
dim D1 as bit
dim D0 as bit
dim P_DATA as byte
dim P_CONF as byte
dim CS as bit
dim RSO as bit
dim R_D as bit
dim W_R as bit
dim IRQ as bit
'funciones
dim LEER as byte
dim ESCRIBIR as byte
'Bancos
dim DATOS as byte '
dim ESTADO as byte
dim CONTROL as byte
Sub Function CM8888(Dim Funcion as Boolean, Dim Banco as Boolean, Dim Tono as Byte) as Byte
Sub Procedure CM8888_INIT (dim byref port_conf as byte, dim byref port_data as byte,dim dd0 as byte ,dim dd1 as byte,dim dd2 as byte,dim dd3 as byte,dim byref cs_port as byte, dim ccs as byte,dim rrso as byte ,dim rr_d as byte ,dim ww_r as byte , dim iirq as byte )
implements
'*******************************************************************************
'*******************************************************************************
' PROCEDIMIENTOS Y FUNCIONES
'*******************************************************************************
'*******************************************************************************
Sub Function CM8888(Dim Funcion as Boolean, Dim Banco as Boolean, Dim Tono as Byte) as Byte
'Variable Auxiliar
Dim BUF as byte
P_DATA.D0 = 0
P_DATA.D1 = 0
P_DATA.D2 = 0
P_DATA.D3 = 0
if FUNCION = LEER then
P_CONF.D0 = 1
P_CONF.D1 = 1
P_CONF.D2 = 1
P_CONF.D3 = 1
'Direcciono hacia los registros status o control
RSO = Banco
'Habilito la lectura
R_D = 0
'Desabilito la escritura
W_R = 1
'Habilito el cm8888
CS = 0
BUF = 0
'Leo los datos
BUF.0 = P_DATA.D0
BUF.1 = P_DATA.D1
BUF.2 = P_DATA.D2
BUF.3 = P_DATA.D3
'Finalizo el cm8888
CS = 1
'Retorno el valor
CM8888 = BUF
else
'Configuro el puerto como salida
P_CONF.D0 = 0
P_CONF.D1 = 0
P_CONF.D2 = 0
P_CONF.D3 = 0
'Selecciono transmicion/recepcion de datos
RSO = Banco
'Desabilito la lectura
R_D = 1
'Habilito la escritura
W_R = 0
'Habilito el cm8888
CS = 0
'Escribo el dato
P_DATA.D0 = Tono.0
P_DATA.D1 = Tono.1
P_DATA.D2 = Tono.2
P_DATA.D3 = Tono.3
'"Finalizo" el cm8888
CS = 1
CM8888 = 255
end if
End sub
Sub Procedure CM8888_INIT (dim byref port_conf as byte, dim byref port_data as byte,dim dd0 as byte ,dim dd1 as byte,dim dd2 as byte,dim dd3 as byte,dim byref cs_port as byte, dim ccs as byte,dim rrso as byte ,dim rr_d as byte ,dim ww_r as byte , dim iirq as byte )
Dim aux as byte
D3 = dd3 '3
D2 = dd2 '2
D1 = dd1 '1
D0 = dd0 '0
P_DATA = port_data 'PORTC
P_CONF = port_conf 'TRISC
'Pines de control
CS = CS_port.ccs 'PORTB.4
RSO = CS_port.rrso 'PORTB.3
R_D = CS_port.rr_d 'PORTB.2
W_R = CS_port.ww_r 'PORTB.1
IRQ = CS_port.iirq 'PORTB.0
'funciones
LEER = 0
ESCRIBIR = 1
'Bancos
DATOS = 0
ESTADO = 1
CONTROL = 1
CS = 0
aux = CM8888(LEER,ESTADO,0)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(ESCRIBIR,CONTROL,8)
aux = CM8888(ESCRIBIR,CONTROL,0)
aux = CM8888(LEER,ESTADO,0)
CS = 1
end sub
end.
and this is the main file code:
program cm8888
include "lib_CM8888"
'funciones
Symbol LEER = 0
Symbol ESCRIBIR = 1
'Bancos
Symbol DATOS = 0
Symbol ESTADO = 1
Symbol CONTROL = 1
'Variables
Dim actual as byte
Dim valor as char
Dim txt as string [3]
'lcd_init
'''''LCD_CONFIG(PORTC,4,5,6,7,PORTB,5,6,7)
dim LCD_RS as sbit at RB6_bit
LCD_EN as sbit at RB7_bit
LCD_D4 as sbit at Rc4_bit
LCD_D5 as sbit at Rc5_bit
LCD_D6 as sbit at Rc6_bit
LCD_D7 as sbit at Rc7_bit
LCD_RS_Direction as sbit at TRISB6_bit
LCD_EN_Direction as sbit at TRISB7_bit
LCD_D4_Direction as sbit at TRISc4_bit
LCD_D5_Direction as sbit at TRISc5_bit
LCD_D6_Direction as sbit at TRISc6_bit
LCD_D7_Direction as sbit at TRISc7_bit
' End Lcd module connections
main:
'Configuro los puertos
TRISC = 0
PORTC = 0
TRISB = 0
PORTB = 0
'Configuro e inicializo el cm8888
LCD_init()
LCD_CMD(_Lcd_Clear)
'Inicializo el cm8888 o el mt8888 segun el datasheet
cm8888_init(trisc, portc, 3,2,1,0,portb,4,3,2,1,0)
'Muestro mensajes al usuario
Lcd_out(1,1,"Configurando reg")
Lcd_out(2,1,"De control...")
delay_ms(1000)
Principal:
'CONFIGURO EL CM8888 PARA GENERAR TONOS EN MODO BURST
'RSEL=1, IRQ=1, DTMF/CP=0, TOUT=1
actual = cm8888(ESCRIBIR,CONTROL,%1101)
'C/R=0, S/D=0, TEST=0, BURST = 0
actual = cm8888(ESCRIBIR,CONTROL,0)
'Genero el tono 7
actual = cm8888(ESCRIBIR,DATOS,7)
Delay_ms(102)
'Limpio el lcd y muestro informacion
lcd_cmd(_lcd_clear)
lcd_out(1,1,"StaTuS: ")
lcd_out(2,1,"Dato: ")
'OBTENGO EL ESTADO DEL CM8888
actual = CM8888(LEER,ESTADO,0)
bytetostr(actual,txt)
'si se prensento una interrupcion en el cm8888
IF actual.0 = 1 then
'Muestro el valor del registro estatus del cm8888
lcd_out(1,7,txt)
end if
'Si se detecto algun tono con el cm8888...
IF actual.2 = 1 then
'OBTENGO EL TONO DETECTADO CON EL CM8888
valor = CM8888(LEER,DATOS,0)
'muestro por el lcd y hago un retardo...
bytetostr(valor,txt)
lcd_out(2,7,txt)
delay_ms(300)
end if
'retardo y regreso a la rutina
delay_ms(200)
goto Principal
end.
bye!
-
Amigo Ekud. Observando tu esquema, me asalta una duda: cuando se encuentra presente un ingreso dtmf al 8888, como interpreta el pic el comienzo y final de este tono ??
-
Amigo Ekud. Observando tu esquema, me asalta una duda: cuando se encuentra presente un ingreso dtmf al 8888, como interpreta el pic el comienzo y final de este tono ??
hola krostby, bueno veras hace mucho tiempo no volvi a trabajar con el circuito integrado por lo cual no recuerdo en detalle como lo hace pero si mal no recuerdo eso lo logras leyendo los datos generados por las lineas D0 a D3, primero debes acceder al registro de estado y verificas si llego algun tono... en cuanto verifiques esto accedes al registro de datos y lees los datos que te envia el 8888, los datos que el circuito integrado te envia corresponden al tono DTMF detectado, debes mirar el datasheet para ver la tabla del dato que te envia en relacion al tono detectado.
Utilizando la libreria que hice hace algun tiempo, esta te devuelve el byte que corresponde al tono deetectado... solo seria cuestion de que con un "Select case" o algo asi determines que tono se detecto, para ello mira el ejemplo que subi, de todas formas la parte que podria interesarte en cuestion seria esta:
'OBTENGO EL ESTADO DEL CM8888
actual = CM8888(LEER,ESTADO,0)
bytetostr(actual,txt)
'si se prensento una interrupcion en el cm8888
IF actual.0 = 1 then
'Muestro el valor del registro estatus del cm8888
lcd_out(1,7,txt)
end if
'Si se detecto algun tono con el cm8888...
IF actual.2 = 1 then
'OBTENGO EL TONO DETECTADO CON EL CM8888
valor = CM8888(LEER,DATOS,0)
'muestro por el lcd y hago un retardo...
bytetostr(valor,txt)
lcd_out(2,7,txt)
delay_ms(300)
end if
espero haberte ayudado.. un saludo!
-
Hola amigos, saben estoy tratando de realizar un proyecto similar al de ustedes; pero estoy usando otro lenguaje de programación (assembler) el caso esq no tengo muy claro el funcionamiento de DTMF q usan, no sé si me podrian brindar algo de información o algun link de donde pueda guiarme, Gracias =)