Tablas PIC
-
Upload
jess-ortiz -
Category
Documents
-
view
32 -
download
6
description
Transcript of Tablas PIC
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.