miércoles, 6 de agosto de 2014

Reloj SPI KL25Z

RELOJ DIGITAL CON SPI

DESCRIPCIÓN

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:


La conexión en serie de los dígitos del reloj se muestra en el diagrama siguiente:






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.



       EVIDENCIAS

       CÓDIGO

DMA KL25Z

DAC_ADC_DMA

DESCRIPCIÓN

El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes del microcontrolador acceder a la memoria del sistema para leer o escribir independientemente del CPU principal. 

Una transferencia DMA consiste principalmente en copiar un bloque de memoria de un dispositivo a otro. En lugar de que la CPU inicie la transferencia, la transferencia se lleva a cabo por el controlador DMA. En este caso se moverán los datos obtenidos por el ADC a un registro declara como variable en la memoria RAM definido como adc_ch0[]. Tal operación no ocupa al procesador y, por ende, éste puede efectuar otras tareas. Las transferencias DMA son esenciales para aumentar el rendimiento de aplicaciones que requieran muchos recursos.



OBJETIVO


Al realizar este programa será utilizada la tarjeta FRDM-KL25Z y los objetivos a lograr serán los siguientes:
  • Realizar por medio del DAC una onda senoidal de 60Hz.
  • Por medio del ADC medir esta onda generada para poder almacenarla posteriormente en muestras usando el DMA.
  • Poder utilizar el DMA por medio de dos canales distintos (en la FRDM-KL25Z hay 4 canales).
  • Configurar adecuadamente los dos canales utilizados desde los registros de origen, de destino, el tamaño del bloque a transferir, etc.
  • Realizar el monitoreo de datos por medio de FreeMaster.
  • Poder modificar la señal senoidal generada (en amplitud y frecuencia) mediante FreeMaster.



HARDWARE

Para esta práctica se requiere solamente:
  • tarjeta FRDM-KL25Z
  • puente físico para conectar DAC con ADC



ARQUITECTURA DEL SOFTWARE

Se explica brevemente lo que debe hacer nuestro programa:
  • El programa se encargará de sacar por medio del DAC una señal senoidal de 60Hz y amplitud Maxima 1.15Vcc.
  • Debido a que la FRDMKL25Z solo maneja un umbral de voltaje de 0 a 3.3Vcc a la señal senoidal generada se le deberá sumar un offset de 1.15Vcc para que pueda apreciarse su forma completa en el rango de voltaje que maneja el DAC.
  • EL DAC será disparado automática y periódicamente por un timmer TU1 de esta manera no se tendrá que recurrir a interrupciones o instrucciones dentro de las funciones o programa principal.
  • El ADC estará midiendo esta señal senoidal generada con una frecuencia de muestreo de 3,840Hz.
  • El ADC estará configurado de manera que esté realizando mediciones periódicas, es decir será disparado continuamente por un timmer TU2. De esta manera no se tendrá que recurrir a interrupciones o instrucciones dentro de las funciones o programa principal.
  • Es necesario hacer físicamente un puente entre el pin de salida del DAC y el pin de entrada del ADC.
  • Los valores obtenidos por el ADC serán directamente almacenados en otro registro, esta tarea será ejecutada por el canal 1 del DMA.
  • Este ciclo se estará generando permanentemente pero también podrán modificarse dos variables que son la amplitud y la frecuencia de la onda senoidal.
  • Hay dos funciones específicas para poder variar la frecuencia y valores de amplitud de la señal senoidal.
  • Para modificar y a su vez monitorear la señal senoidal se usará FREEMASTER el cual tendrá estas dos variables como entradas.


DIAGRAMAS DE BLOQUES

Figura 1. Diagrama de flujo de la función main()


Figura 2. Diagrama de flujo de la función mide_rms()


Figura 3. Diagrama de flujo de la función gen_sen()


Figura 4. Diagrama de flujo de la interrupcion TU1_OnCounterRestart()


Figura 5. Diagrama de flujo de la interrupción DMAT1_OnComplete()


Figura 6. Diagrama de flujo de la interrupción DMAT2_OnComplete()




TABLA DE FUNCIONES
  
ProccesorExpert.c
main()
// Función principal del programa, en esta se inicializan los dispositivos ADC, DAC, los dos canales del DMA y los timmer’s que dispararán al DAC y al ADC.
Tambien este programa tiene el bucle infinito encargado primero de modificar los datos para el DAC el cual leerá los datos del registro gen_seno[] el cual previamente es moficiado por la función gen_sen().
Después la función mide_rms() encargada de realizar la medición de la señal generada utilizando el ADC.
gen_sen()
// Función que modifica el registro declarado gen_seno[], este registro contiene los 32 datos usados como base para generar un ciclo senoidal de 1.15Vcc y es el que será desplegado continuamente por el DAC. Sumándole al registro un OFFSET para que la señal se muestre en el rango de 0 a 3.3Vcc y la multiplica por una escala de 0 a 100 según lo que mandemos con FreeMaster.

mide_rms()
// Función encargada de calcular el Vrms medido por el ADC, para realizar bien esta tarea será necesario utilizar 32 muestras obtenidas por el ADC y después aplicar la formula siguiente:









Events.c
DMAT1_OnComplete
(LDD_TUserData *UserDataPtr)
// Esta función se encarga de asignar las direcciones donde iniciará y donde terminará el bloque en el cual serán almacenadas las 64 muestras obtenidas por el ADC para que posteriormente el DMAT1 reescriba los datos en dicho bloque.
TU1_OnCounterRestart
(LDD_TUserData *UserDataPtr)
// Esta interrupción del TU1 es la encargada de dar periódicamente la instrucción al DAC para que este despliegue los datos leídos del registro declarado en el programa como seno[].


DMAT2_OnComplete
(LDD_TUserData *UserDataPtr)
// Esta interrupción hace que el DMAT2 transfiera los datos obtenidos (al medir la señal senoidal con el ADC) al FreeMaster.




CONFIGURACIÓN DE LOS COMPONENTES

Los componentes utilizados de los cuales se muestra su respectiva configuración son los siguientes:





DMAT1

Canal 1 del DMA, este será el canal principal y que se encargará de almacenar los datos en el registro declarado como adc_ch0[] cada que el ADC realiza una medición hasta hacer un acumulado de 64 mediciones.





DMAT2

Este canal del DMA se encargará de hacer un acumulado de datos para estarlos enviando por medio de UART y FreeMaster, el envío de datos será de dos en dos bytes.




AD1

Dispositivo ADC con sus respectivas configuraciones y con el cual se leera la señal generada por el DAC, se puede ver en la configuración que haremos referencia a TU2 que será quien dispare automáticamente la lectura del ADC.




DA1

Dispositivo DAC encargado de general la señal senoidal.





TU1

Este dispositivo es el timmer que se encargará de disparar al DAC para que continué generando la señal de salida.




FMSTR1 

Configuración para el Free Master.





DMA1 

Esta es la configuración general del DMA la cual será agregada automáticamente por Proccesor Expert.





TU2

Este timmer será el responsable de disparar las mediciones del ADC, y será generado al agregarlo dentro de la configuración del AD1 mencionada anteriormente.






domingo, 3 de agosto de 2014

DataLogger K64F


DataLogger K64F



DESCRIPCIÓN

Un registrador de datos (datalogger) es un dispositivo electrónico que registra datos en el tiempo o en relación a la ubicación por medio de instrumentos y sensores propios o conectados externamente.

Uno de los principales beneficios del uso de registradores de datos es la capacidad para recopilar automáticamente datos las 24 horas del día. Tras la activación, los registradores de datos normalmente se dejan sin vigilancia para medir y registrar la información durante toda la duración del período de seguimiento.

Se programará la tarjeta FRDM-K64F como registrador de datos, midiendo y guardando a cada segundo los valores del acelerómetro. Todos estos datos recopilados se almacenaran en una tarjeta SD.



OBJETIVO

Al realizar este recopilador de datos se aprenderán a programar las siguientes tareas en la FRDM-K64F:
  • FAT1, específicamente la tarjeta SD
  • Acelerómetro (integrado en la tarjeta) y su configuración I2C
  • El nuevo dispositivo llamado UTIL que incluye una serie de funciones específicas para manejar datos y variables como caracteres




HARDWARE

Para esta práctica se requiere solamente:
  • Tarjeta FRDM-K64F
  • Tarjeta micro SD



ARQUITECTURA DEL SOFTWARE

Se explica brevemente lo que debe hacer nuestro programa:
  • Cada segundo se tomará la lectura del acelerómetro en x, y, z.
  • Estos datos leídos serán escritos como una línea o renglón y almacenados dentro de un archivo con formato *.txt guardando también en la misma línea la hora, minuto y segundo en que se tomó la medición.
  • Cada archivo *.txt tendrá 60 muestras (líneas o renglones) del acelerómetro, una por segundo.
  • Un nuevo archivo *.txt será creado cada minuto y cuyo nombre incluirá los datos de la hora (hora, minuto, segundo) a la que se creó.
  • Cada hora se creará una nueva carpeta y cuyo nombre incluirá los datos de la fecha (día y mes) así como la hora en la que fue creada.
  • Cada carpeta incluirá 60 archivos, uno por minuto.
  • Habrá dos botones, uno para PAUSAR el sistema y en ese momento poder retirar sin problemas la tarjeta SD.
  • El otro botón será para restaurar el sistema y poder en ese momento montar nuevamente la tarjeta SD al sistema y este siga recopilando datos.
  • Se configurarán los LEDs de manera que el sistema trabajando inicialmente mostrará un parpadeo continuo (verde y azul) ya que:
    •  Mientras se guarde una medición se mostrara luz azul.
    • Pasada la medición se mostrara luz verde.
    • Si el sistema es pausado se mostrará luz magenta.
    • Si existe un error se mostrara luz roja de manera permanente.


DIAGRAMAS DE BLOQUES


Figura 1. Diagrama de flujo para configuración del App_Run()



Figura 2. Diagrama de flujo para la conversión de datos recopilados



Figura 3. Diagrama de flujo para configuración del Check_SWs()


Figura 4. Diagrama de flujo para configuración del Folder_Name()


Figura 4. Diagrama de flujo para configuración del File_Name()



TABLA DE FUNCIONES

Funciones en main.c
APP_Run()
// Función que es llamada como función principal del programa, en este caso es llamada como un subprograma llamado desde la función ‘int main(void)’.



Funciones en Application.c
APP_Run()
// Como ya se mencionó es la función principal del programa, está declarada dentro del archivo Application.c y se usa dentro de este en vez de un ‘int main(void)’.
Esta función inicializa las tomas de los tiempos, inicializa al acelerometro, inicializa el sistema FAT1,  monta la tarjeta SD, realiza la lectura de los datos x, y, z del acelerómetro incluido en la K64F, crea la primer carpeta donde se empezarán a almacenar los datos recopilados y hace el llamado al resto de las funciones. Al ejecutarse encenderá el LED azul.
Folder_Name()

// Función encargada de formar el nombre de las carpetas o directorios donde se almacenarán los archivos de datos recopilados por el datalogger, cada carpeta tendrá contenido en su nombre los datos del día, mes y hora en que se esté realizando la medición.

File_Name()

// función que formará el nombre de cada archivo donde se guardaran los datos recopilados, cada minuto un nuevo archivo será creado y su nombre contendrá los datos directorio de almacenamiento, hora y minuto en que se están realizando las mediciones así como la terminación ‘.txt’ para indicar el formato del archivo.

LogToFile(int16_t x, int16_t y, int16_t z)
// Función encargada de juntar los datos de tiempo (hora, minuto y segundo) y del acelerómetro (valor de x, y, z) para convertirlos a caracteres y después guardarlos dentro de una cadena de caracteres que formarán cada una de las líneas guardadas en los archivos de datos recopilados, finalmente escribe dicha línea en el archivo creado y abierto previamente dentro de la tarjeta SD.

Check_SWs()
// Función encargada de checar los dos interruptores utilizados como pausa y reanudar. Al ejecutarse se encenderá el LED verde y si el botón de pausa es presionado se iluminará la combinación magenta.

Err()
// Función utilizada en caso de que exista algún error al ejecutarse algún comando de FAT1 o de TmDt1, si esto sucede el programa se quedará atrapado ahí y el LED rojo quedará iluminado permanentemente.










COMPONENTES

Se describe a continuación la lista de los componentes principales utilizados en esta práctica:




También hay componentes referenciados, algunos directamente al insertar los componentes de arriba, otros serán notificados por un asistente de proccesor expert el cual automáticamente nos pide crearlos, mientras otros deberemos crearlos nosotros (algunos de los componentes de arriban marcaran error mientras no los insertemos). Los componentes referenciados son los siguientes:






CONFIGURACIÓN DE LOS COMPONENTES


ACELEROMETRO - FXOS8700CQ

Insertando el componente FXOS8700CQ de la librería nos creará tres componentes referenciados que tienen las configuraciones necesarias para la comunicación mediante 12C; las configuraciones son las siguientes:








UTILITY

Este como tal no es un componente sino más bien es una librería con un conjunto de funciones complementarias muy útiles al momento de formar palabras, textos o mejor dicho cadenas de caracteres partiendo de valores de variables y datos numéricos.




RED, GREEN y BLUE (LEDs)

Se dieron de alta los tres LEDs integrados en la KF64, su configuración es la siguiente:




SWITCHs

Utilizados para pausar y reanudar la grabación de datos también se utilizan los dos botones integrados en la FRDMK64F.




TimerInt

Este componente es una interrupción por timmer, y se utiliza como evento únicamente para dar el periodo de tiempo (cada 100ms) utilizado por el GenericaTimeDate.





FAT1

El Sistema FAT es uno de los formatos más populares para almacenamientos de datos en unidades portátiles por lo tanto es el que CODE WARRIOR utilizara para los componentes como memorias USB y SD, es por ello que será el componente principal que habrá de instalarse al momento de querer utilizar la tarjeta SD. La configuran del dispositivo FAT así como sus dispositivos referenciados será la siguiente:





GenericTimeDate

Este componente se encarga de generar la cuenta de tiempo (horas, minutos, segundos y centésimas de segundo) y fecha (día, mes y año) en este caso el sistema FAT lo ocupará para poner la fecha y hora a la que se han creado o modificado archivos y carpetas que contiene la tarjeta SD.





SD_Card

En la configuración de esta se consideran aspectos como las frecuencias para montaje y escritura, el puerto SPI que será utilizado para su comunicación con la FRDK64F, los pines para su detección entre otros. Su configuración así como sus componentes referenciados son los siguientes:




SM1

Dispositivo para la configuración del puerto SPI que será utilizado para lograr la comunicación con la tarjeta SD.




WAIT1

Utiliza el mismo que es referenciado por el acelerómetro, por lo que no será necesario agregarlo otra vez.



TimeOut 

Este componente también es generado automáticamente y a su vez cargará el componente SC1. No hay que modificarle nada.





CS1 

Otro componente generado automáticamente y al que no hay que hacerle cambios.