TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: norak en 14 de Noviembre de 2008, 09:35:44
-
hola;
Estoy utilizando el pic18f4585 (las instrucciones se almacenan en 2 bytes)
(direcciones de 21 bits MSB:PCU(5)PCH(8)PCL ( 8 ):LSB)
(PCU == PCLATU ; PCH == PCLATH)
Necesito utilizar muchas tablas, con lo que superan las primeras 256 posiciones de memoria.
Para actualizar el PC convenientemente utilizo el siguiente código.
El problema es que cuando llamo a la tabla no me devuelve ni siquiera el primer caracter.
He comprobado que antes de la llamada a la tabla, el registro W tiene la dirección correspondiente
(la dirección de la tabla en concreto).
Se agredecerá enormemente cualquier sugerencia.
muchas gracias.
;----------------------------------------------------------------------------
no_err: clrf offset ; load offset of character table
start29: movlw UPPER TABnoerr
movwf PCLATU
movlw HIGH TABnoerr
movwf PCLATH
movlw LOW TABnoerr
addwf offset,1
clrf WREG
addwfc PCLATH,1
addwfc PCLATU,1
movf offset,W
call TABnoerr
rcall TxSerialSMS ; transmito el caracter al puerto serie de pc e incremento convenientemente el offset
btfss STATUS,Z ; If Z==1 --> Messagge Transmited
bra start29
;----------------------------------------------------------------------------
;Message to send
TABnoerr movwf PCL ; Move offset to PC lower
DT 0x0C,"ayuda,porfavor",0XA,0XD,0X0
;----------------------------------------------------------------------------
; Transmit Serial SMS Loop
TxSerialSMS: addlw 0
btfsc STATUS,Z ; Character == 00 ?
return ; Yes, Z == 1
; No, Z == 0
btfss PIR1,TXIF ; check if transmitter busy
bra $-2 ; wait until transmitter is not busy --> PC = PC - 2 (return last instruction)
movwf TXREG ; transmit the data
wait: lfsr 0,TXSTA
btfss INDF0,1 ; check TRMT bit in TXSTA (FSR)
bra wait ; TXREG full or TRMT = 0
incf offset,f ; TXREG empty or TRMT = 1
incf offset,f
return
;----------------------------------------------------------------------------
-
Hola Norak
yo he estado haciendo pruebas con los PIC18, especificamente con el PIC18F4550, y para ir familiarizandome con su arquitectura he hecho algunos ejemplos en ensamblador puedes verlos en el siguiente foro Ejemplos PIC18F4550 (http://www.todopic.com.ar/foros/index.php?topic=22737.0), ahi hay unos ejemplos para manejar tablas en los PIC18, te aconsejo que revises el ejemplo TxRx_0, en ese ejemplo manejo tablas que contienen mensajes, pero para estas tablas utilizo la instruccion tblrd , que es lo que recomienda Microchip para los PIC18, una de sus ventajas es que los mensajes ocupan la mitad de la memoria que cuando usas retlw. Ya que dices que vas a usar muchos mensajes posiblemente sea mejor que uses este metodo.
Sobre tu programa revisandolo rapidamente me parece que tienes un error en la parte donde defines tu tabla, la etiqueta TABnoerr deberia estar antes de la directiva DT no antes de la instruccion movwf PCL, de aqui que no leas el primer caracter, otro error es que el valor de offset debe variar en incrementos de 2 (0,2,4,6 ...), pero cuando realizas addwf offset,1 ,la variable offset tendra un valor de la posicion de memoria en la que se encuentra la tabla y eso es lo que te trae errores posteriores con los otros caracteres.
Saludos
-
Hola,
muchas gracias por tu ayuda.
Tienes razón, al no encontrar el error, me puese a documentarme y acabé por usar las instrucciones que mencionas.
(además de derivarse de ello las ventajas que describes)
Sobre los errores del código que comentas, la etiqueta TABnoerr, necesitaba que estuviera con la instrucción movwf PCL, para antes de acceder
a la tabla, el PCL tenga el valor adecuado.
Tienes razón con que el incremento tiene que ser en múltiplos de dos, si te fijas, lo hago en la rutina TxSerialSMS (dos instrucciones incf offset,1)
pero aquí que es posible que hayas encontrado el error por que en el código principal utilizo también la variable offset para calcular el valor que finalmente
irá al PCL (addwf offset,1) con lo que pierdo el valor anteriormente almacenado en esa variable.
muchas gracias.
uN Abrazo