Eso por que la arquitectura son distintas.
Por su parte el PIC16 tiene una memoria de instruccion de 14 bits, lo cual solo te queda para 1 byte y 6bit mas, mientras que el PIC18 tiene una memoria de instrucciones de 16bits y podrias aprovechar los 2 bytes
Es decir cada instruccion ( que ocupe un solo espacio ) ocuparia eso..
Ahora vos con la directiva DT. lo que creas es un RETLW de cada valor que tenes.. ejemplo
en memoria es lo mismo que:
RETLW 'R'
RETLW 'e'
RETLW 'a'
RETLW 'd'
Esto era util para cuando el micro NO poseia alguna forma de leer desde la FLASH, y se creaban tablas las cual indexaban a estos RETLW, en el caso del PIC16F1707 funciona por que el opcode del
RETLW k es
11 0100 kkkk kkkkY vos con el acceso indirecto lees unicamente el byte donde esta el valor k.
Pero en tu PIC18 al tener 16 bits, tendrias 2 bytes. Si usas
DT estarias creando RETLW, pero el acceso por tablas te permiten leer ambos bytes y no solo el menos significativo. Mirando el OPCODE de la instruccion RETLW del PIC18 encontras que es:
0000 1100 kkkk kkkkEntonces cuando lees por primera ves lees el valor k, y luego lees 0x0C. Por eso tenes ese caracter de mas que siempre es un 0x0C, asi para todos los valores, recorda que serian todos RETLW. Si observas en tu imagen es siempre el mismo caracter. Es decir el mismo numero ( 0x0C ) se esta enviando siempre. Si buscas 0x0C en la tabla de caracteres del LCD veras que corresponde a un valor de la CGRAM, es decir de los caracteres que vos creas, como no tenes creado nada ahi, lo que aparece es "basura".
Exactamente en la memoria de tu PIC verias esto con
dt:
Line Address Opcode Label DisAssy
28 0036 0C52 LEER_MAX RETLW 0x52
29 0038 0C65 RETLW 0x65
30 003A 0C61 RETLW 0x61
31 003C 0C64 RETLW 0x64
32 003E 0C69 RETLW 0x69
33 0040 0C6E RETLW 0x6E
34 0042 0C67 RETLW 0x67
35 0044 0C20 RETLW 0x20
36 0046 0C54 RETLW 0x54
37 0048 0C65 RETLW 0x65
38 004A 0C6D RETLW 0x6D
39 004C 0C70 RETLW 0x70
40 004E 0C65 RETLW 0x65
41 0050 0C72 RETLW 0x72
42 0052 0C61 RETLW 0x61
43 0054 0C74 RETLW 0x74
44 0056 0C75 RETLW 0x75
45 0058 0C72 RETLW 0x72
46 005A 0C65 RETLW 0x65
47 005C 0C3A RETLW 0x3A
48 005E 0C00 RETLW 0x0 Para esto quedan 2 opciones,
- leer cada 2 bytes, es decir leer e incrementar 2 veces.
- usar otra forma de almacenar datos.
Leer cada 2 bytes es una perdida de memoria/tiempo . Estariamos desperdiciando 1 byte por cada palabra de memoria ( 16 bits ), entonces tendriamos que buscar algo que no haga el RETLW sino que ponga el valor nomas en FLASH. Si Usas la directiva
data, en ves de
dt:
LEER_MAX: data "Reading Temperature:",0x00;
Tu mensaje en hexa es (asi comparas abajo):
52 65 61 64 69 6e 67 20 54 65 6d 70 65 72 61 74 75 72 65 3a 00
Con esa directiva tu flash queda asi, observa la 3er columna que es el contenido y si lo comparas con el hexa de tu mensaje vas a ver la relacion:
Line Address Opcode Label DisAssy
28 0036 6552 LEER_MAX CPFSGT 0x52, BANKED
29 0038 6461 CPFSGT 0xF61, ACCESS
30 003A 6E69 MOVWF UIE, ACCESS
31 003C 2067 ADDWFC UFRMH, W, ACCESS
32 003E 6554 CPFSGT 0x54, BANKED
33 0040 706D BTG UCON, 0, ACCESS
34 0042 7265 BTG 0xF65, 1, ACCESS
35 0044 7461 BTG 0xF61, 2, ACCESS
36 0046 7275 BTG UEP5, 1, ACCESS
37 0048 3A65 SWAPF 0xF65, F, ACCESS
38 004A 0000 NOP Con lo cual tu codigo para que funcione ahora si, seria asi (o como lo tenias vos):
MENSAJE:
MOVLW UPPER (LEER_MAX)
MOVWF TBLPTRU
MOVLW HIGH(LEER_MAX)
MOVWF TBLPTRH
MOVLW LOW(LEER_MAX)
MOVWF TBLPTRL
SENDING_TEXT:
TBLRD*+
MOVF TABLAT,W
BTFSC STATUS,Z
RETURN
CALL ENVIAR_DATO
GOTO SENDING_TEXT
;***************************************************************************************************
;*********************** DECLARACION DE MENSAJES PARA OPTIMIZACION DE CÓDIGOS **********************
;***************************************************************************************************
LEER_MAX: data "Reading Temperature:",0x00;
Ahi vi que tenes un retardo, no se por que lo tenes puesto, imagino que es para debug, pero no deberia estar.
En fin.. todo esto para explicarte que debes usar
data en ves de
dt, podrias haber usado de igual forma data para el PIC16, lo unico que no iban a funcionar como un RETLW.
Bibliografia:
MPASM™ Assembler,. MPLINK™ Object Linker,. MPLIB™ Object Librarian. User's Guide
http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf