TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Correia en 23 de Agosto de 2011, 14:45:26
-
buenas tardes manes, estoy practicando la programacion de las interrupciones RB4-RB7 con el 16f628a, la idea es que el porta esta como salida, a cuatro leds, y los rb4-rb7 como entradas, cuando presione rb4, se generara una interrupcion y encendera RA0 donde se encuentra un led, cuando presione RB5 se generara una interrupcion y se prendera RA1, pero se apaga RA0 y asi hasta presionar RB7, mi problema es que cuando lo simulo en proteus, al presionar cualquier pulsador sea RB4,RB5,RB6,RB7 no sucede nada, hasta que doy una segunda pulsada que se prende, eso sucede con cualquier pulsador que comienze pulsando, despues de eso pulso los otros y reaccionan y cumplen su funcion, aqui dejo la programacion si alguien me puede dar una ayuda.
list p=16f628A
#include <p16F628A.inc>
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
;usando interrupciones de RB4-RB7
;--VARIABLES PARA RESPALDO DE REGISTROS--
w_temp EQU 0x71
status_temp EQU 0x72
cont equ 0x0C
;--configuracion de puertos y registros--
reset org 0x00
goto main
org 0x04 ;localizacion donde se tratara la rutina de interrupcion
goto serv_int
main movlw 0x07
movwf CMCON
bsf STATUS,RP0
movlw b'00110000'
movwf TRISA ;los 4 nibbles bajo de trisa como salida.
movlw b'11110000'
movwf TRISB
movlw b'10000011'
movwf OPTION_REG
bsf INTCON,GIE
bsf INTCON,RBIE
bcf STATUS,RP0
clrf PORTA
clrf PORTB
bucle
nop
goto bucle
serv_int
btfss INTCON,RBIF
retfie
movwf w_temp
swapf STATUS,W
movwf status_temp
call retardo
check btfss PORTB,4
goto activar1
btfss PORTB,5
goto activar2
btfss PORTB,6
goto activar3
btfss PORTB,7
goto activar4
goto check
activar1
movlw 0x01
movwf PORTA
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
bcf INTCON,RBIF
retfie
activar2
movlw 0x02
movwf PORTA
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
bcf INTCON,RBIF
retfie
activar3
movlw 0x04
movwf PORTA
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
bcf INTCON,RBIF
retfie
activar4
movlw 0x08
movwf PORTA
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
bcf INTCON,RBIF
retfie
;***retardo de 20 milisegundos***
retardo clrf cont
movlw d'5'
movwf cont
lel clrf TMR0
lol btfss INTCON,T0IF
goto lol
bcf INTCON,T0IF
decfsz cont,F
goto lel
return
end
-
Utiliza el buscador ya se a tratado el tema. Prueba con colocar las resistencias pull-up o pull-down externamente.
Saludos!
-
No se si sera este el problema pero esto.
cont equ 0x0C ; OCh es PIR1
Y estas por que aqui?
w_temp EQU 0x71
status_temp EQU 0x72
Mejor asi:
CBLOCK 0X20
w_temp
status_temp
cont
ENDC
-
Hola a Todos ,viendo tu codigo veo como te apunta tapi8 tenes declarada una variable cont en una posicion reservada :shock:
tendrias que ubicarla a partir de la posicion 0x20 para no tener ese problema ,los otros registros creo que los ubicas
en esas posiciones porque son de acceso desde cualquier banco y eso facilita el uso para guardar los registros.
Sobre lo que te sucede con la interrrupcion puede ser causa que al inicio del progrma no borras la bandera RBIF antes de habilitar la interrupcion :shock: tendrias que agregar BCF INTCON,RBIF y luego si habilitar la interrupcion por puertob BSF INTCON,RBIE y la general BSF INTCON,GIE ,espero te ayude.
Saludos!