Tablas PIC

21
Tablas de datos en ensamblador de microcontroladores PIC

description

clase

Transcript of Tablas PIC

Tablas de datos en ensamblador de microcontroladores PIC

Facilitador: Ing. Paúl Romero

Modelo von Neumann

Memoria

Procesador

Programa

+

Datos

instrucciones

datos

Carga inicial

ejecución

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

Datos Iniciales

Modelo Harvard

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.

Memoria

Datos

Procesador

instrucciones

datos

Carga inicial

ejecución

Memoria

Programa

Datos Iniciales

PIC’s

Memoria

Datos

Procesador

instrucciones

datos

Carga inicial

ejecución

Memoria

Programa

Datos Iniciales

movlwaddlw

retlw…

Cualquier ensamblador ofrece instrucciones con parámetro inmediato. Los pic ofrecen además una instrucción

especialmente orientada para construir tablas

; rutina CodigoAscii. Parámetro en wCodigoAscii: addwf PCL

retlw 30hretlw 31hretlw 32hretlw 33hretlw 34hretlw 35hretlw 36hretlw 37hretlw 38hretlw 30h

Tablas

…movlw 5call CodigoAscii(w con valor 35h)

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

0000 0000 0000 0001

00 000 0000 0001

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCL (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

PCL y PCLATH “representan” al contador de programa. El contador de programa siempre apunta a la SIGUIENTE instrucción a ejecutar

0000 0000 0000 0101

00 000 0000 0101

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCL (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

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

0000 0000 0000 0110

00 000 0000 0110

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCL (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

PCLATH debe ser modificado explícitamente por el programador

0000 0000 0000 1011

00 000 0000 0110

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCL (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

Cuando se modifica PCL, el contador de programa se carga con el contenido de PCL y PCLATH

0000 0000 0000 1011

00 000 0000 1011

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCL (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

Lo que equivale a un salto o goto

00 000 0000 0110

0000 0101 0000 0110

PCLATH PCL

Contador de programa

Org 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCLATH (0000000000101)Nop (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

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

00 000 0000 0111

Contador de programa

0000 0101 0000 0111

PCLATH PCLOrg 0Goto inicio (0000000000000)Org4

Inicio movlw 5h (0000000000100)Addwf PCLATH (0000000000101)Addwf PCL (0000000000110)Nop (0000000000111)Nop (0000000001000)Nop (0000000001001)Nop (0000000001010)Goto inicio (0000000001011)

PCL y PCLATH

Modificar el PCLATH no afecta al control de ejecución si no viene seguidode una modificación del PCL.

00 101 0000 1100

Contador de programa

0000 0101 0000 1100

PCLATH PCLnop (0010100001001)nop (0010100001010)nop (0010100001011)nop (0010100001100)nop (0010100001101)nop (0010100001110)nop (0010100001111)

PCL y PCLATH

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

PCL,PCLATH: PáginasPCLATH

0000 0000

0000 0001

0000 0010

0000 0011

PCL

0..255

0..255

0..255

0..255

Memoria de Programa

Dado este comportamiento de PCL-PCLATH. La memoria de programa puede considerarse dividida en páginas:

En los 16F84 solo 10 de los 13 bits del contador de programa son útiles (sólo 1K de memoria de programa): 8 en PCL y 2 en PCLATH. Por lo tanto 4 páginas.

Tablas y páginas: problemas

[0005]:movlw 5[0006]:call CodigoAscii[0007]:… (w con valor 35h)[0008]:……[000B]:…[000C]:…

; rutina CodigoAscii. Parámetro en wCodigoAscii: [0105]: addwf PCL[0106]: retlw 30h[0107]: retlw 31h[0108]: retlw 32h[0109]: retlw 33h[010A]: retlw 34h[010B]: retlw 35h[010C]: retlw 36h[010D]: retlw 37h[010E]: retlw 38h[010F]: retlw 30h

Pagina 0:

Pagina 1:

En este momento PCLATH==0. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa.

¡NO FUNCIONA COMO ESPERAMOS!

Tablas y páginas

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

; rutina CodigoAscii. Parámetro en wCodigoAscii: [0105]: addwf PCL[0106]: retlw 30h[0107]: retlw 31h[0108]: retlw 32h[0109]: retlw 33h[010A]: retlw 34h[010B]: retlw 35h[010C]: retlw 36h[010D]: retlw 37h[010E]: retlw 38h[010F]: retlw 30h

Pagina 0:

Pagina 1:

Modificamos primer PCLATH=01. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa.

¡SOLUCION!

Tablas y páginas: Tabla entre dos páginas: otro problema

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

; rutina CodigoAscii. Parámetro en wCodigoAscii: [00FB]: addwf PCL[00FC]: retlw 30h[00FD]: retlw 31h[00FE]: retlw 32h[00FF]: retlw 33h[0100]: retlw 34h[0102]: retlw 35h[0103]: retlw 36h[0104]: retlw 37h[0105]: retlw 38h[0106]: retlw 30h

Pagina 0:

Pagina 1: Mientras PCL no se desborde, funciona como esperamos

Tablas y páginas:

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

; rutina CodigoAscii. Parámetro en wCodigoAscii: [00FB]: addwf PCL[00FC]: retlw 30h[00FD]: retlw 31h[00FE]: retlw 32h[00FF]: retlw 33h[0100]: retlw 34h[0102]: retlw 35h[0103]: retlw 36h[0104]: retlw 37h[0105]: retlw 38h[0106]: retlw 30h

Pagina 0:

Pagina 1: Pero si PCL desborda: PCL=0FFh PCL+1=00Como PCLATH permanece a 00, al cargarse PCLATH|PCL en el contador de programa, salta a la dirección 0 de la página 0

¡NO!

Tablas y páginas:

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

; rutina CodigoAscii. Parámetro en wCodigoAscii: [00F5] mvlw HIGH Salto[00F6] movwf PCLATH[00F7] addlw 3[00F8]: addwf PCL,W[00F9]: btfsc STATUS,C[00FA]: incf PCLATHSalto:[00FB]: movwf PCL[00FC]: retlw 30h[00FD]: retlw 31h[00FE]: retlw 32h[00FF]: retlw 33h[0100]: retlw 34h[0102]: retlw 35h

Pagina 0:

Pagina 1: Realizar primer una SUMA FICTICIA (addwf PCL,W) y comprobar el carry. Si hay desbordamiento sumar 1 a PCLATH

¡SOLUCION!

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.