Se construyeron 2 temporizaciones (1 y 5 segundos) y un puerto digital para establecer las entradas (botón de solicitud) y salidas (los tres bits correspondientes a los 3 faros del semáforo)
En primer lugar, se retomó el diagrama de flujo desarrollado en la práctica 3. Para llevar a cabo la implementación del programa, se utilizaron los conocimientos previos respecto a detección de pulsos digitales, envío de salidas por los puertos digitales, saltos y subrutinas.
Respecto a los retardos de 1 y 5 segundos, existe la opción de utilizar el timer0 o crear rutinas de temporizador a base de ciclos anidados de instrucción.
Respecto al timer0 es importante recordar las configuraciones que lleva este módulo temporizador (precargar un valor inicial, uso del prescaler y lanzamiento de interrupciones, etc)
Si se utiliza el método de ciclos anidados, se puede obtener un retardo más preciso, pero es necesario contar el número de cíclos de instrucción que se ejecutan en cada ciclo anidado. Por ejemplo:
; Frecuencia de reloj a 4MHz
; Ciclo de instrucción a 1uS
ciclo equ 20
; inicializar
MOVLW d'33'
MOVWF ciclo ;ciclo=33d
; temporizador 100uS
tmp100 DECFSZ ciclo ; 1 o 2 ciclos
GOTO tmp100 ; 2 ciclos
RETURN ; 2 ciclos
END
En esta rutina de temporizador (tmp100), dura aproximadamente 100us. Esto lo calculamos con el número de ciclos de instrucción de cada línea de código. Las dos líneas que hacen el cíclo son el DECFSZ y el GOTO. Cuando ciclo no es 0, DECFSZ tarda 1 ciclo de instrucción., mientras que el GOTO siempre tarda 2 ciclos de instrucción. por lo tanto, el ciclo es de 3 ciclos de instrucción. Es por eso que se debe repetir 33 veces para que tarde cerca de 100us (33x3=99).
Analizando la última ejecución del ciclo. Cuando ciclo es 1, el DECFSZ hace que "ciclo" sea 0, lo que hace saltar la línea. DECFSZ se ejecuta como una instrucción de salto, por lo que tarda 2 cíclos de instrucción. posteriormente, el comando RETURN ocupa 2 cíclos de instrucción, con lo que el número de cíclos ejecutados es 101, y por lo tanto, un retardo de 101us.
Ya sea con cíclos anidados, o con el timer0 (u otro timer) es posible que por el tamaño de las variables utilizadas, nos sea insuficiente el tiempo máximo de retardo obtenido. Para multiplicar el tiempo de retardo se utiliza la lógica de anidar x número de veces una rutina de retardo pequeña y definida. así por ejemplo, con nuestra rutina de 100uS, podemos hacer 1 ms si anidamos tmp100 10 veces. Esto se podría hacer así:
; Frecuencia de reloj a 4MHz
; Ciclo de instrucción a 1uS
ciclo equ 0x20
ciclo2 equ 0x21
; inicializar
MOVLW d'33'
MOVWF ciclo ;ciclo=33d
; temporizador 100uS
tmp100 DECFSZ ciclo ; 1 o 2 ciclos
GOTO tmp100 ; 2 ciclos
RETURN ; 2 ciclos
; temporizador 1mS
tmp1m MOVLW 0x0A
MOVWF ciclo2 ;ciclo2=10d
tm1m1 DECFSZ ciclo2
GOTO tm1m1s ;saltar para llamar 100us
RETURN ;Terminar la subrutina de 1ms
tm1m1s CALL tmp100 ;llamar 100us
GOTO tm1m1 ;regresar al ciclo2
END
Estas son las bases de cómo hacer temporizadores utilizando rutinas manuales, o temporizadores integrados (para más detalles acerca de los timers integrados, referirse a los ejemplos sobre el timer0 dados en teoría, y al manual para las configuraciones especiales. Los módulos timer1 y timer2 serán vistos a detalle posteriormente)
Para el reporte
Presentar la implementación del algoritmo del semáforo detallando cómo se construyeron los retardos de 1 segundo y 5 segundos.
Incluir el código fuente comentado.
Incluir el circuito de Proteus adaptado a la aplicación (preferible utilizar los 3 leds del color requerido en un semáforo)
Se calificará que el programa haga lo que se requiere. No se aceptarán programas previamente compilados. Necesito el código fuente para leer sus comentarios y probar que funcionan desde la compilación.
No hay comentarios:
Publicar un comentario