Hola Sispic...
Utilizo la version 2.43 de PBP
El programa, me funciona de los dos modos....
Pero tengo un problema...
Se me cuelga...
te dejo el programa completo, a ver si ves algo que pueda estar mal...
DEFINE OSC 4
Define INTHAND _myint
symbol Led_RF = porta.3
wsave var byte bank0 system
ssave var byte bank0 system
psave var byte bank0 system
ticks var byte bank0 system
Convert var byte bank0 system
segundos var byte bank0 system
minutos var byte bank0 system
Flag_RF var bit bank0 system
Flag_RB47 var byte bank0 system
flvar1 var byte
flvar2 var byte
flvar3 var byte
cont var byte
SerialCNF con 188 " configuración del puerto serie con max232 4800 8N1 sin control de flujo
goto inicio
myint:
asm
intt
bcf INTCON,GIE ;Asegura la
btfsc INTCON,GIE ;deshabilitacion
goto Intt ;global de las interrupciones
;
movwf wsave ;Salva W
swapf STATUS,W ;Invierte STATUS --> W
movwf ssave ;Salva STATUS
;
btfsc INTCON,INTF ;? Hubo interrupcion en RB0 ?
goto In ;Si
btfsc INTCON,T0IF ;? Hubo sobrefujo en TMR0 ?
goto T0 ;Si
btfss INTCON,RBIF ;? Hubo algun cambio de RB4-RB7 ?
goto RestaurarRegistros ;No
;
Rb47 bcf INTCON,RBIE
bsf Flag_RB47
goto RestaurarRegistros
;
T0 bcf INTCON,T0IF
decfsz ticks,f
goto RestaurarRegistros
movlw 122 ; Paso un segundo - actualiza tiempo
movwf ticks
movlw 6
movwf tmr0
clrf Convert ; Convert = 0
incf segundos,f
movf segundos,w
sublw 60
btfss STATUS,Z ; 60 segundos ?
goto RestaurarRegistros ; no
clrf segundos ; si
incf minutos,f
endasm
if flvar1 > 0 then flvar1 = flvar1 - 1
if flvar2 > 0 then flvar2 = flvar2 - 1
if flvar3 > 0 then flvar3 = flvar3 - 1
asm
;
goto RestaurarRegistros
;
In bcf INTCON,INTF
btfss Flag_RF
goto in1
bcf Flag_RF
goto RestaurarRegistros
in1 bsf Flag_RF
goto RestaurarRegistros
;
RestaurarRegistros
; Retorna habilitando todas las interrupciones
bcf INTCON , T0IF ; Resetea bandera de interrupcion por Timer0
bsf INTCON , GIE ; Activa interrupciones generales
movf psave,w ; Restore PCLATH, STATUS and W registers
movwf PCLATH
swapf ssave,W ;Invierte STATUS --> W
movwf STATUS ;Restaura STATUS
swapf wsave,F ;Invierte --> F
swapf wsave,W ;Restaura W
retfie
EndAsm
ActivaInterr:
ticks=122 " OSC 4 Mhz. ok ???
segundos=0
minutos=0
TMR0=6
OPTION_REG=%00000100 " prescaler 1:32
INTCON = %11110000 " Enable interrupt on general,PORTB.0, timer0
" -----------------------
Return
inicio: "***********************************************
flvar1 = 10
flvar2 = 2
flvar3 = 20
Flag_rf = 0
call activainterr
inr:
while flag_rf > 0
high led_Rf
serout2 portb.7,188,[dec(segundos), " - " , dec(minutos) , " - " , dec(flvar1), " - " ,dec(flvar2), " - " , dec(flvar3), 13,10]
wend
low led_rf
goto inr
estoy testeando las interrupciones, para conocerlas mas a fondo... Pero me estoy dando una cantidad de golpes con ellas... que creo que van a acabar conmigo.,....
con este programa, lo que hago es leer la interrupción por rb0, y entrar en un bucle, que saca datos por puerto serie
en estos datos, leo los minutos, y los segundos testeados por la interrupción por timer0, y los datos de las variables flvarX, que van decrementando prograsivamente....
Supongo que esta explicación no seria necesaria... PEro la pongo por si acaso...
Bueno, pues me da un problema.. Y no se cual es....
Doy un pulso al portb.0, se me activa el flag_rf = 1...
y entro en el bucle que saca datos por puerto serie...
Hasta hay todo bien...
Los datos salen por el puerto serie a la perfección... Pero deberian salir... Constantemente hasta que entrase otro pulso por el portb.0... y se pusiese la varable Flag_rf = 0... Pero cual es mi sorpresa....????
el bucle while, se termina por si solo.... Sin yo actuar sobre el portb.0
??????
A ver si veis algo.. que se me escape a mi....
Gracias.