jueves, 5 de febrero de 2009

SC. Repetición 1

Seguimos 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 predecremento, 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 PIC16F506, se podría haber usado cualquiera, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC16F506.

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: Ej1.asm *
; Date: 4-Febrero-09 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; Files Required: P16F506.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 predecremento. *
;**********************************************************************

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

__CONFIG _IOSCFS_OFF & _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC_RB4EN

; _IOSCFS_OFF: Oscilador interno de 4MHz.
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC_RB4EN: Oscilador interno de 4MHz: Pin RB4 E/S.



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


;**********************************************************************
ORG 0x03FF ; Valor del oscilador interno

; El valor del oscilador interno se localiza en la dirección 0xFF
; como una instrucción movlw k, donde k es el valor de configuración del oscilador.

ORG 0x0000 ; Inicio de código
movwf OSCCAL ; Actualiza el valor del oscilador interno a 4MHz

movlw b'11011111'

OPTION ; Transición del TMR0 interna


movlw 0x3F
andwf ADCON0,F ; Módulo A/D OFF

bcf CM1CON0,C1ON ; Módulo Comparador OFF

clrf PORTB ; 0 -> PORTB B

clrw ; Puerto B...
TRIS PORTB ; ...configurado como salida.


Inicio
movlw 0x06 ; Cantidad correspondiente al retardo
movwf Contador

movlw 0x01 ; 1 -> (W)

Bucle_For
decfsz Contador,F ; --Contador -> ¿Contador = 0?
goto BloqCodigo ; NO -> Realiza el Bloque de código
goto Salir ; SI -> Sal del bucle for

BloqCodigo
addwf PORTB,f ; (PORTB) + (W) -> PORTB
goto Bucle_For ; Vuelve a Bucle_For

Salir
goto Inicio ; Vuelve a Inicio


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 predecremento, para ello, se cargará con un valor la variable Contador, la cual nos indicará el número de repeticiones, y dentro del bucle for, la sentencia de código no es más que incrementar en una unidad el contenido del puerto B.

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 y comparadores entre otros, éstos se reflejan en los pines del puerto que queremos usar, por lo tanto, se deben de desactivar.

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

   movlw  0x3F
andwf ADCON0,F

Posteriormente, desactivamos el módulo comparador, como se observa a continuación:

         bcf  CM1CON0,C1ON

Y por último, que se deberá configurar el puerto B de manera, entrada o salidas digitales. Primero hacemos un reset del puerto, para que después de haber sido configurado, su estado inicial sea cero (es decir, una vez establecido que los pines del puerto B sean de salida digitales, éstos deben de valer cero)

        clrf   PORTB

Para posteriormente ser declarado como salida.

clrw
TRIS PORTB
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 Symbol la variable definida como Contador, y el la categoría de SFR, los registros WREG, PORTB y STATUS.



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 predecremento.

El programa es simple, cargamos la variable Contador con el número de repeticiones (menos una) que queramos realizar, para posteriormente, en un bucle for, ir incrementando el valor de salida del puerto B.

Una vez acabe el número de repeticiones, saldrá del bucle for y volverá a realizar todo el programa desde el principio.



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



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


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

0 comentarios: