p1 Soe Final
p1 Soe Final
p1 Soe Final
PRÁCTICA NO. 1
Túnel Sanitizante con máquinas de estado.
PRESENTA:
ALAN ALVARADO RAMÍREZ 17121109
BERENICE ARZATE RUEDA 17121144
JONATAN ALI MEDINA MOLINA 17121124
PROFESOR:
MIGUELANGEL FRAGA AGUILAR
En esta práctica se muestra el planteamiento y desarrollo realizado para elaborar una maqueta
que simule el funcionamiento de un túnel sanitizante con dos puertas, además, se explica el
programa escrito en Code Composer Studio que permite su funcionamiento.
La maqueta está compuesta por un interruptor que indique cuando se abra la puerta de entrada, al
cerrarse dicha puerta se enciende una bomba del rociador de sanitizante la cual permanece
encendida hasta que hayan transcurrido 30 segundos o hasta que se active un segundo interruptor
que además funciona para abrir la puerta de salida.
A. Temporizadores
Los temporizadores nos permiten controlar el paso del tiempo en el sistema [1]. Dentro de la
familia de microcontroladores MSP430 se mencionan dos tipos de temporizadores:
2. Watchdog: El WDT es un timer de 16-bit que puede ser usado como watchdog o
como un temporizador común. El módulo del WDT puede reiniciar el sistema si
después de un intervalo de tiempo asignado no hubo respuesta por parte del CPU [2].
Podemos decir entonces que es un temporizador específico que permite:
Controlar bloqueos software. Útil para generar un reset (PUC) tras la expiración
del tiempo del temporizador.
Generar eventos y en consecuencia provocar interrupciones transcurrido un
determinado intervalo de tiempo
El registro de control del WDT está protegido por una contraseña y está activo al
encender el microcontrolador.
Dentro de los timers vamos a encontrar que se tienen dos tipos: Timer_A y Timer_B. Ambos son
equivalentes, aunque los del tipo B son algo más versátiles puesto que ofrecen algunas
características adicionales que no ofrecen los del tipo A [3].
Hay dos tipos de bloques bien diferenciados dentro de los timers para abordar la configuración de
dichos bloques se mencionarán las características específicas para el Timer_A.
B. Bloque Contador
El bloque contador dispone de un contador de 16 bits llamado TAxR (donde x será 0 para el
timer TA0 y así sucesivamente). Para controlar este bloque se utiliza el registro TAxCTL [3].
Dentro del registro TAxCTL se encuentran diferentes campos los cuales se deben configurar de
acuerdo con los requisitos del programa que se vaya a implementar:
C. Bloque de captura/comparación
De acuerdo con [1] este bloque contiene registros que en combinación del registro TA0R
implementan las siguientes funcionalidades:
Se puede trabajar con tres bloques de dos registros (TA0CCRx y TA0CCTLx). Estos bloques
trabajan a la vez con el contador. La elección de la forma de trabajo para estos dos registros, es
decir, si trabajan en modo captura o comparación se hace a través del bit CAP del registro
TA0CCTLx:
Un 0 indica comparación.
Un 1 indica captura.
1. Modo captura.
Cuando sucede un determinado evento, el valor del registro TA0R se almacena en el registro
TA0CCRx. Ese evento es un cambio de nivel (flanco) de determinadas señales que pueden ser o
bien externas o internas. Cuando se produce ese evento, trabajando en modo captura, se activa el
flag de interrupción CCIFG del registro TA0CCTLx. La señal por capturar (puede ser interna o
externa al microcontrolador) se puede seleccionar mediante los bits CCIS0 y CCIS1 del registro
TA0CCTLx [1].
Los bits CM0 y CM1 del registro TA0CCTLx nos permiten seleccionar el flanco a
detectar.
El bit CCI permite leer el valor instantáneo de la señal a capturar.
El bit SCS permite sincronizar la entrada con el reloj del contador/temporizador, es decir,
nos permite hacer una captura síncrona con la señal de reloj del contador (1) o asíncrona
con la señal de reloj del contador (0).
El bit SCCI del registro TA0CCTLx contiene el valor digital sincronizado de la señal a
capturar.
En el modo comparación el registro TA0CCRx se almacena la cuenta que se pretende
lleva a cabo y en el modo captura se registra el valor que tiene TAR cuando se produce un
determinado evento.
2. Modo comparación.
En el bit SSCI se almacena el valor instantáneo de la señal CCI. Esa señal se determina
mediante los bits CCIS0 y CCIS1.
La señal EQUx se pone a 1.
Se activa el flag de interrupción CCIFG del registro TA0CCTLx.
Cada pin puede asociarse a diferentes funciones, dependiendo de la configuración del mismo, en la figura 4 se
muestra el esquema general de los puertos del microcontrolador.
A. Máquina de estados
Para la programación en Code Composer se realizó una máquina de estados (véase Tabla 1) para
la cual se considera lo siguiente:
Se tiene dos entradas las cuales corresponden a los botones del microcontrolador asignados a los
pines:
P1.1- Cuenta arriba
P1.2- Cuenta abajo.
Dichos botones representan a los interruptores que se han de activar para que se abran las puertas
de entrada y salida del Túnel.
b) Etapa 1
Al inicio de la etapa 1 el registro TA0CCR1 se regresa a su valor inicial y el Bit 1 se iguala a 1,
es decir, se cierra la puerta de entrada y se enciende el ventilador. El registro TA1CCR1
permanece en su estado inicial. Dentro de esta etapa se establece una condicional, cuando hayan
transcurrido 30 o en caso de que la variable decrementa tome el valor de 1 (en caso de que se
presione el botón P1.2) el Bit 1 y la Decrementa se igualan a 0 y se pasa a la etapa 2.
c) Etapa 2
Se modifica el valor del registro TA1CCR1 para abrir la puerta de salida, el registro TA0CCR1
permanece con su valor inicial y sucede lo mismo para el Bit 1. Cuando el contador tome el valor
de 10 se reinicia dicho contador y se pasa a la etapa 3.
d) Etapa 3
En esta última etapa no se tiene una condición y las variables y las salidas se igualan a sus
respectivos valores iniciales. Se pasa a la etapa 0.
B. Programa
Partiendo de los programas revisados en clase se toma uno de ellos para llevar a cabo las
modificaciones y que se adapte a la máquina de estados antes vista.
Para el programa se declaran siete variables globales de tipo entero, las variables “contador”,
“activar”, “incrementa” y “decrementa” que toman un valor inicial de 0 y las variables
“segundos”, “minutos” y “horas”.
Enseguida se declara la función reloj de tipo void. Dentro de ella se establece la variable de tipo
static int “interrupciones” igualada a 0, se establece una condicional de manera que cuando
“interrupciones” sea mayor o igual a 64 se reinicie su valor y se aumente en 1 el valor de
“segundos”, además, dentro de esta condicional se establecen dos nuevas condicionales de
manera que cuando “activar” sea igual a 1 “contador” se aumenta en 1 y cuando “segundos” sea
mayor o igual a 60 se reinicia su valor, se aumenta en 1 el valor guardado en “minutos” y se
compara si el valor de “minutos” es mayor o igual a 60 en cuyo caso se manda a 0 dicho valor y
se aumenta el valor guardado en “horas”, en caso de que las condicionales no se cumplan se cicla
la función y únicamente se incrementa el valor de “interrupciones”.
Al utilizarse dos botones del microcontrolador como interruptores para abrir las puestas se
requiere que se elimine o disminuya el efecto de los rebotes producido cuando se presionan los
botones por lo cual se crean las funciones de tipo void noRebotesS1 y noRebotesS2.
Las dos funciones son iguales, solamente cambia la condición inicial que cambia para el puerto
P1.1 o P1.2, se tienen 3 variables, unos se usa para cuando el botón está presionado y ceros
cuando el botón no está presionado, como el microcontrolador está recibiendo un valor en alto
cuando el botón no está presionado, la condicional inicial sirve para aumentar dichos valores
dependiendo del estado del botón, si se tiene presionado aumentan los unos y reinicia los ceros,
de lo contrario, aumenta los ceros y reinicia los unos. Si el botón se encuentra presionado y
durante 3 veces que se llama a la función se tiene presionado, entonces cambia a la etapa 1;
cuando se deja de presionar el botón, entonces los ceros empiezan a aumentar y cuando se llame
a la función durante 3 veces y se detecte que no está presionado el botón, es entonces cuando ya
se habrán eliminado los rebotes del botón, se cambiará la variable incrementa o decrementa,
dependiendo del caso, a 1, para indicar que uno de los botones fue presionado, además de que se
regresa a la etapa 0 de nuevo.
Fig.7. Función noRebotesS1.
La función túnel se realizó en base en la tabla de estados, dentro de esta función la variable
“etapa” y seguido se establece un switch en función de “etapa”, de esta manera variando el valor
de “etapa” de 0 a 3 se harán los cambios de una etapa a otra.
Para la primera etapa (case 0) se establece una condicional de manera que cuando incrementa sea
exactamente igual a 1 se establece en 0x2328 el valor del registro TA0CCR1 con lo cual se
modifica la señal PMW para abrir 90° la puerta de entrada del túnel y la variable activar se iguala
a 1 para que “contador” inicie la cuenta. Cuando la cuenta sea exactamente igual a 10 se
establece en 0 la cuenta, la etapa cambia a 1, incrementa se reinicia en 0 y “activar” se pone igual
a 0.
Para la etapa 1 el registro TA0CCR1 se iguala a 0x251C para que vuelva a modificar la señal
PMW y se cierre la puerta de entrada. Se activa el Bit 1 en la salida para encender el ventilador y
“activar” nuevamente toma el valor de 1 iniciando nuevamente el contador. Cuando el contador
es igual a 30 o en caso de que se decrementa sea igual a 1 se niega el Bit 1 apagando el ventilador
y se reinician los valores de “decrementa”, “contador” y “activar”. La etapa se iguala a 2.
La etapa 2 tiene mucha similitud con la etapa 1 ya que ahora es el registro TA1CCR1 el que se
iguala a 0x2328 para modifica la señal PMW y abrir la puerta de salida del túnel, la variable
activar se iguala a 1 para que “contador” inicie nuevamente la cuenta. Cuando la cuenta sea
exactamente igual a 10 se establece en 0 la cuenta, la etapa cambia a 3 y “activar” se vuelve a 0.
Por último en la etapa 3 (case 3) el registro TA1CCR1 se regresa a su valor de 0x251C y “etapa”
se hace igual a 0.
Para el ambos timers 0 y 1 se selecciona el reloj SMCLK sin subdivisiones y se selecciona el modo
UP/DOWM que es el más adecuado para el PMW. Se selecciona el modo comparación toggle/set (de
0 a 1). Por último los registros TA0CCR0 y TA0CCR1 se usarán para definir el valor máximo de
conteo y el ciclo de trabajo iniciando este último en un 5%.
Se utilizaron pines de 3 puertos diferentes, del puerto 1 se utilizaron P1.1 y P1.2 como entradas
de los botones que vienen integrados, el P1.6 se asoció al timer para utilizarlo como salida de un
PWM, del puerto 2 se configuraron todos los pines como salidas y se utilizó el P2.1 como salida
del motor, finalmente, del puerto 3 se asoció el P3.3 como salida del timer para la salida del
segundo PWM.
IV. RESULTADOS
Con la configuración de los puertos realizada, el resultado fue el diagrama eléctrico como el
mostrado en la figura 12.
Fig.12. Diagrama eléctrico de las conexiones realizadas para el control del túnel sanitizante de 2 puertas.
Se tuvieron algunos problemas con las salidas del PWM, debido a que no salía por el puerto
deseado, problema que se solucionó cambiando el pin de salida del PWM al P3.3. Se requirió una
investigación de las hojas de datos de los servomotores para saber las características de la señal
de entrada para el control del movimiento, la cual decía que debía ser a 50 Hz y con un periodo
de 1ms para 0° y 1.5ms para 90°, cosa que en la práctica no funcionaba y se tuvo que poner un
periodo de 2ms para 90°.
V. CONCLUSIONES
Alan Alvarado Ramírez (17121109): Esta práctica fue realizada usando los conocimientos
adquiridos durante las clases de Sistemas Operativos Embebidos, en especial la metodología de
programación con base en máquinas de estados, ya que esta metodología es especialmente útil,
ya que permite dividir un problema más grande en pequeños problemas, además que se puede
realizar una tabla de estados previo a la programación, para definir cada etapa, cada condición y
parámetros requeridos y a cambiar en cada etapa. Esta metodología fue utilizada durante el
desarrollo de esta práctica y fue de suma utilidad ya que facilitó en gran medida el trabajo de
programación en code composer y en el comportamiento del sistema dependiendo varios factores
y variables usadas. El principal problema al que nos enfrentamos, fue la utilización de las señales
PWM generadas por los timers internos para generar el movimiento de los servos, ya que nunca
se habían controlados directamente desde el microcontrolador (solo desde arduino), además que
se tuvieron que corregir fallos en algunos parámetros de las señales y buscar en el PDF del MSP
los pines de los puertos específicos de donde podía salir la señal de cada uno de los timer que se
programaron.
Jonatan Ali Medina Molina (17121124): Durante la práctica se pudieron aplicar los
conocimientos adquiridos del funcionamiento de la máquina de estados, metodología que es muy
interesante por la manera en la que se manejan las tareas, lo que da sensación de que se realizan
varias tareas al mismo tiempo, realizando funciones sencillas que no toman demasiado tiempo.
Se tuvieron algunos errores en la configuración de los puertos como salidas de los timers para el
PWM, eso debido a que se pensó que todos se configuraban igual, cosa que no es así por lo que
se debe tener muy en cuenta el manual de usuario para la configuración de los puertos cuando
harán funciones que son diferentes a entradas o salidas digitales.
Este tipo de metodología de programación nos servirá para futuras materias y para el ámbito
laboral, ya que casi siempre es necesario que un microcontrolador esté a cargo de la realización
de varias funciones al mismo tiempo, cosa que con otra metodología de programación no es tan
sencillo.
Referencias bibliográficas