Hola
Estoy dando mis primeros pasos en assembler y los doy dentro del
16F628A. Vengo de C y C++, asi que tengo conocimientos en programaci=F3n, pero...Tengo un c=F3digo (que copio al final del mensaje) con el que intento probar los temporizadores y llegar a los 5 minutos, pero me encontre con un funcionamiento extra=F1o del RETURN. El tema esta en que despu=E9s de la dir 0x00 hago un GOTO a Inicio, y cuando llega al RETURN (tres lineas despu=E9s del label Tiempo) vuelve a la linea "GOTO Inicio" posterior a 0x00 y entra en bucle. Esperaba que RETURN me retorne a la linea posterior al GOTO. =BFEstoy equivocado? =BFComo se resuelve?
Pero en esto aprendi a desconfiar de todo, :D estoy probando el c=F3digo en MPLAB 8.10 y no se si es el entorno o RETURN se comporta diferente a como esperaba.
=BFComo funciona RETURN?
;---------------Encabezado------------- LIST P=3D16F628 #include ;--------------------------------------
ORG 0x00 GOTO Inicio
;---------------- OCIO ----------------
OCIO SLEEP
;---- Atenci=F3n de la interrupci=F3n -----
ORG 0x04 GOTO Led GOTO OCIO
;--------------- Inicio ---------------
Inicio BSF STATUS,5 ; cambio al banco 0 (TRISB) CLRF TRISB ; seteo todo TRISB como salida
MOVLW 0x07 ; cargo w con 00000111 MOVWF OPTION_REG ; el Divisor =3D 256 BCF STATUS,5 ; regreso al banco 0
; GIE habilita todas las interrupciones ; T0IE habilita la interrupi=F3n del timer 0 MOVLW 0XA0 ; cargo w con 10100000 MOVWF INTCON ; habilitamos GIE y T0IE CLRF PORTB ; limpiamos PORTB
;------------- Tiempo -----------------
Tiempo MOVLW 0XD8 ; cargo w con 216 MOVWF TMR0 ; lo paso a TMR0 RETURN
;---------------- Led -----------------
Led BTFSS PORTB,0 ; si el led est=E1 apagado GOTO LedEnc ; envio a encender BCF PORTB,0 ; si no, lo apago GOTO LedFin
LedEnc BSF PORTB,0 ; enciendo el led GOTO LedFin
LedFin BCF INTCON,2 ; borro la bandera T0IF GOTO Tiempo ; cargo el temporizador RETFIE ; regreso habilitando la int
;-------------------------------------- END ;--------------------------------------