Está en la página 1de 24

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008

L e o n _ E l e c

Pgina 1
ASM desde 0 (ASM desde cero)
He comenzado a realiza un tutorial de ASM y lo voy a poner aqu tambin.

A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos cmodos con el .

--------------------------------------------------------------------------

Lo primero que hay que saber para este lenguaje, es que cada lnea de cdigo, es una
instruccin que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes, como
por ejemplo el C, una lnea de instruccin, puede llevar uno o mas pasos que el CP debe
realizar. Ms adelante entendern el porqu.

A esto ltimo dicho, nos explica el porqu de un programa escrito en ASM (assembler) lleva
menos lnea de instruccin que el mismo programa realizado en otro lenguaje. Esto se traduce
que, cuanto menos lneas de cdigo, menor consumo de la memoria de programa.

Nota: Entendemos por el mismo cdigo, al realizar un software para realizar una dicha tarea.
Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes
lenguajes, y es el programa que se utiliz quien lo traduce a formato hex (1 y 0).

Ahora, Qu es el CP?

El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccin y realizar la
accin solicitada por el software.

Para dar un ejemplo un poco ms claro, digamos que el CP, es una persona. Esta persona se le
da un papel que tiene diferentes tareas a realizar. Estas tareas, estn una debajo de la otra y
lee lnea por lnea y hace lo que le dice esa lnea. Cada lnea, posee una instruccin que se
debe hacer. Cuando termin de hacer esa instruccin, contina con la lnea de abajo.

Supongamos que tenemos un papel que dice:

Levantar la mano izquierda.
Bajar la mano izquierda.
Saltar tres veces en el mismo lugar.
Levantar la mano derecha.
Saltar una vez en el mismo lugar.
Bajar la mano derecha.

El CP, har esas tareas sin negarse y lo har fielmente a lo que est escrito. Por lo que, si hace
una tarea mal, es porque le pusimos una o ms instrucciones mal.

Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas.
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 2
Estas cosas, dependern de cada microcontrolador y que debemos saber para poder
programar en forma correcta al PIC.
Cmo es la estructura del lenguaje ASM?

Es muy fcil, posee 4 columnas bien diferenciadas y que no es problema acordarse.

* La primera columna se llama ETIQUETA y sirve para darle el nombre a una posicin de la
memoria del programa al que se necesita apuntar. Los que no se den cuenta, ya lo harn.

* La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una instruccin a
realizar por el CP.

* La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la
segunda columna. Hay instrucciones que no tienen operando y las veremos ms adelante.

* Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea, el
usuario que est programando el PIC. En otras palabras, a nosotros. Siempre comienza con ;
(punto y coma)

Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para ayudar al
programador de que no se olvide que intent hacer.

Todos los lenguajes, desde los ms bsicos, hasta los ms avanzados, tienen esta
caractersticas ya que en el, pondremos que es lo que queremos hacer o explicar el programa.

Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin colocarla en esta
columna, si no que puede ir al margen de la planilla en dnde estamos programando. Y es aqu
dnde explicaremos la porcin de una rutina para entenderlo ms adelante.

Bien, veremos a continuacin, como se escriben las columnas:

ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES

O, podemos verlo as:

;OBSERVACIONES
;OBSERVACIONES
;OBSERVACIONES (y la cantidad que necesitemos)

ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES
Antes de empezar a ver las instrucciones, debemos concentrarnos en los registros.


[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 3
Qu son los registros?

Los registros, son posiciones de memoria el cual se utilizan para ir configurando el pic mientras
se corre el programa, cambiar de bancos para acceder a otras partes de memorias, son
banderas que nos van diciendo que est pasando con distintas operaciones, son habilitaciones
o deshabilitaciones para mdulos que trae el PIC. Por ejemplo, conversor Analgico/Digital,
PWM.

Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit.
Excepto la palabra configuracin y que la veremos mas adelante.

Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo
descripto anteriormente (habilitar/deshabilitar, etc).

A continuacin, ver el archivo adjunto. Es la posicin de la RAM y sus 4 bancos. Este, es del
PIC16F877

Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los registros
que posee este PIC. Vern que hay registros que se repiten. No quiere decir que estn
duplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa en que
banco estemos trabajando. (Ya lo entendern, no se preocupen).

Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe
acceder al banco que est dicho nombre. Es por eso, que esta tabla es muy importante a la
hora de trabajar.

Aprovechando que sub esta tabla del pic, cuando de ejemplo de programacin, ser sobre
este pic.

Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no
tienen este datasheet, descrguenlo de la pgina de Microchip. Cuando empezamos a
programar, lo necesitarn.
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 4


[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 5
Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un
dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede
hacer operaciones matemticas.

Observen con atencin el diagrama de bloque dnde se encuentra W que est adjuntado.

Ahora bien, si W es un registro, dnde est ubicado, ya que en el mapa de memoria no lo
encuentro?

Est en la posicin 00h y dice indirect addr. Esto es, porque el registro W, no es una posicin
de memoria fsica. Hay otros registros que estn igual. Pero no nos desviemos, el registro W,
es muy usado y recuerden, se utiliza para mover datos, o cargar datos en distintas posiciones
de la RAM y EEPROM.

Los microcontroladores PIC, poseen tres tipos de memorias.

* Memoria de Programa
Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o sea, nuestro programa.
Y tiene un ciclo de 1.000 de lectura y/o escrituras antes de estropearse y es del tipo FLASH
(pero este es flaco :mrgreen: Es un chiste).

* Memoria de datos de uso general
Es la memoria RAM del PIC. Recordemos, que los registros estn sobre la memoria RAM y la
memoria de uso general, comienza despus de los registros.

* Memoria de datos EEPROM
Es la memoria EEPROM que puede almacenar datos mas de 40 aos sin energa y 1.000.000 de
ciclos de escritura y lectura

El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada
posicin de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada lnea de instruccin
ocupa una posicin en la memoria de programa, as que, podemos poner hasta 8.000
instrucciones.

La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111', o
H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso.

La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 posiciones para nuestro uso.
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 6


[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 7
Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las instrucciones.


Registro STATUS

Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bit. Cada bit,
puede contener un 1 o 0.

Vemos ahora en detalle el registro STATUS (est adjuntado)

Este registro, tiene 3 Bit dedicado para las operaciones matemticas, 3 bit dedicado al cambio
de banco de memoria y 2 bit dedicado para saber que o quin produjo un Power Up (despertar
del micro). Y se puede leer y escribir en l (cambiar datos).

Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB).

BIT 7:

Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria.

1 = Banco 2 y 3
0 = Banco 0 y 1

BIT 6 y BIT 5

Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de
banco de memoria.

00 = Banco 0
01 = Banco 1
10 = Banco 2
11 = banco 3

BIT 4

Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC.

1 = Despus que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1
este bit.
0 = Se pone a 0 cuando el wachtdog o en castellano perro guardin (WDT) despierta al PIC.

BIT 3

Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 8
1 = Despus de que despierta (power up) o por la instruccin CLRWDT, se pone a 1
0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP

BIT 2

Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de
una operacin aritmtica y lgica.

1 = La operacin aritmtica o lgica dio como resultado 0
0 = La operacin aritmtica o lgica no dio como resultado 0

BIT 1

Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las instrucciones
ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa).

1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.
0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.

BIT 0

Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.

1 = Hubo un acareo del bit ms significativo (Bit 7) o sea cuando se excede de H'FF'
0 = No hubo acareo del bit ms significativo
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 9


[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 10
Breve instroduccin de las INSTRUCCIONES

Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de programa
tiene el mismo ancho. Justamente para poder alojar cada instruccin.

Las instrucciones, estn divididas en tres grupos. Los cuales son:

Byte-Oriented operation (Byte-Orientando a la operacin)
Bit-Oriented operation (Bit-Orientando a la operacin)
Literal and Control operation (Control y Literal de la operacin)


Primer grupo Byte-Oriented operation

Cada instruccin de este grupo est compuesta por:

OPCODE (Cdigo)
DESTINATION (Destino)
FILE REGISTER ADDRESS (Direccin del archivo de registro)


El OPCODE o cdigo, es el cdigo de cada instruccin y que es nica para cada
instruccin. Est formada por los bit del 13 al 8.

El DESTINATION o el destino, indica en dnde se va a guardar el dato. Por ejemplo, si
hacemos una suma, tenemos dos opciones dnde guardarlo, una puede ser el registro W
y la otra opcin puede ser otro registro cualquiera o una posicin de la RAM. Est
formada por el bit 7.

La constante que nos indica esto es la letra d. Si esta letra es 0, la operacin se guardar
en el registro W. EN cambio si vale 1, la operacin se guardar en el registro o posicin
de memoria que estemos trabajando al momento de usar una instruccin.

Hay instrucciones, como veremos ms adelante, que no es necesario indicar dnde
queremos guardar la operacin, ya que se hace en forma automtica. Y hay otras
instrucciones que si no se indica el destino, nos puede dar un error al compilar o el
compilador lo elegir el y por ende, nos puede ejecutar mal el programa.

Y por ltimo, tenemos el FILE REGISTER ADDRESS que se carga con la direccin
del registro a ser guardado. Est formada por los bit 6 al 0. La constante que nos indica
esto, es la letra f

Segundo grupo Bit-Oriented operation

Cada instruccin de este grupo est compuesta por:

OPCODE (Cdigo)
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 11
BIT ADDRESS (Bit de direccin)
FILE REGISTER ADDRESS (Direccin del archivo de registro)


OPCODE es igual al primer grupo. Est formado por los bits 13 al 10.

El BIT ADDRESS, se utiliza para direccionar la operacin. Est formado por los bits 9
al 7. Como pueden observar, se sacrific bit del opcode para drselo al bit address. La
constante que nos indica esto es la letra b

Y por ltimo tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Est
formado por los bit 6 al 0. Igual que en el primer grupo. La constante que nos indica
esto es la letra f.

Tercer grupo Literal and Control

Cada instruccin de este grupo, est compuesta por:

OPCODE
LITERAL


OPCODE es igual que en el primer grupo. Est compuesta por los bits 13 al 8. Excepto
para las instrucciones CALL y GOTO que est compuesta por los bit 13 al 11 (prestar
mucha atencin a esto, cuando veamos estas dos instrucciones entendern la
importancia).

Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar
al registro W, en fin, un nmero decimal, binario o hexadecimal. O puede ser una valor
de direccin a dnde apuntar para las instrucciones CALL y GOTO.

Est compuesta por los bits 7 al 0. Excepto para las instrucciones CALL y GOTO que
est compuesta por los bit 10 al 0 (prestar mucha atencin a esto, cuando veamos estas
dos instrucciones entendern la importancia).

Est adjuntado las 35 instrucciones agrupadas por los tres grupos

Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro
STATUS y otras no.
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 12


[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 13
Las instrucciones

Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de memoria. Si,
leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, es como se
escriben, que hace cada instruccin y lo ms importante que bit del REGISTRO afecta.

Vamos a ir vindolo por orden alfabtico. Y otra cosita ms, como es de esperarce, estn en
INGLES o son abreviaturas pero en INGLES.

Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal;
B'01111011' es en binario.

ADDLW

Suma un valor designado por el programador al registro W

Ejemplo
ADDLW .128


Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor .133

Para recordar, ADD es sumar, L es Literal y W es el registro W

Afecta a:

Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'


ADDWF

Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo
elige el programador.

Ejemplo:
ADDWF TEMP,W


Si W tena guardado .133 y la pocicin de la RAM llamada TEMP tena el valor cargado con .2,
W vale .135 y TEMP contina valiendo .2

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 14
Ahora si hubiera puesto as:
ADDWF TEMP,F


TEMP valdra .135 y W valdra .133

Para recordar, F, es File Register Address.

NOTA: Para indicar la direccin de dnde se guarda, tambin se puede poner 0 o 1 en vez de W
o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP (para este caso).

Afecta a:

Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'


ANDWF

Realiza la operacin AND entre W y un registro designado por el programador. El destino de
esta operacin lo elije el programador.

Ejemplo:
ANDWF TEMP,F


Si antes de la instruccin W vale B'11100011' y TEMP vale B'00111010' Despus de la
instruccin TEMP vale B'00100010' y W vale B'11100011'

Afecta a:

Z Se pone a 1 si la operacin es 0

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 15

BCF

Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:
BCF TEMP,2


Antes de la instruccin TEMP vale B'11111011'. Despus de la instruccin TEMP vale
B'11111111'

Para recordar, Bit Clear es borrar File es archivo o registro

Afecta a:

Z Se pone a 1 si la operacin es 0


BSF

Pone a 1 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:
BSF TEMP,0


Antes de la instruccin TEMP vale B'01110110'. Despus de la instruccin TEMP vale
B'01110111'

Para recordar, Bit Set es poner a 1 File Archivo o registro

No afecta a ningn Bit del registro Status.

BTFSC

Salta un lnea si el bit de un registro es cero. El bit debe ser indicado por el programador.

Ejemplo:
BTFSC TEMP,5
BCF PORTA,0
BSF PORTB,0
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 16


Caso 1:

TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es 0, salta la
instruccin BCF PORTA,0 y ejecuta la siguiente lnea que es BSF PORTB,0 y continua haciendo la
instruccin.

Caso 2:

TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es 1 no salta la
instruccin y har la instruccin BCF PORTA,0 y luego continua con la instruccin BSF PORTB,0

Para recordar Bit Test es chequear File Skip es salto Clear

No afecta a ningn Bit del registro Status.

BTFSS

Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el programador.

Ejemplo:
BTFSS TEMP,3
ADDWF PORTC
ANDWF NODO


Caso 1:

TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es 1, salta la
instruccin ADD PORTC y ejecuta la siguiente lnea que es ANDWF NODO y contina haciendo
la instruccin.

Caso 2:

TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es 0 no salta la
instruccin y har la instruccin ADD PORTC y luego contina con la instruccin AND NODO.

Para recordar Bit Test es chequear File Skip es salto Set

No afecta a ningn Bit del registro Status.

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 17
CALL

Se dirige a una direccin de la memoria de programa designado por el programador. En otras
palabras, se utiliza para dirigirse a una rutina o tarea. Su principal ventaja es que una vez que
finaliz la tarea, vuelve al punto siguiente desde dnde se llamo.

Ejemplo :
CALL ESC_PORTB

Para recordar, CALL es llamada.

No afecta ningn bit del registro Status.
------------------------------------------------------------------------------------------------------------------------------
Hacemos una excepcin con respecto a ver las instrucciones por orden alfabtico y veremos la
instruccin GOTO.
------------------------------------------------------------------------------------------------------------------------------

GOTO

Se dirige a una direccin de la memoria de programa designado por el programador. En otras
palabras, se utiliza para saltar instrucciones que no queremos que se ejecuten. A diferencia de
la instruccin CALL, no hay forma de volver cuando se ejecuta la instruccin.

Ejemplo:
GOTO INICIO


Para recordar GO TO es ir a.

No afecta a ningn bit del registro Status.

Extendiendo la explicacin.

Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelente explicacin
que continua, por desgracia no es ma (ojal fuera mi explicacin), son de las personas Maunix
y BrunoF (del foro todopic) .

En la siguiente imagen, vemos el diagrama de bloques del PC o CP.

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 18


El PC es de 13 bits en este caso (8kwords). 14 son los bits de cada "Word" o instruccin que se
graban en cada posicin de la FLASH (memoria de programa).
El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes en el registro
PCLATH.

Los pic al tener un set de instrucciones reducido no puede en una sola instruccin meter todos
los bits necesarios para direccionar toda su memoria.

EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALL o un GOTO,
solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2 los rellenas con el
PCLATH (para completar los 13bits).

El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un call desde la pagina 0 a la
pgina 3 y luego un return el cdigo SI volver a la pgina 0, pero el PCLATH sigue apuntando
a la pgina 3, entonces si usas otro goto o call, debes tener en cuenta de modificar el PCLATH.

Entonces, dijimos que:

El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.

Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copian del registro
PCLATH. El pclath solo estar all para esa situacin.

En un return o retfie la microelectrnica del PIC, pega la direccin del PC que estaba guardada.

Lo vemos con un ejemplo
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 19


1.
STACK = vaco
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230

2. El STACK tiene en su posicin 0 la direccin 0x00A0.
PC = 111000110000

3. Se ejecuta la subrutina y en ese punto el PC ya qued en
PC = 111000110111

4. Viene un RETURN.
La microelectrnica del PIC copiar el stack tal cual en el program counter + 1
Valor STACK 0x00A0 + 1 --> PC = 0x00A1

5. EL cdigo sigue ejecutndose en la pgina 0 pero hay que tener en cuenta que el PCLATH
apunta a la pgina 3 por ello si hars otro CALL o GOTO, debers cambiar de nuevo el PCLATH
si la subrutina no est en el banco 3.

Para cerrar el tema

Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayan todas las dudas ya
que es muy importante. Vayamos al tema tema del PC, computed goto(lo que algunos llaman
"tabla"), call, returns y goto.

El Program Counter(PC) est conformado en esta familia de C (y refirindonos a la familia
16F, las otras poseen ms o menos bits implementados) por 13 bits repartidos entre dos
registros: PCH y PCL.
El PCL es legible/escribible directamente a travs del registro fsico PCL (valga la redundancia).
En cambio, el PCH no es directamente accesible. No puede ser ledo, y slo puede se grabado
mediante un buffer que contiene el valor temporalmente (oh! aqu aparece nuestro famoso
PCLATH). Entonces, recordar: El PCLATH es slo un buffer temporal que almacena los 5 bits de
mayor peso del PC para ser escritos cuando se ejecute una instruccin que lo requiera.

Ahora, hay dos situaciones posibles en las que el PC debe ser cargado de manera distinta: una
es cuando queremos trabajar con tablas y otra cuando realizamos un call o un goto que no
est en el mismo banco.

1era situacin: Tabla (Comuted Goto)

La tabla es una situacin de uso del PC en la que se afecta directamente al registro PCL.
Cuando se afecte directamente al PCL mediante una instruccin, es necesario que el usuario
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 20
asegure que PCLATH tenga sus 5 bits pre-cargados adecuadamente.

Hago un ejemplo:

Mal:

org 0x000
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Bien:
org 0x000
movlw 0x03
movwf PCLATH
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Mejor:
org 0x000
pageselw tabla
movlw 0x01
call tabla


org 0x300
tabla
addwf PCL,F
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 21
retlw 0x03
retlw 0x01
retlw 0x0F
.....

Pageselw es una instruccin del MPASM que genera dos instrucciones: un movlw literal y un
movwf PCLATH. El valor del literal es automticamente seleccionado por el ensamblador segn
la etiqueta(o posicin de memoria) que se le especifique. En el caso anterior pageselw tabla
generara estas dos instrucciones:

movlw 0x03
movwf PCLATH

Si no aseguramos que los 5 bits del PCLATH estn correctamente seteados al momento de
afectar al PCL mediante alguna instruccin (generalmente es la addwf, pero puede usarse
subwf y muchas otras) entonces el programa saltar a una posicin indeseada.


2da situacin: CALL y GOTO

En esta familia de C, cada instruccin es codificada en 14 bits. En el caso de las instrucciones
CALL y GOTO, su estructura es la siguiente:

F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Donde las F indican cul instruccin es la que debe ejecutarse (100 para la CALL 101 para la
GOTO), y las k corresponden a la direccin a la cual queremos llamar(con un CALL) o saltar(con
un GOTO).

Aqu se ve claramente un problema. Podemos ver que un CALL o un GOTO slo almacena 11
bits de la direccin a la cual debe ir. 11 bits es un mximo 2048 posiciones. Qu pasa cuando
un C posee ms de 2k de memoria Flash entonces? Por ejemplo, un 16F877A posee 8k de
memoria Flash. Cmo hara para llamar a una subrutina que est ms all de la posicin 2047
de la flash?
La solucin nuevamente se encuentra en el PCLATH (y es nuevamente el usuario el que tiene el
deber de pre-cargar el valor adecuado).

Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta 8kwords (una word
es en esta familia un conjunto de 14 bits que conforman una instruccin la cual se aloja en la
memoria FLASH del C). Un CALL o un GOTO slo contienen los 11 bits de menor peso de la
direccin a la cual ir, por lo que los 2 bits restantes debern ser pre-cargados en los bits 4 y 3
del registro PCLATH por el usuario programador.

Cuando se ejecuta una instruccin CALL o GOTO, es imprescindible que el registro PCLATH est
correctamente precargado. La instruccin a la que el C ir estar conformada por 13 bits y
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 22
ellos sern:

PCLATH, 4 PCLATH, 3 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Cabe mencionar que el C carga a PC<10:0> con el valor pasado por los 11 bits de K, y a
PC<12:11> con el valor de los bits PCLATH<4:3>. El registro PCLATH no es modificado de
ninguna manera. Slo se leen esos dos bits.

Por ejemplo, en un C de 8kWords hay 4 bancos. 1 banco cada 2048 words. Si se est en un
banco y se quiere ir a otro es necesario precargar antes dichos bits del PCLATH para poder
hacerlo.

El usuario no debe preocuparse por precargar el PCLATH en dos situaciones:
Si el C no posee ms de 2kWords de memoria Flash;
O si en el cdigo creado por el usuario, no se utiliza la memoria FLASH ms all de la posicin
2047(0x7FF).

Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que los bits PCLATH<4:3>
se encuentren ambos en cero.

Vamos con un par de ejemplos:

Mal:

org 0x000 ;Esto es banco0
call cruzo


org 0x800 ;Esto ya es el banco1
cruzo
retlw 0xFF
.....


Bien:

org 0x000 ;Esto es banco0
movlw 0x08
movwf PCLATH
call cruzo


org 0x800 ;Esto ya es el banco1
cruzo
retlw 0xFF
[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 23
.....


Mejor:

org 0x000 ;Esto es banco0
pagesel cruzo ;automaticamente seleccionar banco
call cruzo


org 0x800 ;Esto ya es el banco1
cruzo
retlw 0xFF
.....



Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsf PCLATH, 3 y
un bcf/bsf PCLATH, 4. El software ensamblador selecciona automticamente la instruccin bcf
o bsf segn el banco en el cual se encuentra la etiqueta(o posicin de memoria) que se le
especifique. En el caso anterior pagesel cruzo generara estas dos instrucciones:

bsf PCLATH,3
bcf PCLATH,4

Ya que la subrutina cruzo se encuentra en el banco1.

Finalmente, cuando se ejecuta una instruccin CALL, se carga en el STACK el valor de la
posicin actual ms 1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13 bits, por
lo que durante las instrucciones RETURN, RETLW y RETFIE no es necesario precargar al
PCLATH.

Para ms informacin, ver el esquema seccin 2.3 del datasheet de los PIC16F87XA que habla
de cmo cargar al PC segn cada situacin.

[ENSAMBLADOR DESDE CERO] 16 de noviembre de 2008


L e o n _ E l e c

Pgina 24
Tutorial creado por Leon_Elec.
Versin 1.3
Portado a PDF por Meta.
Cualquier sugerencia, dudas o cualquier comentario, puedes realizarlas en el foro aqu.
http://www.forosdeelectronica.com/about28343.html
Puede haber futuras actualizaciones, mejoras y contenidos.

También podría gustarte