sábado, 11 de octubre de 2008

Mid Range PIC. Ejemplo 5

Este programa esta basado en las instrucciones de rotación tanto a derecha como a izquierda, también se ilustrará como usar la instrucción de salto si cierto registro o variable ha llegado a cero.


En este programa, se centrará en manejar las siguientes instrucciones:


Para la realización de este programa, se ha utilizado el famoso microcontrolador PIC16F72, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC16F72.

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 autor. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ejemplo3.asm *
; Date: 7-Octubre-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F72.INC *
; *
;**********************************************************************
; *
; Notes: Manejar instrucciones de rotación y de salto. *
; *
;**********************************************************************

list p=16F72 ; Directiva para definir el procesador
#include < p16F72.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 ; Inicio dirección memoria de datos del Banco 0
Contador
ENDC

;**********************************************************************
ORG 0x000 ; 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
bsf Numero,0 ; 0x01 -> Numero

Izquierda
rlf Numero,F ; Rota un bit hacia la izquierda
btfss STATUS,C ; ¿Numero = 0?
goto Izquierda ; NO -> Sigue rotando hacia la izquierda

Derecha
rrf Numero,F ; Rota un bit hacia la derecha
btfss STATUS,C ; ¿Numero = 0?
goto Derecha ; NO -> Sigue rotando hacia la derecha


goto Izquierda
; Vuelve a Izquierda

END ; directiva 'fin de programa'

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

cblock---endc

Para este microcontrolador, la dirección de memoria de datos es 0x20, donde se declarará la variable Numero.

El propósito de este programa es familiarizarse con las instrucciones de programación en lenguaje ensamblador, donde se usará instrucciones que serán comunes en nuestros códigos.

En este programa se muestra como se utilizan las instrucciones de rotación de bit tanto a derecha como a izquierdas, también se ilustra la operación de test de salto en caso que el contenido sea cero.



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 Numero, y el la categoría de SFR, el registro STATUS.

Simulamos el código paso a paso.

Primero se inicializa la variable Numero con el valor decimal de 1, para posteriormente rotar dicho bit hacia la izquierda, cuando el resultado sea cero, el bit de Carry del registro STATUS se pondrá a uno y por lo tanto se pasará a la siguiente fase que consiste en rotar hacia la derecha.

Hay que tener muy en cuenta que las instrucciones de rotación de bit, usan el bit de Carry cuando se ha rotado todos los bits del registro, es por ello que cuando la variable Numero se pone con valor cero, se pasa al siguiente bucle y al pasar por la instrucción de rotar de bit, aparece un uno que es el del Carry, y dicho valor de Carry del registro STATUS se pone a cero.



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





Este proyecto se puede descargar en la siguiente dirección:
Ejemplo 5.
Ejemplo 5.

0 comentarios: