Beruflich Dokumente
Kultur Dokumente
ejecucin
datos
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 Programa
instrucciones
Memoria Datos
Carga inicial
Datos Iniciales
ejecucin Procesador
datos
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.
PICs
Memoria Programa
instrucciones
Memoria Datos
Carga inicial
movlw addlw
retlw
Datos Iniciales
ejecucin Procesador
datos
Cualquier ensamblador ofrece instrucciones con parmetro inmediato. Los pic ofrecen adems una instruccin especialmente orientada para construir tablas
Tablas
; rutina CodigoAscii. Parmetro en w CodigoAscii: addwf PCL retlw 30h retlw 31h retlw 32h retlw 33h 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 parmetro. Hace uso de PCL y de las instrucciones retlw.
PCL y PCLATH
PCLATH PCL
Org 0 Goto inicio Org4 movlw 5h Addwf PCL Nop Nop Nop Nop Nop Goto inicio
0000 0000
0000 0001
Inicio
00 000
0000 0001
Contador de programa
PCL y PCLATH representan al contador de programa. El contador de programa siempre apunta a la SIGUIENTE instruccin a ejecutar
PCL y PCLATH
PCLATH 0000 0000 PCL 0000 0101
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCL Nop Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 0101
Contador de programa
PCL y PCLATH
PCLATH 0000 0000 PCL 0000 0110
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCL Nop Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 0110
Contador de programa
PCL y PCLATH
PCLATH 0000 0000 PCL 0000 1011
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCL Nop Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 0110
Contador de programa
Cuando se modifica PCL, el contador de programa se carga con el contenido de PCL y PCLATH
PCL y PCLATH
PCLATH 0000 0000 PCL 0000 1011
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCL Nop Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 1011
Contador de programa
PCL y PCLATH
PCLATH 0000 0101 PCL 0000 0110
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCLATH Nop Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 0110
Contador de programa
PCL y PCLATH
PCLATH 0000 0101 PCL 0000 0111
Inicio Org 0 Goto inicio Org4 movlw 5h Addwf PCLATH Addwf PCL Nop Nop Nop Nop Goto inicio (0000000000000) (0000000000100) (0000000000101) (0000000000110) (0000000000111) (0000000001000) (0000000001001) (0000000001010) (0000000001011)
00 000
0000 0111
Contador de programa
Modificar el PCLATH no afecta al control de ejecucin si no viene seguido de una modificacin del PCL.
PCL y PCLATH
PCLATH 0000 0101 PCL 0000 1100
nop nop nop nop nop nop nop (0010100001001) (0010100001010) (0010100001011) (0010100001100) (0010100001101) (0010100001110) (0010100001111)
00 101
0000 1100
Contador de programa
PCL,PCLATH: Pginas
PCLATH
PCL 0..255 Dado este comportamiento de PCL-PCLATH. La memoria de programa puede considerarse dividida en pginas:
En los 16F84 solo 10 de los 13 bits del contador de programa son tiles (slo 1K de memoria de programa): 8 en PCL y 2 en PCLATH. Por lo tanto 4 pginas.
0000 0000
0000 0001
0..255
0000 0010
0..255
0000 0011
0..255
Memoria de Programa
Pagina 1:
En este momento PCLATH==0. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa.
Tablas y pginas
Pagina 0:
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]: (w con valor 35h) [ ; rutina CodigoAscii. Parmetro en w CodigoAscii: [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
Modificamos primer PCLATH=01. Al modificar PCL; PCLATH |PCL se cargan en el contador de Programa. SOLUCION!
Pagina 1:
Tablas y pginas:
Tabla entre dos pginas: otro problema
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]: (w con valor 35h) [ ; rutina CodigoAscii. Parmetro en w CodigoAscii: [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:
Tablas y pginas:
[0005]mvlw HIGH CodigoAscii [0006]movwf PCLATH [0007]:movlw 5 [0008]:call CodigoAscii [0009]: (w con valor 35h) [ ; rutina CodigoAscii. Parmetro en w CodigoAscii: [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:
NO!
Pagina 1:
Pero si PCL desborda: PCL=0FFh PCL+1=00 Como PCLATH permanece a 00, al cargarse PCLATH|PCL en el contador de programa, salta a la direccin 0 de la pgina 0
Tablas y pginas:
[0005] [0006] [0007]:movlw 5 [0008]:call CodigoAscii [0009]: (w con valor 35h) [ ; rutina CodigoAscii. Parmetro en w CodigoAscii: [00F5] mvlw HIGH Salto [00F6] movwf PCLATH [00F7] addlw 3 [00F8]: addwf PCL,W [00F9]: btfsc STATUS,C [00FA]: incf PCLATH Salto: [00FB]: movwf PCL [00FC]: retlw 30h [00FD]: retlw 31h [00FE]: retlw 32h [00FF]: retlw 33h [0100]: retlw 34h [0102]: retlw 35h
Pagina 0:
SOLUCION!
Pagina 1:
Realizar primer una SUMA FICTICIA (addwf PCL,W) y comprobar el carry. Si hay desbordamiento sumar 1 a PCLATH
Conclusin
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 localizacin en la memoria de programa.