Interrupciones en 16f84

Saludos!!!

Estoy haciendo un programilla en ensamblador para el PIC 16f84, y no soy capaz de que me detecte las interrupciones externas, Tengo conectado un pulsador en la patilla 6 (RBO/INT). Os paso el código de la función principal que es donde m tendria q detectar la interrupción para llamar a una subrutina.

GRACIAS.


LIST p=16f84
RADIX HEX
PUL EQU 0C

#include"p16f84a.inc"


ORG 0
goto inicio

ORG 6
inicio bsf INTCON,GIE ;Permite interrupciones,GIE=1.
bsf INTCON,RBIE ;Permite interrupciones de PORTB, RBIE=1.
bsf INTCON,INTE ;Permite interrupciones externas, INTE=1.
bcf STATUS,RP0 ;Cambio a banco 0, pone RP0 a 0
movlw b'00000000'
movwf PORTA
bsf STATUS,RP0 ;Cambio a banco 1, pone RP0 a 1
movlw b'11110001' ;Pone las 4 líneas de mayor peso y la de menor peso de PORTB como entrada.
movwf TRISB ;Mueve el contenido de W al TRISB.
movlw b'00000000' ;Pone las 4 líneas de menor peso de PORTA como salida.
movwf TRISA ;Mueve el contenido de W al TRISA.
bcf STATUS,RP0 ;Cambio a banco 0, pone RP0 a 0
bcf INTCON,INTF ;Borra el flag de interrupción externa.
s1 btfss INTCON,INTF ;Se salta la siguiente instrucción si INTF=1.
goto s1
nop
bcf INTCON,INTF ;Borra el flag de interrupción externa.
s2 btfss INTCON,RBIE ;Se salta la siguiente instrucción si RBIE=1.
goto s2
call pulsadores
goto s1
 
parece que estas configurando bien las interrupciones pero hay algo que no me queda claro, primero checas si se presenta una interrupción revisando el flag INTF, si el flag esta a 1 saltas, pero después revisas el bit RBIE, ahi tendrías que revisar el flag RBIF que no? puede ser que ahi este el error
 
Perdona pero no t sigo, podrias decirme a q líneas t estas refiriendo? m dices la cuarta empezando por el final???en lugar de preguntar por el bit RBIE tendria q acerlo por el bit RBIF?

gracias
 
Tengo q configurar el flanco de la interrupción?? es eso? o falta algo mas? en clase en otros programas hemos usado interrupciones y no hemos echo nada mas que lo que yo ago en este programa.
 
Si activas las interrupciones al momento de presentarse una el pic dejará de ejecutar el programa y saltará a la rutina de servicio de interrupción. Esa rutina no la tienes establecida en tu programa, en cambio, el archivo que puso mabauti si cuenta con la rutina, revisalo para que te des una idea de como debe ser la estructura de tu programa.

Otra cosa importante que se te ha pasado es que revisas cuando las banderas de interrupción se ponen en 1 y cuando eso sucede realizas un salto o llamas a una subrutina pero nunca vuelves a poner esas banderas a 0, eso lo debes hacer manualmente ya que el pic no lo hace solo. En tu programa después de que la bandera se puso en 1 siempre permanece asi y al momento de volver a checar esa bandera esta en 1 aunque la interrupción no se haya presentado de nuevo.

Si vas a estar revisando las banderas manualmente entonces te recomiendo que no actives la máscara de interrupción global (el bit GIE del registro INTCON dejalo en 0) ya que la interrupción en realidad no la estas usando, de ese modo al presentarse una interrupción el pic seguirá ejecutando el código del programa y las banderas las puedes seguir checando manualmente como hasta ahora, solo recuerda que después de detectar un 1 debes ponerlas en 0 manualmente.
 
mieres, no se si ya lograste resolver el problema que tenías, pero por si aún tienes problemas con las interrupciones aqui te dejo un enlace a mi blog en el que explico el manejo de interrupciones con un programa de ejemplo. El programa es para el 16f628a pero las interrupciones funcionan igual para el 16f84. Quizás quieras echarle un vistazo.
 
Atrás
Arriba