0% encontró este documento útil (0 votos)
69 vistas17 páginas

Instrucciones del PIC16F84 en Ensamblador

El documento describe las instrucciones del microcontrolador PIC16F84. Explica que hay 35 instrucciones agrupadas en instrucciones de carga, aritméticas, lógicas, de bit, de salto y manejo de subrutinas. Describe las principales características del juego de instrucciones y explica las instrucciones de carga como movlw, movf y movwf para transferir datos entre registros y memoria.

Cargado por

sikurip
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
69 vistas17 páginas

Instrucciones del PIC16F84 en Ensamblador

El documento describe las instrucciones del microcontrolador PIC16F84. Explica que hay 35 instrucciones agrupadas en instrucciones de carga, aritméticas, lógicas, de bit, de salto y manejo de subrutinas. Describe las principales características del juego de instrucciones y explica las instrucciones de carga como movlw, movf y movwf para transferir datos entre registros y memoria.

Cargado por

sikurip
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Microcontrolador DIA 3

PIC16F84
Ing. Mario de Jesús Martínez Sánchez

GUIA 3: ENSAMBLADOR
3.1 OPERADORES ARITMÉTICOS

En los operandos de las instrucciones pueden aparecer expresiones matemáticas cuyo valor numérico será
calculado por el programa ensamblador en el momento de ensamblar el programa fuente. Por ejemplo:

movlw MensajeFin – Mensajelnicio ;El ensamblador calcula automáticamente la longitud


;del mensaje realizando una resta.
……………………… ;Resto del programa.
MensajeInicio
……………………… ;(Aquí iría un mensaje de longitud desconocida).
MensajeFin

3.2 EL REPERTORIO DE INSTRUCCIONES

El repertorio del PIC16F84 está compuesto por 35 instrucciones que pueden ser agrupadas para su estudio en
los siguientes grupos:
• Instrucciones de carga.
• Instrucciones aritméticas.
• Instrucciones lógicas.
• Instrucciones de bit.
• Instrucciones de salto.
• Instrucciones para manejo de subrutinas.
• Instrucciones especiales.
Las principales características del repertorio de instrucciones del PIC16F84 son:
• Es un juego reducido de 35 instrucciones simples y rápidas.
• La mayoría de las instrucciones se ejecutan en 4 ciclos de reloj, menos las de salto que requieren 8
ciclos.
• Las instrucciones son ortogonales. Casi todas las instrucciones pueden usar cualquier operando.
• Todas las instrucciones tienen la misma longitud, 14 bits y todos los datos son de 8 bits.

Las instrucciones se pueden observar en la tabla 3-1.

3.3 INSTRUCCIONES DE CARGA


Las instrucciones de transferencias de datos son típicas de todos los procesadores y su misión es transferir el
contenido un registro fuente (f) a un registro destino (d) o bien cargar el destino con una constante. En los
microcontroladores PIC todos los datos residen en posiciones de la memoria de datos y en el registro de
trabajo W.

33
En la explicación de estas instrucciones se emplea muchas veces una nomenclatura especial muy simple
basada en paréntesis y flechas. Con los paréntesis se destaca que se trata del “contenido” de las posiciones de
memoria y la flecha la dirección de la transferencia de los datos. Algunos ejemplos:
• (W) Æ (PORTB): Significa “el contenido del registro W se transfiere al puerto B”.
• (2Bh) Æ (W): Significa “el contenido de la posición 2Bh de RAM de datos se transfiere
al registro de trabajo W”.
• 2Bh Æ (W): Significa “el registro de trabajo se carga con el dato 2Bh”. (Notar la
ausencia de paréntesis).

Hay cinco instrucciones de carga propiamente dichas:

3.3.1 clrw
(Clear W). El contenido del registro W se borra (se carga con b’00000000’) y el flag Z se activa a “1”. Esta
instrucción también se podría considerar como aritmética.

Ejemplo: clrw ; 0 Æ (W)


Antes instrucción: (W) = ¿? y Z = ¿?
Después instrucción: (W) = 0x00 y Z = 1.

3.3.2 clrf f
(Clear f). El contenido del registro ‘f’ se borra (se carga con b’00000000’) y el flag Z se activa a uno. Esta
instrucción también se podría considerar como aritmética.

Ejemplo: clrf FlagReg ; 0 Æ (FlagReg)


Antes instrucción: (FlagReg) = ¿? y Z = ¿?
Después instrucción: (FlagReg) = 0x00 y Z = 1.

3.3.3 movlw k
(Move Literal to W). El registro W se carga con el valor de los 8 bits de la constante ‘k’. Ningún flag del
registro de estado es afectado.

Ejemplo: movlw 0x5Á ; 5Ah Æ (W)


Antes instrucción: (W) = ¿?
Después instrucción: (W) = 0x5A

3.3.4 movf f,d


(Move f) El contenido del registro ‘f ‘ se carga en el registro destino dependiendo del valor de ‘d’. Si ‘d’ = 0 el
destino es el registro W, si ‘d’ = 1 el destino es el propio registro ‘f’. El flag Z del registro STATUS queda
afectado: Z se activa a “1” si el resultado de la operación es cero.

Ejemplo 1: movf PORTA, 0 ; (PORTA) Æ (W)


Antes instrucción: (PORTA) = 0x1A, (W) = ¿? y Z = ¿?
Después instrucción: (PORTA) = 0x lA, (W) = 0x1A y Z = 0

Ejemplo 2: movf .FSR, 1 ; (FSR) Æ (FSR)


Antes instrucción (FSR) = 0x00, y Z = ¿?
Después instrucción: (FSR) = 0x00, y Z = 1 (el resultado de la operación es “0”).

3.3.5 movwf f
(Move W to f). Carga el contenido del registro W al registro ‘f. Ningún flag del registro de estado es afectado.

Ejemplo: movwf PORTB ; (W) Æ (PORTB)


Antes instrucción: (PORTB) = ¿? y (W) = 0x4F.
Después instrucción: (PORTB) = 0x4F y (W) = 0x4F.

34
CÓDIGO DE FLAGS
NEMONICO DESCRIPCIÓN
OPERACIÓN AFECTADOS
Instrucciones de CARGA
clrf f 00 Æ (f) 00 0001 1fff ffff Z
clrw 00 Æ (W) 00 0001 0xxx xxxx Z
movf f,d (f) Æ (destino) 00 1000 dfff ffff Z
movlw k k Æ (W) 11 00xx kkkk kkkk Ninguno
movlw (W) Æ (f) 00 0000 1fff ffff Ninguno
Instrucciones de BIT
bcf f,b Pone a 0 el bit ‘b’ del reg. ‘f’ 01 00bb bfff ffff Ninguno
bsf f,b Pone a 1 el bit ‘b’ del reg. ‘f’ 01 01bb bfff ffff Ninguno
Instrucciones ARITMÉTICAS
addlw k (W) + k Æ (W) 11 111x kkkk kkkk C, DC, Z
addwf f,d (W) + (f) Æ (destino) 00 0111 dfff ffff C, DC, Z
decf f,d (f) – 1 Æ (destino) 00 0011 dfff ffff Z
incf f,d (f) + 1 Æ (destino) 00 1010 dfff ffff Z
sublw k k – (W) Æ W 11 110x kkkk kkkk C, DC, Z
subwf f,d (f) – (W) Æ (destino) 00 0010 dfff ffff C, DC, Z
Instrucciones LÓGICAS
andlw k (W) AND k Æ (W) 11 1001 kkkk kkkk Z
andwf f,d (W) AND (f) Æ (destino) 00 0101 dfff ffff Z
comf f,d (/f) Æ (destino) 00 1001 dfff ffff Z
iorlw k (W) OR k Æ (W) 11 1000 kkkk kkkk Z
iorwf f,d (W) OR (f) Æ (destino) 00 0100 dfff ffff Z
rlf f,d Rota (f) a izquierda del Carry Æ (destino) 00 1101 dfff ffff C
rrf f,d Rota (f) a derecha del Carry Æ (destino) 00 1100 dfff ffff C
swapf f,d Intercambia los nibbles de f Æ (destino) 00 1110 dfff ffff Ninguno
xorlw k (W) XOR k Æ (W) 11 1010 kkkk kkkk Z
xorwf f,d (W) XOR (f) Æ (destino) 00 0110 dfff ffff Z
Instrucciones de SALTO
btfsc f,b Salta si el bit ‘b’ del ‘f’ es 0 01 10bb bfff ffff Ninguno
btfss f,b Salta si el bit ‘b’ del ‘f’ es 1 01 11bb bfff ffff Ninguno
decfsz f,d (f) – 1 Æ (destino) y salta si es 0 00 1011 dfff ffff Ninguno
incfsz f,d (f) + 1 Æ (destino) y salta si es 0 00 1111 dfff ffff Ninguno
goto k Salta a la dirección ‘k’ 10 1kkk kkkk kkkk Ninguno
Instrucciones de manejo de SUBRUTINAS
call k Llamada a subrutina 10 0kkk kkkk kkkk Ninguno
retfie Retorno de una interrupción 00 0000 0000 1001 Ninguno
retlw k Retorno con un literal en W 11 01xx kkkk kkkk Ninguno
return Retorno de una subrutina 00 0000 0000 1000 Ninguno
Instrucciones de ESPECIALES
clrwdt Borra Timer del Watchdog 00 0000 0110 0100 /TO, /PD
nop No operación 00 0000 0xx0 0000 Ninguno
sleep Entra en modo de bajo consumo 00 0000 0110 0011 /TO, /PD
Tabla 3- 1: Repertorio de instrucciones del P1C16F84.

35
3.4 INSTRUCCIONES DE BIT
Estas instrucciones ponen a nivel lógico “0” ó “1” un determinado bit de un registro de la memoria de datos.

3.4.1 bcf f,b


(Bit Clear f). Pone a cero el bit ‘b’ del registro ‘f’.

Ejemplo: bcf FlagReg, 7 ; 0 Æ (FlagReg,7)


Antes instrucción: (FlagReg) = b’11000111’.
Después instrucción: (FlagReg) = b’0l000l 11’.

3.4.2 bsf f,b


(Bit Set f). Pone a uno el bit ‘b’ del registro ‘f.

Ejemplo: bsf FlagReg,7 ; 1 Æ (FlagReg,7)


Antes instrucción: (FlagReg) = b’0l000l 11’.
Después instrucción: (FlagReg) = b’11000111’.

3.5 INSTRUCCIÓN “GOTO K”


En casi todos los programas se usa la instrucción de salto incondicional goto k (Unconditional Branch) que
produce un salto a la dirección del programa indicada por “k”. La constante literal “k” es la dirección de
destino del salto, es decir, la nueva dirección de memoria de programa a partir de la cual comenzarán a leerse
las instrucciones después de ejecutar la instrucción goto. Así pues, esta instrucción simplemente carga la
constante k en el contador de programa (PC).

Ejemplo: goto Bucle ; Bucle 3 (PC)


Antes instrucción: (PC) = ¿?
Después instrucción: (PC) = Dirección apuntada por la etiqueta “Bucle”.

A veces se utiliza el carácter de control dólar ($) para señalar que el salto se produce a la misma posición de
programa donde se encuentra situado en ese momento. Así por ejemplo, las dos próximas instrucciones son
equivalentes:

AquiMismo goto AquiMismo


goto $

3.6 CONFIGURAR LAS LÍNEAS DE LOS PUERTOS

Al conectar por primera vez el PIC16F84 el bit RP0 del registro STATUS se carga automáticamente con “0”,
con lo que se permite el acceso a las posiciones del Banco 0 de la memoria de datos.
Para configurar las líneas de los puertos hay que acceder a los registros TRISA y TRISB que se hallan en el
Banco 1 y cargar en ellos los valores adecuados. Por ello previamente hay que acceder al Banco 1 poniendo a
“1” el bit RP0 del registro STATUS. Una vez configurados los puertos, habrá que volver a poner a “0” el bit
RP0 del registro STATUS para poder leer la información introducida por las líneas que funcionan como
entradas o para poder enviar al exterior los bits colocados sobre las líneas de salida, cuyos valores se hallan en
las posiciones 5 y 6 del Banco 0, que son las direcciones del Puerto A y Puerto B respectivamente (figura 2-1)
A continuación se muestra un ejemplo, donde el Puerto A se configura como entrada y el Puerto B se
configura como salida. Este programa ejemplo se puede aplicar al circuito de la figura 3-1.

36
Figura 3- 1: Circuito para comprobar el programa Ensam3_1.asm

;************************************** Ensam3_1.asm ************************************


;

; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado
; un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por
; el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).

; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF &


_WDT_OFF & _PWRTE_ON & _XT_OSC ; Configuración para el
; grabador.
LIST P=16F84A ; Procesador.
INCLUDE <P16F84A.INC> ; Definición de los operandos utilizados.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0 de memoria de


; programa.
Inicio bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salidas.
movlw b'11111111'
movwf TRISA ; Las líneas del Puerto A se configuran como entradas.
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
movf PORTA,W ; Lee el Puerto A.
movwf PORTB ; El contenido de W se visualiza por el Puerto B.
goto Principal ; Crea un bucle cerrado.

END ; Fin del programa.

Los registros TRISA y TRISB ocupan las posiciones 5 y 6 del Banco 1. Los puertos PORTA y PORTB
ocupan las posiciones 5 y 6 del Banco 0 (figura 2-1), por tanto, el programa anterior se puede modificar como
sigue:

37
;************************************** Ensam3_1.asm ************************************
;
(Principio igual que el anterior)

Inicio bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.


clrf PORTB ; Las líneas del Puerto B se configuran como salidas.
movlw b'11111111'
movwf PORTA ; Las líneas del Puerto A se configuran como entradas.
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
(Continua igual que el anterior)

Según la tabla 3-1 el código máquina para la instrucción clrf f es 00 0001 1fff ffff, es decir, sólo se toman los
siete bits bajos de la dirección del registro f. Como la dirección del TRISB es 86h (b’l000 0ll0’) y la del
PORTB es 06h (b’0000 0ll0’) sus siete bits más bajos son idénticos y, por tanto, las instrucciones cfrf TRISB y
clrf PORTB tienen exactamente el mismo código máquina que es el 00 0001 1000 0110 (186h). Lo mismo se
puede decir para las instrucciones movwf TRISA y movwf PORTA que tienen el código máquina
00 0000 1000 0101 (085h).

En el momento de la definición del puerto como salida, el contenido de sus latches internos pasan al exterior,
en caso de que sea importante que este sea cero el programa debe añadir una instrucción c1rf PORTB al
principio:

;************************************** Ensam3_1.asm ************************************


;
(Principio igual que el anterior)

Inicio clrf PORTB ; Inicializa el puerto para que las líneas vayan a nivel bajo
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf PORTB ; Las líneas del Puerto B se configuran como salidas.
movlw b'11111111'
movwf PORTA ; Las líneas del Puerto A se configuran como entradas.
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
(Continua igual que el anterior)

3.7 DIRECTIVAS
Para poder ensamblar un programa automáticamente el ensamblador necesita información en forma de
directivas, que son comandos insertados en el programa que controla el proceso de ensamblado. No son parte
del repertorio de instrucciones del microprocesador y, por lo tanto, no tienen traducción al código máquina
del microcontrolador, por lo que también se les llama pseudoinstrucciones.
MPASM es el programa ensamblador del PIC16F84 más utilizado, tiene más de 50 directivas que se explican
en detalle en su menú help y en la guía “MPASM USER’S GUIDE” que se puede obtener gratuitamente en la
página Web del fabricante www.microchip.com. Algunas de estas directivas deben ser utilizadas
obligatoriamente en todos los programas, pero la mayoría son opcionales y sirven para facilitar el desarrollo y
la realización del programa. Las directivas del ensamblador suelen escribirse en la segunda columna y en
mayúsculas, aunque no es obligatorio. Las más utilizadas son:

3.7.1 END
(End Program Biock). Indica el fin del programa. Es la única directiva obligatoria. Al ensamblar un
programa, el programa ensamblador debe saber dónde tiene que detener el proceso, para eso está la directiva
END, la cual debe estar en la última línea del programa y explícitamente le indica al ensamblador el fin de
aquél. Todas las líneas posteriores a la línea en la que se encuentra esta directiva son ignoradas y no se
ensamblan. Ejemplo:

Inicio bsf STATUS,RP0 ; Comienza el programa ejecutable.


… … …

END ; Fin del programa.

38
3.7.2 EQU
Su sintaxis es:
<label> EQU <expr>

Es una directiva de asignación. El valor de <expr> es asignado a la etiqueta <label>. Usualmente las
asignaciones con EQU van al principio del programa (antes de las instrucciones). Siempre que el nombre
aparece en el programa es sustituido por el valor numérico de la expresión que se le haya asignado. Ejemplo:

ValorCarga EQU d’147’ ;Asigna el valor numérico de 147 a la etiqueta “ValorCarga”.

Generalmente la etiqueta es un nombre que describe el valor de manera más significativa para el
programador. Suele utilizarse para definir constantes y direcciones de memoria. Así, es más fácil recordar
“ValorCarga” que su valor 147, o en el caso de una dirección de memoria PORTA que 0x05.

3.7.3 ORG
(Set Program Origin). Su sintaxis es:
<label> EQU <expr>

Esta directiva indica al programa ensamblador la dirección en memoria de programa a partir de la cual deben
ensamblarse las instrucciones del código fuente. Es decir, la dirección de la memoria de programa donde se
van a almacenar esas instrucciones es la fijada por la <expr> de la directiva. Ejemplo:

ORG 0x04
… … … …
;Los códigos máquinas correspondientes a las instrucciones que aparecen en las líneas
;siguientes, deben ser ensamblados en la memoria de programa a partir de la dirección 4.

Si las instrucciones de un programa comienzan a escribirse sin indicar ORG, el ensamblador toma por defecto
ORG 0x00.
Cuando las distintas secciones de un programa deben colocarse en diferentes áreas de memoria se usa una
directiva ORG antes de cada parte del programa para especificar la dirección inicial u origen de esa porción
del programa. Es decir, en un programa pueden aparecer varios ORG dependiendo de las necesidades.
En el ejemplo del archivo Ensam3_1.asm se aprecia la utilización de otras tres directivas:

3.7.4 CONFIG
En el programa Ensam3_1.asm aparece como:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Esta directiva indica la configuración elegida para el proceso de grabación del microcontrolador. En este caso:
• No hay protección de código (_CP_OFF).
• No se habilita el Watchdog (_WDT_OFF).
• Se habilita el reset mediante Power-Up Timer (_PWRTE_ON).
• Se utiliza el oscilador por cristal de cuarzo. (_XT._OSC).

Es importante resaltar que “_ _CONFIG” se inicia con dos subrayados (guión bajo), no con uno. Este error es
muy frecuente en los primeros programas.

3.7.5 LIST P=16F84A


Indica el tipo de procesador utilizado.

3.7.6 INCLUDE <P16F84A.INC>


Indica el archivo donde se localizan las etiquetas que nombran a los diferentes registros y el valor que le
corresponde a cada uno, es decir, en el archivo Pl6F84A.INC se muestra como hay que nombrar a todos los
registros propios del microcontrolador. Este archivo se localiza en el directorio principal del programa
ensamblador y su contenido es el siguiente:

39
LIST
; P16F84A.INC Standard Header File, Version 2.00 Microchip
Technology, Inc.
NOLIST

; This header file defines configurations, registers, and other useful


bits of
; information for the PIC16F84 microcontroller. These names are taken to
match
; the data sheets as closely as possible.

; Note that the processor must be selected before this file is


; included. The processor may be selected the following ways:

; 1. Command line switch:


; C:\ MPASM MYFILE.ASM /PIC16F84A
; 2. LIST directive in the source file
; LIST P=PIC16F84A
; 3. Processor Type entry in the MPASM full-screen interface

;========================================================================
==
;
; Revision History
;
;========================================================================
==

;Rev: Date: Reason:

;1.00 2/15/99 Initial Release

;========================================================================
==
;
; Verify Processor
;
;========================================================================
==

IFNDEF __16F84A
MESSG "Processor-header file mismatch. Verify selected
processor."
ENDIF

;========================================================================
==
;
; Register Definitions
;
;========================================================================
==

W EQU H'0000'
F EQU H'0001'

40
;----- Register Files----------------------------------------------------
--

INDF EQU H'0000'


TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'

OPTION_REG EQU H'0081'


TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'

EECON2 EQU H'0089'

;----- STATUS Bits ------------------------------------------------------


--

IRP EQU H'0007'


RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'

;----- INTCON Bits ------------------------------------------------------


--

GIE EQU H'0007'


EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'

;----- OPTION_REG Bits --------------------------------------------------


--

NOT_RBPU EQU H'0007'


INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'

41
;----- EECON1 Bits ------------------------------------------------------
--

EEIF EQU H'0004'


WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

;========================================================================
==
;
; RAM Definition
;
;========================================================================
==

__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'

;========================================================================
==
;
; Configuration Bits
;
;========================================================================
==

_CP_ON EQU H'000F'


_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'

LIST

3.8 SIMULACIÓN DE UN PROGRAMA CON EL MPLAB

3.8.1 Ventanas De Visualización


Una vez ensamblado el código fuente (como se detallo en la guía 2) el entorno ya está preparado para la
simulación del programa. Para que este trabajo sea más eficaz conviene activar las ventanas que indican el
estado de todas las memorias y registros del sistema. Las principales ventanas de simulación se encuentran
dentro del menú View y son:
• Disassembly Listing. Código máquina y archivo fuente.
• File Registers. Memoria RAM de datos.
• Program Memory. Memoria de programa.
• Special Function Registers. Registros del SFR.
• Watch. Ventana personalizada.

42
3.8.2 Ventana de visualización de la memoria de programa.
En esta ventana se aprecian las posiciones de memoria que ocupa cada una de las instrucciones, el código de
operación de cada instrucción y la dirección de memoria de programa que se le ha asignado a cada etiqueta
(figura 3-2). Se puede ingresar en ella activando el menú View > Program Memory.

Figura 3- 2: Ventana de visualización de la memoria de programa

3.8.3 Ventana Disassembly


Esta ventana es similar a la anterior, en la que además se ha incluido el archivo fuente (figura 3-3). Se puede
ingresar en ella activando el menú View > Disassembly Listing.

Figura 3- 3: Ventana Disassembly

3.8.4 Ventana de visualización de los registros del SFR


Para visualizar los registros especiales del SFR se activa View> Special Function Registers (figura 3-4).

43
Figura 3- 4: Ventana de visualización de los registros especiales
Para modificar manualmente uno de estos registros hay que hacer doble clic en la fila del registro
correspondiente sobre alguna de las columnas Hex, Decima, Binary, o Char y modificarlo. Esto no es válido
para los puertos que actúen como entrada, en cuyo caso hay que utilizar, dentro del menú, Debugger, la
opción Stimulus tal como se explicará más adelante.
En esta ventana suele ser interesante situar la columna Binary a continuación de la columna SFR Name. Para
ello, pulsar el botón derecho del ratón y elegir la opción Properties, saldrá una ventana como la que se
muestra en la figura 3-5. Señalando la casilla Binary y pulsando sobre el botón Move Up, la columna Binary
se desplazará hasta situarse en la posición deseada tal como se explica en la figura.

Figura 3- 5: Desplazar la columna Binary dentro ventana de visualización del SFR

3.8.5 Ventana de contenido de la memoria RAM


Esta ventana presenta una lista con todos los registros de propósito general del microcontrolador simulado
(figura 3-6). Para visualizar la ventana de contenido de la memoria RAM de datos hay que seleccionar View >
File Registers.
Activando el botón inferior Symbolic se puede visualizar el nombre simbólico que le ha dado el programador
a las diferentes posiciones de memoria RAM de usuario.

3.8.6 Ventana personalizada Watch


Mediante las ventanas personalizadas Watch, MPLAB permite supervisar los contenidos de los registros de
más interés en la simulación para cada caso concreto. Para ello debe seleccionar View > Watch. El programa
responde con un cuadro de diálogo como la figura 3-7, donde podrá añadir los registros que el usuario desee
pulsando sobre Add SFR o Add Symbol.

44
La configuración de esta ventana se puede salvar para utilizarla en posteriores ocasiones. Para ello, estando
situado sobre esta ventana pulsar el botón derecho del ratón y seleccionar Output to File y guardar el archivo
de la forma ya conocida en el entorno Windows.

Figura 3- 6: Ventana con el contenido de la memoria RAM de datos

Figura 3- 7: Ventana personalizada Watch

3.8.7 Línea de estado


Aunque no es una ventana de visualización propiamente dicha, la línea de estado proporciona información
muy útil sobre la situación actual del microcontrolador. Se ubica en la parte inferior de la pantalla y ofrece
información en todo momento del estado de la simulación.
Es especialmente útil la información sobre el contenido del contador de programa, del registro de trabajo W.
También indica el valor de los flags de STATUS. Si la letra está en mayúsculas indica que ese flag vale “1” y,
si es minúsculas vale “0”. Así en el ejemplo de la figura 3-8, Z = 1, DC = 0 y C = 0.

Figura 3- 8: Línea de estado con la información del PC, W y flags del STATUS

45
3.8.8 SIMULACIÓN BÁSICA
Tras el proceso de ensamblado se procede a la simulación del programa. Mientras se ejecuta la simulación del
programa es interesante visualizar el contenido de las ventanas explicadas antes y comprobar el efecto en cada
una de ellas.
Es conveniente antes de nada, comprobar que está cargado correctamente el MPLAB SIM (Debbuger >
Select Tool > MPLAB SIM).
Los cinco comandos más importantes para la simulación se localizan dentro del menú Debbuger y se
muestran en la figura 3-9.

Figura 3- 9: Menú para entrar en los comandos básicos de simulación

• Run. Modo de ejecución continua. Ejecuta el programa constantemente. Las ventanas abiertas en el
paso anterior no se actualizan hasta que no se produce una parada. Es la forma más rápida de simular
el programa, pero no se “ve” ni como evoluciona la memoria ni los distintos registros. En este modo
se entra seleccionando Debugger > Run o pulsando la tecla F9, también al pulsar sobre el icono
correspondiente de la barra de herramientas (flecha azul).
• Animate (o teclas ctrl+F9). Modo de ejecución animada. Ejecuta el programa de forma continua pero
actualizando todas las ventanas cada vez que se ejecuta una instrucción. Es más lento que el modo
“Run” pero permite ver como van cambiando los registros. Tal vez sea el modo de ejecución más útil
y recomendable. Se entra en este modo seleccionando Debugger > Animate, o también al pulsar
sobre el icono correspondiente de la barra de herramientas (doble flecha azul).
• Halt. Paro. Para la ejecución del programa y actualiza todas las ventanas. Se consigue seleccionando
Debugger > Halt o pulsando la tecla F5. También se entra en este modo al activar el icono
correspondiente de la barra de herramientas (dos barras verticales azules).
• Step Into. Ejecución paso a paso. Ejecuta una sola instrucción del programa cada vez actualizando
los valores de las ventanas. Es la forma más lenta de simulación pero se comprueba fácilmente como
van evolucionando todos los registros y memorias, siendo muy fácil detectar los posibles errores. En
este modo se entra seleccionando Debugger > Step Into o pulsando la tecla F7. También pulsando
sobre el icono correspondiente de la barra de herramientas.
• Reset. Equivale a un reset por activación del pin MCLR. En este modo se entra seleccionando
Debugger > Reset o pulsando la tecla F6. También si se pulsa sobre el icono correspondiente de la
barra de herramientas.
Otro modo de simulación muy interesante es:
• Run to Cursor. Ejecución hasta la posición actual del cursor. Para entrar en este modo de
simulación, el cursor debe situarse en la línea donde está la instrucción hasta donde quiere simular el
programa, pulsar el botón derecho del ratón y activar la opción Run to Cursor.

46
3.8.9 SIMULACIÓN MEDIANTE BREAKPOINTS Y TRAZA
Un punto de ruptura o BreakPoint es un punto o instrucción donde la ejecución del programa se detiene, por
ello también se le suele llamar punto de paro, permitiendo el análisis del estado del microcontrolador. Para
continuar la ejecución del programa hay que volver a pulsar sobre Run o Animate.

Figura 3- 10: Situar un Breakpoint

Para situar un Breakpoint sobre una línea señalada por el cursor se pulsa el botón derecho del ratón, de
manera que aparece el menú desplegable, como en la figura 3-10. Selecciona Set Breakpoint y aparecerá
sobre el programa una “B” en rojo en la posición donde ha situado el punto de paro. Otra forma de situar o
eliminar un Breakpoint es realizando una doble pulsación con el ratón sobre el número de línea donde se
quiere situar el punto de parada.

3.8.10 SIMULACIÓN DE ENTRADAS


Una de las operaciones más habituales de cualquier simulación consiste en variar los valores de las líneas de
entrada. A ésto se denomina “estimular” la entrada. Para cambiar los estímulos de una entrada de un puerto
hay que seleccionar el menú Debugger > Stimulus. En la ventana que aparece, selecciona la pestaña
Pin Stimulus (figura 3-11).

Figura 3- 11: Menú para entrar en la ventana de estímulos

47
Si pulsa sobre Add Row, se irán añadiendo diferentes filas. Cada una de estas filas corresponde a un estímulo
sobre una línea de entrada. La forma de editarlos es pulsar sobre la casilla correspondiente y seleccionar la
patilla a la que se quiere vincular y el tipo de cambio que se desea realizar con ese pin para cada pulsación:
• High, poner la entrada a “1”.
• Low , poner la entrada a “0”.
• Toggle, cambiar de valor cada vez que se pulse. Ésta es la más habitual.
• Pulse, cambia el estado del pin y retorna de nuevo a su valor actual.

La figura 3-12 muestra como se ha configurado para las cinco líneas del puerto A, como entrada y en modo
Toggle.

Figura 3- 12: Configurar los estímulos para el Puerto A como entrada y modo Toggle

Tras pulsar el botón Fire habrá de ejecutarse la siguiente instrucción antes de ver los cambios a través de las
ventanas de visualización.
Es posible salvar la configuración realizada mediante el botón Save para recuperarla en posterior ocasión con
el botón Load.
Llegados a este punto del capítulo es muy conveniente que el lector simule el funcionamiento del programa
ensamblado Ensam3_1.asm con diferentes combinaciones de las líneas del Puerto A y compruebe los valores
de salida en el Puerto B y los cambios en todas las ventanas explicadas anteriormente.

3.9 GRABACIÓN CON EL ARCHIVO HEXADECIMAL


Una vez simulado el programa y comprobado que funciona correctamente, es tiempo de grabar físicamente
dicho programa en el PIC16F84A. Con el ensamblado del archivo fuente se ha generado un archivo ejecutable
con los códigos máquina a grabar en el PIC16F84A. Este archivo tiene extensión *.hex y se graba en el
PIC16F84A con ayuda de un grabador y el software asociado, tal como se ha estudiado en la guía 1. En este
caso se utilizará un programador compatible JDM y el software IC-Prog. Para ello se deben seguir los
siguientes pasos:
1. Conectar el grabador al ordenador. Insertar el PIC16F84A en el zócalo correspondiente, teniendo en
cuenta la orientación correcta del chip ayudándonos por la muesca de la cápsula.
2. Abrir el programa IC-Prog y comprobar que está correctamente configurado.
3. Abrir el archivo con extensión *.hex que contiene los datos a programar en el PIC16F84A. Para ello,
seleccionar el menú Archivo > Abrir archivo y, una vez dentro de la carpeta apropiada, elegir el archivo
a grabar, en este ejemplo el Ensam3_1.HEX.

48
4. Comprobar que los datos se han cargado en el área de Código de programa. También debe comprobarse
que los Bits configuración se ajustan a lo pretendido en el programa con la línea: “_ _CONFIG _CP_OFF
& _WDT_OFF & _PWRTE_ON & _XT_OSC”. En este caso:
o CP en 0FF: Protección de código inactiva.
o WDT en 0FF: Watchdog inactivo.
o PWRT en On: Power-up Timer activado.
o Oscilador: XT (a cristal de cuarzo).
5. Proceder a la grabación física del chip, tal como se explicó en el guía 1.

3.10 PRÁCTICAS DE LABORATORIO


El circuito para comprobar el correcto funcionamiento de los programas será el entrenador básico para
aprendizaje del PIC16F84A, representado en el esquema de la figura 1-2, que ya fue presentado en la primera
guía.
Respetando el procedimiento descrito en la guía 2: diseñar, ensamblar, simular y grabar el microcontrolador y
comprobar los siguientes programas. Visualizar los archivos resultantes *.hex y *.lst de cada uno de los
programas.

Ejercicio3_1.asm: Por los LEDs conectados al puerto B se visualiza el valor de una constante, por ejemplo el
número binario b’01010101’.

Ejercicio3_2.asm: Los LEDs conectados al nibble bajo del Puerto B se apagarán y los del nibble alto se
encenderán.

Ejercicio3_3.asm: Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado un
array de interruptores. Por ejemplo, si por el Puerto A se introduce “---11001”, por el Puerto B aparecerá
“xxx11001” (no importa el valor de los tres bits más altos del Puerto B, ver esquema de la figura 1-2).
En la entrada:
• Un interruptor cerrado representa un “0” lógico.
• Un interruptor abierto representa un “1” lógico.
En la salida:
• Un LED apagado representa un “0” lógico.
• Un LED encendido representa un “1” lógico.

49

También podría gustarte