RELOJ DIGITAL CON SPI
El SPI (Serial Peripheral Interface) es un estándar de
comunicaciones muy comúnmente utilizado para la comunicación en circuitos
electrónicos, microcontroladores y otros componentes. En este caso se tiene un
reloj de pared que muestra 8 dígitos (días, horas, minutos, segundos), cada
dígito es accionado por un circuito integrado TPIC6B595 el cual es un registro
de corrimiento de 8 bits, este circuito es fácilmente configurable para
trabajar en serie y formar una gran cadena de corrimiento de datos y también es
fácilmente configurable para utilizarlo por medio de SPI, lo el cual es el caso
específico de esta práctica, ya que se tendrán 8 TPIC6B595 (uno por dígito)
conectados en serie para hacer funcionar nuestro reloj de pared.
OBJETIVO
Al realizar este driver SPI para el reloj digital será utilizada la tarjeta FRDM-KL25Z y los objetivos a lograr serán los siguientes:
- Poder utilizar el puerto SPI definido como SM1 en la librería de componentes.
- Configurar adecuadamente el puerto SPI utilizado acorde a las especificaciones y configuración del circuito TPIC6B595.
- Realizar el programa para un contador regresivo que contemple días, horas, minutos y segundos para poder ser desplegado en un reloj digital.
HARDWARE
Para esta práctica se requiere:
- Tarjeta FRDM-KL25Z
- Reloj de pared con drivers TPIC6B595
Se muestra el diagrama de conexión del TPIC6B595 y la configuración hecha en la KL25Z, las terminales marcadas de la A a la G son cada uno de los 7 segmentos del display, la X no es utilizada, la entrada de datos es por SER_IN y la salida es por SER_OUT.
El diagrama de cada DISPLAY 7 SEGMENTOS:
La tabla de conexiones entre el TPIC6B595 y el display se muestra a continuación:
ARQUITECTURA DEL SOFTWARE
Se explica brevemente lo que debe hacer nuestro programa:
- · Tras lograr la configuración necesaria para que la KL25Z pueda comunicarse adecuadamente con el reloj digital (ajustando las frecuencias, los pines de salida, y configuraciones de funcionamiento especificas del SM1 como la polaridad y fase) se procederá a:
- Mediante un timmer poder lograr una interrupción cada segundo (se espera que sea lo más aproximado a un segundo real), esta será el punto de partida para el conteo regresivo del reloj.
- Como ya se dijo cada segundo será el punto de partida para que estos vayan modificando los minutos, y estos las horas y finalmente los días, hay una función encargada de realizar estas modificaciones segundo a segundo.
- Cada segundo se obtiene un nuevo valor para segundos, minutos, horas y días, estos valores numéricos serán separados primero en dígitos (considerando que cada uno cuenta con dos dígitos: unidades y decenas) mediante una función.
- Conforme se obtiene los 8 dígitos uno a uno, los valores numéricos de estos serán almacenados en un registro, esto es realizado por otra función.
- Otra función se encargara de convertir estos valores numéricos a su equivalente en datos binarios necesarios para iluminar el display de 7 segmentos de acuerdo al número que se quiera mostrar en la pantalla del reloj. Finalmente otra función se encargará de enviar por medio de SPI todos estos datos en binario, de manera que el reloj ira recibiendo bit a bit los 64 datos necesarios (8 bits por digito para iluminar los 8 dígitos) y terminada la transferencia se podrá desplegar el tiempo transcurrido hasta el momento.
DIAGRAMAS DE FLUJO
Figura
4. Diagrama de flujo de la función main()
Figura 5. Diagrama de flujo de la función
f_fecha_reloj()
Figura 6. Diagrama de flujo de la función f_num2dig()
Figura 7. Diagrama de flujo de la función f_dato2digito()
Figura 8. Diagrama de flujo de la función F_despliega_digitos()
Figura 9. Diagrama de flujo de la función F_dato_7seg()
TABLA_DEC_7SEG donde están guardados los 10 valores numéricos a valores binarios para encender correctamente el display de 7 segmentos.
Figura 10. Diagrama de flujo de la función TI1_OnInterrupt(Void)
TABLA DE FUNCIONES
Funciones en ProccesorExpert.c
|
|
main()
|
//
Función principal del programa, en esta se configura el tiempo inicial desde
el cual partirá la cuenta regresiva y tendrá un bucle infinito para estar
llamando a las funciones f_fecha_reloj() , f_num2dig() y
f_despliega_digitos().
|
f_fecha_reloj()
|
//
Función que se encargará segundo a
segundo de actualizar el tiempo e irlo decrementando hasta llegar a las
00:00:00:00.
|
f_num2dig()
|
//
Función encargada de separar los valores numéricos de días, horas, minutos y
segundos en dígitos, es decir unidades y decenas, ara esto mandará a llamar a
la función f_dato2dig().
|
f_dato2dig()
|
//
Convertirá los valores numéricos a dígitos, a su vez mandara a llamar a
f_dato_7seg().
|
f_dato_7seg()
|
//
Dependiendo el resultado (entre 0 y 9) tendremos un correspondiente valor
binario asignado en el registro TABLA_DEC_7SEG para poder enviar este dato a
los TPIC6B595 y estos alimenten los displays adecuadamente.
|
f_despliega_digitos()
|
//
Mandará los datos binarios generados por f_num2dig() a través del puerto SPI
a los TPIC6B595 y finalmente mandará un ‘1’ breve a través de la salida
asignada SS para que mandados todos los datos los 8 TPIC6B595 estos activen
los LEDs de los 8 displays.
|
f_delay(int j)
|
//
Esta función creará un retardo basándose en ciclos del procesador tanto para
contar los segundos del reloj como para los pequeños retardos usados para la
salida SS.
|
Funciones en Evens.c
|
|
TI1_OnInterrupt(void)
|
//
Esta función llamada por interrupción lo único que hará será decrementar dos
contadores (timmer y timmer_envio) que serán utilizados por otra funciones
para contar el tiempo y los retardos.
|
COMPONENTES
Se describe a continuación la lista de los componentes principales utilizados en esta práctica:
Al insertar el componente TI1 automáticamente generará un componente referenciado (TU1) al cual no es necesario hacer modificación alguna.
CONFIGURACIÓN DE LOS COMPONENTES
SM1
Este componente es para la configuración del puerto SPI. Hay que poner especial atención en dos de las configuraciones (marcadas en recuadro) de las cuales dependerá la correcta comunicación con los TPIC6B595.
TimerInt
Este componente es una interrupción por timmer, y se utiliza como evento para dar el periodo de tiempo para contar los segundos y para generar los retardos.
El tiempo será determinado por la frecuencia (interrupt period) multiplicada por el valor inicial dado en la variable timmer el cual es de 8000.
122us x 8000 = 0.976s
SS
Este componente es un simple bit de salida que será utilizado como el SS del SPI es decir será el que mande el pulso que indica el fin de una transmisión de datos.