Sunteți pe pagina 1din 20

Tablas de datos en ensamblador

de microcontroladores PIC
Modelo von Neumann

Memoria
instrucciones Carga inicial

Programa

+
datos
ejecución Datos Iniciales
Datos

Procesador

En el modelo de von Neumann hay una única memoria


de donde el procesador extrae tanto datos como instrucciones.
El programa se carga en la memoria junto con los datos iniciales
Modelo Harvard
Memoria
Memoria
Programa
Datos
instrucciones

Carga inicial

ejecución datos
Datos Iniciales

Procesador

En el modelo de procesador basado en la arquitectura Harvard


la memoria de programa está separada de la memoria de datos.
El programa se carga en la memoria de programa. Y los datos iniciales
deben cargarse como valores inmediatos de las instrucciones.
PIC’s
Memoria
Memoria
Programa
Datos
instrucciones
movlw
Carga inicial addlw
retlw
… ejecución datos
Datos Iniciales

Procesador

Cualquier ensamblador ofrece instrucciones con parámetro


inmediato. Los pic ofrecen además una instrucción
especialmente orientada para construir tablas
Tablas
; rutina CodigoAscii. Parámetro en w
CodigoAscii: addwf PCL
retlw 30h
… retlw 31h
movlw 5 retlw 32h
call CodigoAscii retlw 33h
(w con valor 35h) retlw 34h
retlw 35h
retlw 36h
retlw 37h
retlw 38h
retlw 30h

Una tabla viene a ser una estructura de datos programada que devuelve un valor u otro
dependiendo del parámetro. Hace uso de PCL y de las instrucciones retlw.
PCL y PCLATH

PCLATH PCL
Org 0
0000 0000 0000 0001 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCL (0000000000101)
Nop (0000000000110)
00 000 0000 0001 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

PCL y PCLATH “representan” al contador de programa.


El contador de programa siempre apunta a la SIGUIENTE instrucción a ejecutar
PCL y PCLATH

PCLATH PCL
Org 0
0000 0000 0000 0101 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCL (0000000000101)
Nop (0000000000110)
00 000 0000 0101 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

Al cambiar el contador de programa PCL se ve modificado. No así PCLATH


PCL y PCLATH

PCLATH PCL
Org 0
0000 0000 0000 0110 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCL (0000000000101)
Nop (0000000000110)
00 000 0000 0110 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

PCLATH debe ser modificado explícitamente por el programador


PCL y PCLATH

PCLATH PCL
Org 0
0000 0000 0000 1011 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCL (0000000000101)
Nop (0000000000110)
00 000 0000 0110 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

Cuando se modifica PCL, el contador de programa se carga


con el contenido de PCL y PCLATH
PCL y PCLATH

PCLATH PCL
Org 0
0000 0000 0000 1011 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCL (0000000000101)
Nop (0000000000110)
00 000 0000 1011 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

Lo que equivale a un salto o goto


PCL y PCLATH

PCLATH PCL
Org 0
0000 0101 0000 0110 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCLATH (0000000000101)
Nop (0000000000110)
00 000 0000 0110 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

!!NO OCURRE LO MISMO¡¡ si se modifica el PCLATH


PCL y PCLATH

PCLATH PCL
Org 0
0000 0101 0000 0111 Goto inicio (0000000000000)
Org4
Inicio movlw 5h (0000000000100)
Addwf PCLATH (0000000000101)
Addwf PCL (0000000000110)
00 000 0000 0111 Nop (0000000000111)
Nop (0000000001000)
Contador de programa Nop (0000000001001)
Nop (0000000001010)
Goto inicio (0000000001011)

Modificar el PCLATH no afecta al control de ejecución si no viene seguido


de una modificación del PCL.
PCL y PCLATH

PCLATH PCL
nop (0010100001001)
0000 0101 0000 1100 nop (0010100001010)
nop (0010100001011)
nop (0010100001100)
nop (0010100001101)
nop (0010100001110)
00 101 0000 1100 nop (0010100001111)

Contador de programa

Al modificar PCL: PCLATH+PCL se cargan en el contador de programa


PCL,PCLATH: Páginas
PCLATH PCL

0..255 Dado este


0000 0000
comportamiento de
PCL-PCLATH. La
memoria de programa
0000 0001 0..255 puede considerarse
dividida en páginas:
0000 0010 En los 16F84 solo 10
0..255
de los 13 bits del
contador de programa
son útiles (sólo 1K de
0000 0011 0..255 memoria de
programa): 8 en PCL
Memoria de y 2 en PCLATH. Por lo
Programa tanto 4 páginas.
Tablas y páginas: problemas
[0005]:movlw 5
[0006]:call CodigoAscii
[0007]:… (w con valor 35h)
Pagina 0: [0008]:…

[000B]:… ¡NO FUNCIONA COMO
[000C]:… ESPERAMOS!
; rutina CodigoAscii. Parámetro en w
CodigoAscii:
[0105]: addwf PCL
[0106]: retlw 30h
[0107]: retlw 31h
En este momento
Pagina 1: [0108]: retlw 32h PCLATH==0.
[0109]: retlw 33h
[010A]: retlw 34h
Al modificar PCL; PCLATH |
[010B]: retlw 35h PCL se cargan en el
[010C]: retlw 36h
[010D]: retlw 37h
contador de Programa.
[010E]: retlw 38h
[010F]: retlw 30h
Tablas y páginas
[0005]mvlw HIGH CodigoAscii
[0006]movwf PCLATH
[0007]:movlw 5 Modificamos primer
Pagina 0: [0008]:call CodigoAscii
[0009]:… (w con valor 35h)
PCLATH=01.
[ Al modificar PCL; PCLATH |
PCL se cargan en el
; rutina CodigoAscii. Parámetro en w
CodigoAscii: contador de Programa.
[0105]: addwf PCL
[0106]: retlw 30h
[0107]: retlw 31h ¡SOLUCION!
[0108]: retlw 32h
Pagina 1: [0109]: retlw 33h
[010A]: retlw 34h
[010B]: retlw 35h
[010C]: retlw 36h
[010D]: retlw 37h
[010E]: retlw 38h
[010F]: retlw 30h
Tablas y páginas:
Tabla entre dos páginas: otro problema

[0005]mvlw HIGH CodigoAscii


[0006]movwf PCLATH
[0007]:movlw 5
Pagina 0: [0008]:call CodigoAscii
[0009]:… (w con valor 35h)
[

; rutina CodigoAscii. Parámetro en w


CodigoAscii:
[00FB]: addwf PCL
[00FC]: retlw 30h
[00FD]: retlw 31h
Pagina 1: [00FE]: retlw 32h Mientras PCL no se
[00FF]: retlw 33h
[0100]: retlw 34h
desborde, funciona como
[0102]: retlw 35h esperamos
[0103]: retlw 36h
[0104]: retlw 37h
[0105]: retlw 38h
[0106]: retlw 30h
Tablas y páginas:

[0005]mvlw HIGH CodigoAscii


[0006]movwf PCLATH
[0007]:movlw 5
Pagina 0: [0008]:call CodigoAscii
[0009]:… (w con valor 35h)
[

; rutina CodigoAscii. Parámetro en w


CodigoAscii:
[00FB]: addwf PCL
[00FC]: retlw 30h
[00FD]: retlw 31h ¡NO! Pero si PCL desborda:
Pagina 1: [00FE]: retlw 32h PCL=0FFh
[00FF]: retlw 33h
[0100]: retlw 34h PCL+1=00
[0102]: retlw 35h Como PCLATH permanece a
[0103]: retlw 36h
[0104]: retlw 37h 00, al cargarse PCLATH|PCL
[0105]: retlw 38h en el contador de programa,
[0106]: retlw 30h
salta a la dirección 0 de la
página 0
Tablas y páginas:

[0005]
[0006]
[0007]:movlw 5 ¡SOLUCION!
Pagina 0: [0008]:call CodigoAscii
[0009]:… (w con valor 35h)
[

; rutina CodigoAscii. Parámetro en w


CodigoAscii:
[00F5] mvlw HIGH Salto
[00F6] movwf PCLATH
[00F7] addlw 3
[00F8]: addwf PCL,W
Pagina 1: [00F9]: btfsc STATUS,C Realizar primer una SUMA
[00FA]: incf PCLATH
Salto:
FICTICIA (addwf PCL,W) y
[00FB]: movwf PCL comprobar el carry. Si hay
[00FC]: retlw 30h
[00FD]: retlw 31h
desbordamiento sumar 1 a
[00FE]: retlw 32h PCLATH
[00FF]: retlw 33h
[0100]: retlw 34h
[0102]: retlw 35h
Conclusión
• Las tablas son unas estructuras de datos muy
útiles para cargar datos iniciales en el programa
• Algunos problemas pueden surgir si no
localizamos adecuadamente la tabla en la
memoria de programa
• Es necesario tener en cuenta tales problemas y
resolverlos de manera que la funcionalidad de la
tabla se vuelva independiente de la localización
en la memoria de programa.

S-ar putea să vă placă și