Muy buenas, tengo un problema con las subrrutinas. He hecho un programa sin subrrutinas y funciona, pero cuando lo he querido hacer con ellas no funciona. Necesito las subrrutinas para no tener que repetir lineas de codigo inutilmente, y acudir a ellas cuando las necesite. Este es un programa de prueba pero si no lo consigo con algo sencillo no puedo pasar a algo mas complicado. Os adjuto el codigo y aver si podeis echarme una mano.
Lo he simulado en MPLAB y no me da ningun problema, es mas hace paso a paso lo que quiero. ¿Puede ser por algun bit de configuracion?
Tambien he probado a poner las subrrutinas al final (antes del END porsupuesto) y nada
Este programa sin subrrutinas, es decir, escribiendo en vez de call las lineas de codigo correspondiente funciona perfectamente, lo he probado, pero cuando metes los call no hace nada.
SALUDOS
;****************comunicacion serie
;
; RECEPCION/TRANSMISION
;
; Descripcion: espero a recibir un dato, lo guardo, lo incremento y lo
; reenvio con una temporizacion de 2 segundos.
;
;****************************************************
;DATOS
LIST P=18F8720
INCLUDE <P18F8720.INC>
TXDATO equ 0x17
RXDATO equ 0x16
CONT_100 equ 0x15
;CODIGO
ORG 0x00 ;inicio en el vector de reset
goto INICIO ;va a la primera instruccion de programa
;****************************************************
; RUTINA TEMPORIZACION
;****************************************************
TEMPORIZACION
movlw D"200" ;2 segundos
movwf CONT_100
bcf T0CON,T0CS ;timer0 como temporizador
bcf T0CON,T08BIT ;temporizador de 16 bits
bcf T0CON,T0SE ;flanco de subida
bsf T0CON,PSA ;desavilitamos preescalado
BUCLE_TEMP_1
clrf INTCON ;limpio flag e interrupciones
movlw H"00" ;precarga parte alta "IMPORTANTE EL ORDEN DE H Y L" (FF)
movwf TMR0H
movlw H"AF" ;precarga parte baja
movwf TMR0L
bsf T0CON,TMR0ON ;habilitamos temporizacion
BUCLE_TEMP_2
btfss INTCON,TMR0IF ;esperamos desvordamiento de 10ms (flag TMR0IF=1)
goto BUCLE_TEMP_2
decfsz CONT_100,1
goto BUCLE_TEMP_1
clrf INTCON ;limpio flag e interrupciones
bcf T0CON,TMR0ON
return
;****************************************************
;Recibo un dato
;****************************************************
RECIBO
btfss PIR3,RC2IF ;testeamos si el buffer de RX lleno(flag RC2IF=1)
goto RECIBO ;vacio = no hay dato
movf RCREG2,W
movwf RXDATO
bcf RCSTA2,CREN ;limpiamos posibles errores
bsf RCSTA2,CREN ;deshabilitando y habilitando CREN
return
;****************************************************
;Transmito un dato
;****************************************************
ENVIO
movf TXDATO,W
movwf TXREG2
BUCLE
btfss TXSTA2,TRMT ;esperamos registro TSR vacio (flag TRMT=1)
goto BUCLE ;no vacio, esperamos
return
INICIO
bsf TRISG,2 ;habilitamos RX2 como entrada
bcf TRISG,1 ;habilitamos TX2 como salida
movlw D"129" ;9600 baudios
movwf SPBRG2
movlw B"00000100" ;8 bits datos, com. asincrona, alta velocidad (menor error)
movwf TXSTA2
bsf RCSTA2,SPEN ;habilitamos puerto serie (USART)
bsf TXSTA2,TXEN ;habilitamos transmision
bsf RCSTA2,CREN ;habilitamos recepcion
call RECIBO
;------- OPERAMOS CON EL DATO ---------
movf RXDATO,W
movwf TXDATO
incf TXDATO ;incremento el dato recibido
call TEMPORIZACION
call ENVIO
FIN
nop
nop
goto FIN
END