De que PIC estamos hablando ?
Es para ver el archivo del linker
--------------------------------------
Voy a explicar levemente cual es la diferencia.
_vXLCDreg1 equ 0x20
_vXLCDreg2 equ 0x21
El comando EQU, como el CBLOCK lo que hacen es asignar valores constantes. Veamos un ejemplo, esto es valido:
HOLA EQU 1
BSF HOLA, HOLA
Observa que no se comprueba que realmente HOLA sea una direccion o un registro, simplemente se hace una sustitucion quedando BSF 1, 1
O mejor dicho poniendo a 1 el bit 1 de la direccion de memoria 0x01.
Otro ejemplo en el que supongamos que tenes memoria RAM desde 0x000 a 0x1FF, vos podes hacer:
HOLA EQU 0x200
BSF HOLA, 1
Es decir no le va a importar que se exceda, te puede llegar a dar un warning como maximo.
Otro ejemplo que suele pasar en personas que recien comienzan:
;Archivo1.asm
CBLOCK 0x20
Var1
Var2
Var3
ENDC
;Archivo2.asm
CBLOCK 0x20
Var4
Var5
Var6
ENDC
Var1 y Var4 ambos tienen asignado una constante que es 0x20. Y no se presenta ningun error al usuario.
Usualmente estos casos son mas faciles de implementar y explicar, que hacer lo mismo con la directiva udata.
Una cosa que tenes que darte cuenta es que sos vos quien posiciona exactamente en el lugar que desea cada "registro", y vos tenes que llevar el control. Esto no es muy lindo cuando por ejemplo usas un codigo en un PIC16 que su RAM comienza en 0x0C y en otro comienza en 0x20.
Existe una forma de hacerlo en el que el usuario NO se involucra en el posicionamiento del mismo. Y es con udata y udata_(aca hay varios).
En este caso vos le indicas al LINKER que reserve espacio para esa variable.
udata
Var1 res 1
Double res 2
El compilador procede a compilar el archivo y luego se lo da al LINKER quien acomoda los registros como desea y ademas termina completando el codigo.
Al usar esto se solucionan muchos problemas que ocurrian antes:
Deberia darte un error.
Intentar poner variables donde no existe memoria, volvamos al ejemplo de 0x000 a 0x1FFF
udata 0x200
Var1 res 1
Double res 2
Deberia darte otro error. Diciendo que es imposible ponerlo en el lugar.
-----------------------------------------------------------------------------------------------------
Si observas el manual del MPASM ( compilador ) y el linker. Vas a notar que hay varios UDATA.
udata (caso DATABANK en los archivos dle linker )
udata_acs ( para PIC18 y su ACCESS BANK )
udata_ovr ( Caso en que sea necesario definir 2 variables con las mismas direcciones)
udata_shr ( Caso de los SHAREBANK en los archivos del linker )
Y es aca donde importa realmente el PIC que usas. Ya que las divisiones de memoria muchas veces no son iguales, por ejemplo hay PICs que TODO banco1 se puede acceder desde el banco2
Entonces eso esta en el archivo del linker como SHARE, por lo cual vas a usar udata_shr para ocupar ese espacio.
Un ejemplo seria el PIC16F84A
SHAREBANK NAME=gpr0 START=0xC END=0x4F
SHAREBANK NAME=gpr0 START=0x8C END=0xCF PROTECTED
Pero por ejemplo un PIC16F887, tiene una parte de memoria que se puede acceder desde todos los bancos ( direccion de memoria 0x70 a 0x7F ) y luego tenes partes de memoria que pertenecen a un solo banco y no se puede acceder desde otro.
DATABANK NAME=gpr0 START=0x20 END=0x6F
DATABANK NAME=gpr1 START=0xA0 END=0xEF
DATABANK NAME=gpr2 START=0x110 END=0x16F
DATABANK NAME=gpr3 START=0x190 END=0x1EF
SHAREBANK NAME=gprnobnk START=0x70 END=0x7F
SHAREBANK NAME=gprnobnk START=0xF0 END=0xFF PROTECTED
SHAREBANK NAME=gprnobnk START=0x170 END=0x17F PROTECTED
SHAREBANK NAME=gprnobnk START=0x1F0 END=0x1FF PROTECTED
En el cual si quisiera ponerlo en la parte de sharebank, deberia usar udata_shr, sino solo udata.
Otro ejemplo de udata_shr, es que si queres reservar mas de 16 lugares ( 0x70 a 0x7F ) tendrias un error, por que es imposible poner algo mas grande en solo 16 lugares.