domingo, octubre 03, 2010

Práctica 6: Semáforo

En esta práctica se implementó el algoritmo de funcionamiento de un semáforo de cortesía utilizando un microcontrolador como unidad de control del sistema.

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.

Preparación de la práctica 7
Investigar sobre la conversión Analógico - Digital y Digital - Analógica (Resolución, velocidad de operación, algoritmos y métodos de conversión, ventajas y desventajas de cada método de conversión, calibración, sensibilidad etc.)
¿Qué tipo de convertidores posee el PIC16F87X (serie simple y serie A)
¿Qué registros se utilizan para configurar el módulo de conversión A/D
¿Cuántas líneas de entrada tiene el PIC16F876?

No es necesario preparar un documento por escrito de la preparación de la práctica 7, pero si es necesario hacer la preparación. Voy a verificar que hayan investigado, pues es necesario para comprender la práctica que vamos a realizar el próximo miercoles.

No hay comentarios: