Hola amigos, lo que pasa es que tengo un programa el cual funciona como yo esperaría, sólo que al momento de atender las interrupciones (rb7:rb4), entra en dicha interrupción y la ejecuta y todo, sólo que al final ya no sale de la interrupción, o a lo mejor sí sale, pero ya no sigue ejecutando el programa donde se había quedado anteriormente.
Guardo mis variables W y STATUS y PCLATH (las vuelvo a recuperar al final). En dicha interrupción utilizo call`s, goto`s, utilizo el tmr0 pero desactivé su interrupción por desbordamiento. Les pongo el código.
Uso el mplab 7.50 y grabo mi programa con el winpic800, mi grabador es un ponyprog II o algo así, compatible con jdm. Mi pic es un 16f877a.
He estado pensando que a lo mejor pudieran estar mal mis fuses, no lo se bien, uitilzo un cristal de 8MHZ.
Mi programa es el siguiente:
LIST p=16f877A
INCLUDE<p16f877A.inc>
__config b'11111101110010'
dato equ 0x79
abc equ 0x7A
conts equ 0x75 ;//contador ascendente para las series
conts2 equ 0x76 ;//contador descendente para las series
veces equ 0x77 ;//para el timer0
veloci equ 0x78 ;//velocidad del timer0
pclath_temp EQU 0x7C
w_temp EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context saving
ORG 0
goto uno
ORG 4
movf PORTB,W
movwf abc
bcf INTCON,RBIF
MOVWF w_temp ;Copy W to TEMP register
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF status_temp ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using page 1
MOVWF pclath_temp ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
goto teclas
;************************************************************
teclas:
call time3
call time3
col4: btfsc PORTB,4
goto col4
col5: btfsc PORTB,5
goto col5
col6: btfsc PORTB,6
goto col6
col7: btfsc PORTB,7
goto col7
movlw 0x55
movwf PORTC
call time2
call time2
call time2
call time2
clrf conts
c1: incf conts,F
movf conts,W
call auto2
movwf PORTC
call time2
btfsc conts,3
goto c1
btfsc conts,2
goto c1
btfsc conts,1
goto c1
btfsc conts,0
goto c1
c2: movf conts2,W
call auto2
movwf PORTC
call time2
decfsz conts2,F
goto c2
MOVF pclath_temp, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF status_temp, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF w_temp, F ;Swap W_TEMP
SWAPF w_temp, W ;Swap W_TEMP into W
bcf INTCON,INTF
retfie ; return from interrupt
auto1: ;//auto increible1
ADDWF PCL,F
RETLW 0X00
RETLW 0X01 ;//1
RETLW 0X02
RETLW 0X04
RETLW 0X08
RETLW 0X10
RETLW 0X20
RETLW 0X40
goto aa00
goto aa01 ;//para puerto D
movlw 02
movwf PORTD
decf conts,W
movwf conts2
clrf conts
retlw 00
aa01:
movlw 01
movwf PORTD
retlw 00
aa00
movlw 00
movwf PORTD
RETLW 0X80
auto2: ;//auto increible 2
ADDWF PCL,F
RETLW 0X00
RETLW 0x01
RETLW 0X03
RETLW 0X06
RETLW 0X0C
RETLW 0X18
RETLW 0X30
RETLW 0X60
goto bb00
goto bb01 ;//al mismo tiempo con puerto D
goto bb03
goto bb04
movlw 02
movwf PORTD
decf conts,W
movwf conts2
clrf conts
retlw 00
bb04: ;//aqui solo puerto D
movlw 01
movwf PORTD
retlw 00
bb01:
movlw 01
movwf PORTD
retlw 80
bb03:
movlw 03
movwf PORTD
retlw 00
bb00:
clrf PORTD
RETLW 0XC0
uno: bsf STATUS,5
movlw b'11110000'
movwf TRISB ;// bits como entrada rb4-rb7
clrf TRISC ;// todo el puerto C como salida
clrf TRISD ;// todo el puerto d como salida
movlw 0x87
movwf OPTION_REG ;// para timer0
movlw b'10001000'
movwf INTCON ;// para interrupcion de puerto b
clrf STATUS
movlw 0x88
movwf INTCON ;// para interrupcion de puerto b
clrf PORTC ;// limpiamos C y d
clrf PORTD
movlw 0x00
movwf dato
movlw d'21'
movwf veloci
;***********************************************************
inicio:
movlw 0x0F ;// mandamos unos x rb0-rb3
movwf PORTB
movf dato,W
addwf PCL,F
goto serie01
goto serie02
serie01: ;//auto increible 1
movlw 0x00
movwf conts
lup1: incf conts,F
movf conts,W
call auto1
movwf PORTC
call time3
btfsc conts,3
goto lup1
btfsc conts,2
goto lup1
btfsc conts,1
goto lup1
btfsc conts,0
goto lup1
lup2: movf conts2,W
call auto1
movwf PORTC
call time3
decfsz conts2,F
goto lup2
goto inicio
serie02:
movlw 0xff
movwf PORTC ;// li
clrf PORTD
goto inicio
;************************************************************
time2:
movlw d'09'
movwf veces
pris: movf veloci,W
movwf TMR0
ess: btfss INTCON,2
goto ess
bcf INTCON,2
decfsz veces,F
goto pris
return
time3:
movlw d'01'
movwf veces
sir: movf veloci,W
movwf TMR0
sse: btfss INTCON,2
goto sse
bcf INTCON,2
decfsz veces,F
goto sir
return
END
Los fuses que me da el winpic800 son:
OSC: HS
WRT: OFF
WDTEN: OFF
PWRTEN: ON
BOREN: ON
LVP: OFF
CPD: OFF
CP: OFF
DEBUG: OFF
O SEA: 0X2007:3F72
El ide que me da es:
FFFF
Antes grababa con el ic-prog pero como me quemo varios pic´s, tome la recomendación de algun otro post de aquí para cambiarlo por el winpic800. Y éste último funciona super bien...