Autor Tema: CM8888 y Mikrobasic  (Leído 5045 veces)

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

Desconectado ekud

  • PIC16
  • ***
  • Mensajes: 120
    • mi pag... bueno no es mia pero ahi estoy
CM8888 y Mikrobasic
« 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...

Código: [Seleccionar]

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

Código: [Seleccionar]
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!


« Última modificación: 10 de Marzo de 2009, 05:51:12 por ekud »
No cometas el crimen varon si no vas a cumplir la condena

Desconectado ekud

  • PIC16
  • ***
  • Mensajes: 120
    • mi pag... bueno no es mia pero ahi estoy
Re: CM8888 y Mikrobasic
« Respuesta #1 en: 13 de Marzo de 2009, 07:46:17 »
Bueno, no se si alguien ha usado el codigo o algo pero ps por ahora quieria notificarles de los avances.

En el ejemplo anterior:
Código: [Seleccionar]
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:

Código: [Seleccionar]
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!
« Última modificación: 13 de Marzo de 2009, 08:04:35 por ekud »
No cometas el crimen varon si no vas a cumplir la condena

Desconectado ekud

  • PIC16
  • ***
  • Mensajes: 120
    • mi pag... bueno no es mia pero ahi estoy
Re: CM8888 y Mikrobasic
« Respuesta #2 en: 09 de Abril de 2009, 17:56:58 »
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:

Código: [Seleccionar]


'*******************************************************************************
'*******************************************************************************
'  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:

Código: [Seleccionar]
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!
« Última modificación: 09 de Abril de 2009, 18:07:23 por ekud »
No cometas el crimen varon si no vas a cumplir la condena

Desconectado ervius

  • PIC10
  • *
  • Mensajes: 1
Re: CM8888 y Mikrobasic
« Respuesta #3 en: 16 de Junio de 2010, 09:30:35 »
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:
Código: [Seleccionar]
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:
Código: [Seleccionar]
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!

Desconectado krostby

  • PIC10
  • *
  • Mensajes: 33
Re: CM8888 y Mikrobasic
« Respuesta #4 en: 05 de Julio de 2010, 21:45:22 »
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 ??

Desconectado ekud

  • PIC16
  • ***
  • Mensajes: 120
    • mi pag... bueno no es mia pero ahi estoy
Re: CM8888 y Mikrobasic
« Respuesta #5 en: 05 de Julio de 2010, 23:54:33 »
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:

Código: [Seleccionar]
   '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!
« Última modificación: 05 de Julio de 2010, 23:56:57 por ekud »
No cometas el crimen varon si no vas a cumplir la condena

Desconectado MarioA

  • PIC10
  • *
  • Mensajes: 9
Re: CM8888 y Mikrobasic
« Respuesta #6 en: 06 de Agosto de 2012, 23:10:16 »
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 =)