lunes, 9 de febrero de 2009

SC. Repetición 2

Continuamos mostrando ejemplos de como usar las Sentencias de Control. En este caso, se tratará las de repetición.


Como estudio previo, es indispensable ver: SC. Bucle for con postdecremento, donde se explica la sentencia de control que se usará en este ejemplo de aplicación en detalle.

Para la realización de este programa, se ha utilizado el microcontrolador PIC16F73, se podría haber usado cualquiera, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC16F73.

El programa es el siguiente:

;**********************************************************************
; AqueronteBlog@gmail.com *
; *
; Este archivo es propiedad intelectual del blog Aqueronte, *
; cuya dirección web, es la siguiente: *
; *
; http://unbarquero.blogspot.com/ *
; *
; Se permite cualquier modificación del archivo siempre y cuando *
; se mantenga la autoría del mismo. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ej2.asm *
; Date: 7-Febrero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; Files Required: P16F73.INC *
; *
;**********************************************************************
; *
; Notes: En este programa, se muestra la utilización de las *
; sentencias de control, en este caso, la de repetición *
; de un bucle for con postdecremento. *

;**********************************************************************

list p=16F73 ; Directiva para definir el procesador
#include < p16F73.inc > ; Registros especificas del procesador

__CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; _BODEN_OFF: Reset por Brown-out DESACTIVADO.
; _CP_OFF: Protección de código DESACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _XT_OSC: Oscilador externo del tipo XT.

;***** DEFINICIÓN DE VARIABLES
CBLOCK 0x20 ; RAM Banco 0
Contador
ENDC


;**********************************************************************
ORG 0x0000 ; Inicio de código
goto Inicio ; Salta a programa principal

       ORG     0x0004      ; Vector de Interrupción
; El vector de interrupción se encuentra en la dirección 0x0004
; En este ejemplo no se usará interrupciones.
retfie

Inicio
clrf PORTA ; 0 -> PORTA

bsf STATUS,RP0 ; Banco 1
movlw 0x06
iorwf ADCON1,f ; Módulo A/D OFF

bcf TRISA,0 ; Pin RA0 del puerto A configurado como salida
bcf STATUS,RP0 ; Banco 0

Programa
bsf PORTA,0 ; RA0 ON
call Retardo ; Ve a subrutina de Retardo

bcf PORTA,0 ; RA0 OFF
call Retardo ; Ve a subrutina de Retardo

goto Programa ; Vuelve a Programa


;**********************************************************************
; *
; Subrutina: Retardo *
; *
;**********************************************************************
; *
; Date: 7-Febrero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Genera un pequeño retardo mediante un bucle for. *
; *
;**********************************************************************
Retardo
movlw d'5'
addlw d'1'
movwf Contador

FOR
decfsz Contador,f ; ¿--Contador == 0?
goto Bucle_For ; Ejecuta el bloque de sentencia
goto Salir ; NO -> Sal del FOR

Bucle_For
nop
goto FOR ; Vuelve al FOR

Salir
retlw d'0' ; Fin de Subrutina: Retardo


END ; directiva 'fin de programa'

Para la realización de este programa, se ha empleado una variable definida en memoria RAM. Para ello, se ha usado la instrucción:

cblock---endc

Dicha variable es Contador que albergará el número de repeticiones del bucle for.

El propósito de este programa consiste en mostrar el funcionamiento del bucle for con postdecremento, para ello, se diseñará una subrutina que sea sirva como un simple retardo, donde utilizaremos dicho for con postdecremento.

Antes de empezar a evaluar el programa, se deberá configurar los periféricos internos del microcontrolador para un funcionamiento correcto.

Este microcontrolador, posee módulos de A/D entre otros periféricos, éstos se reflejan en los pines del puerto que queremos usar, por lo tanto, se deben de desactivar.

Un aspecto a tener muy en cuenta, es la localización de los registros mapeados en los bancos de memoria, es por ello, que para actuar sobre un registro, tendremos que seleccionar previamente el banco de memoria adecuado.

Primero, desactivamos el módulo A/D, como se muestra a continuación:

    movlw  0x06
iorwf ADCON1,f

Posteriormente, configuraremos el pin RA0 del puerto A como salida.

bcf TRISA,0

Para ello, usamos la instrucción siguiente:
TRIS

Que se encarga de configurar si los pines son de entrada o salida. Para ser de entrada, debe escribirse un '1' y para ser de salida un '0' en el bit correspondiente al pin a configurar.

Una vez configurado todo, estaremos en disposición de realizar nuestro propósito inicial, verificar si un dato es mayor que otro.



Para ver el resultado, compilamos el código y seleccionamos el MPLAB SIM para poder simularlo.

Abrimos la ventana de Watch y seleccionamos en la categoría de SFR, el registro WREG, STATUS y PORTA y de la categoría Symbol, seleccionaremos Contador.



El propósito de este programa es comprobar cómo funciona la sentencia de control de repetición, en este caso, la del bucle for con postdecremento.

El programa es simple, activaremos el pin RA0 del puerto A durante un tiempo determinado, para posteriormente, desactivar dicho pin el mismo tiempo.

Dicho tiempo estará regulado por una subrutina llamada Retardo, que está diseñada con un bucle for con postincremento.



Se puede observar en el siguiente vídeo todo lo explicado anteriormente:



El presente vídeo se puede ver en YouTube en alta calidad:
SC2.


Este proyecto se puede descargar en la siguiente dirección: SC. Repetición 2.

0 comentarios: