16F877A y DTMF HT9200

Hola

Tengo un circuito que tiene un PIC 16F877A con RB6 (pin 39) conectado al clock del DTMF HT9200 (pin 5) y el RB7 (pin 40) conectado a data (pin6). A este circuito no lo puedo redise=F1ar, solamente puedo reprogramar el pic.

El CLK del DTMF tiene una vel max de 500 Khz (ideal 100 Khz), y segun el datasheet del DTMF "The HT9200A/B will latch data on the falling edge of the clock (CLK pin)." el bit de datos puede ser enviado a partir del flanco descendente del clock, ocupando un ciclo completo (descendente a descendente)

El problema que no se como resolver esta en que RB6 no funciona como clock, es un puerto I/O estandard y no se me ocurre como sincronizar el flanco descendente de cada ciclo que mando por RB6 con el envio del bit por RB7.

Resumido: necesito hacer funcionar RB6/RB7 sincronizados para la transmision serial, necesito mantener un sincronismo entre los datos enviados por RB7 y el clock enviado por RB6.

Muchas gracias. Saludos.-

Reply to
LucasBols
Loading thread data ...

LucasBols escribió:

Esos pines son entradas de datos y reloj para programar el micro, probablemente eso confundió al que hizo el esquema y le hizo ignorar el SPI del puerto C.

Tienes que hacer toda la transmisióno por software. En pseudo código:

; Inicializar los pines como salida RB6.Direccion = Salida RB7.Direccion = Salida ; Valor en reposo para CLK RB6 = 1 ... ; Transmito un bit RB7 = Bit ; Espero el tiempo que necesite el HT9200 entre el cambio ; de Data y el de CLK (ver datasheet) Delay(A) ; Flanco descendente RB6 = 0 ; Espero el tiempo que necesite el HT9200 entre dos cambios ; de CLK (ver datasheet) Delay(B) RB6 = 1 ; Espero el tiempo que necesite el HT9200 entre el cambio ; de CLK y el de data (ver datasheet) Delay(C) ; Transmito otro bit RB7 = OtroBit ...

--
Saludos
Miguel Giménez
Reply to
Miguel Gimenez

Hola Miguel

A lo que me respondes le encuentro un defecto :) al HT9200 le tengo que mandar el cambio de estado (el flanco descendente) en el mismo momento (en el mismo ciclo del 16F877A) en que le mando en bit de datos, si no, no me genera el tono que deseo para discar.

Muchas gracias Saludos.-

Reply to
LucasBols

LucasBols escribió:

Acabo de repasar el datasheet del HT9200A y no es así, tienes que dar el valor a DATA con CLK alto y *después* bajar CLK. Este método es el normal, ya que tienes que respetar el tiempo de propagación de los flip-flops antes de dar el pulso de reloj. Lamentablemente, el datasheet no menciona ese tiempo, pero hay una nota de aplicación de Holtek con código fuente, te adjunto el fragmento que te interesa:

*******************************************************************

send_0_9200:

clr DATA ;clr data line jmp act_9200

send_1_9200:

set DATA ;set data line act_9200:

clr CLK ;generate negative edge for latch the data

set CLK

*******************************************************************

El código completo está en:

formatting link

Si aun así quieres cambiar los dos valores a la vez, tienes que utilizar MOVWF en vez de BCF o BSF.

-- Saludos Miguel Giménez

Reply to
Miguel Gimenez

Hola

No, las cosas no van as=ED. Lo que te dice en el datasheet es que el chip lee el valor del pin de datos cuando se produce el flanco de bajada del reloj. Pero ese valor en el pin de datos tiene que estar un rato antes de ese flanco y mantenerse un rato despu=E9s para un funcionamiento fiable. Es decir no tienes que cambiar ambas salidas a la vez, lo que tienes que hacer es poner el dato primero (el dato se quda ah=ED tras ponerlo hasta que pones otro valor), luego esperar un tiempo prudencial y a continuaci=F3n hacer el flanco de bajada, y esperar otro rato prudencial. En el datasheet deber=EDa indicarte cu=E1les son estos tiempos a esperar m=EDnimos, aunque si no dice nada puedes obviarlos y si hay problemas ir aument=E1ndolos hasta que funcione bien.

Si cambias el dato y el reloj a la vez con mucha probabilidad el chip leera el dato anterior y no el que acabas de escribir, aunque dependiendo de los tiempos de propagaci=F3n de cada se=F1al la cosa podr=ED= a variar o ser aleatoria.

Reply to
Jeroni Paul

Hola

Miguel y Paul, me solucionaron el problema, como siempre :) Probe con escribir el dato antes de mandarle el clock y funciono.

Muchisimas gracias.

Saludos.

s

=EDa

Reply to
LucasBols

Hola

Retomo el tema despu=E9s de haber completado el c=F3digo gracias a la ayuda del grupo.

Estoy experimentando c>

...y al leer el datasheet del 877 veo que transmite 8 bits y el DTMF genera un tono con 5 bits, entonces supongo que no han utilizado los puertos C por esto mismo.

=BFEstoy en lo correcto? =BFO hay algo que no veo y puedo transmitir los datos al DTMF utilizando el SPI?

Muchas gracias. Saludos.-

Reply to
LucasBols

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.