sábado, 11 de octubre de 2008

Mid Range PIC. Ejemplo 4

La razón de este programa es el manejo de las instrucciones de operaciones lógicas que se puede realizar con el lenguaje ASM que pone a disposición la empresa Microchip mediante su compilador MPASM.

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


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

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: Ejemplo4.asm *
; Date: 6-Octubre-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P16F648A.INC *
; *
;**********************************************************************
; *
; Notes: Manejar instrucciones de operaciones lógicas. *
; *
;**********************************************************************

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

;errorlevel -302 ; Mensaje de aviso del banco en el que trabajamos

__CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _DATA_CP_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_ON

; _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.
; _LVP_OFF: Programación en bajo voltaje DESACTIVADO.
; _DATA_CP_OFF: Protección de datos DESACTIVADO.
; _INTOSC_OSC_NOCLKOUT: Oscilador interno sin salida CLK.
; _MCLRE_ON: Pin de reset externo ACTIVADO.

;***** DEFINICIÓN DE VARIABLES
CBLOCK 0xA0 ; Inicio dirección memoria de datos del Banco 1
Numero
ENDC

;**********************************************************************
ORG 0x0000 ; Inicio de código
bsf STATUS,RP0 ; Banco 1
bsf PCON,OSCF ; Oscilador interno a 4MHz
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
movlw 0x01 ; 0x01 -> (W)
movwf Numero ; (W) -> Numero


iorlw 0xFF ; (W) OR 0xFF -> (W)
iorwf Numero,F ; (W) OR Numero -> Numero

xorlw 0xF0 ; (W) XOR 0xFF -> (W)
xorwf Numero,F ; (W) XOR Numero -> Numero

andlw 0xF0 ; (W) AND 0xFF -> (W)
andwf Numero,F ; (W) AND Numero -> Numero


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 tal propósito, se ha usado la instrucción:

cblock---endc

En este aso, se ha usado la memoria de datos que está en el banco 1, la dirección de memoria de datos en cuestión es 0xA0, 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 mostrará como se usa las instrucciones de operaciones lógicas con una variable definida en memoria de datos y el registro de trabajo W.



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

Simulamos el código paso a paso.

Se puede apreciar como el valor de la constante se almacena en el registro de trabajo W, después se iniciará la variable Numero con el valor contenido en W, posteriormente se realizará la operación lógica OR con un literal y el registro d trabajo W, después, se realizará también la operación lógica OR pero esta vez entre el registro W y la variable definida en memoria de datos Numero, después se realizará la operación XOR entre un literal y el registro W para posteriormente volver a realizar la operación lógica XOR pero esta vez entre el registro W y la variable Numero, y finalmente se realizará la operación lógica AND entre un literal y el registro W y posteriormente realizar la misma operación pero entre el registro de trabajo W y la variable Numero.

Una dato a tener en cuenta es cuando compilamos el código, en la ventana de salida OUTPUT, nos mostrará que se ha compilado correctamente y sin errores pero nos mostrará el mensaje 302.




No hay que asustarse, simplemente el compilador nos recuerda, en este caso, que se está usando una variable que no está en el banco 0. Para evitar este mensaje, simplemente hay que poner la siguiente instrucción después de definir el microcontrolador a usar:

errorlevel  -302  ; Mensaje de aviso del banco en el que trabajamos

Esto hará que no nos salga más dicho mensaje de aviso:



Como se puede observar, ya el compilador no nos avisa de que estamos tratando con registros o variables que no están en el banco 0 del microcontrolador.




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





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

0 comentarios: