TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jhozate en 07 de Marzo de 2009, 19:24:40
-
Hola a todos, resulta q quiero saber bien el funcionamiento de las interrupciones en el 16F84, ya me informe sobre q es lo q debo configurar para trabajar con las interruciones, me encamine a hacer una rutina sencilla para hacer el siguiente programa
si RA0=1 se realiza una suma de dos valores previamente cargados, en este caso NUM1=5 NUM2=4, y se muestra el resultado por el portb durante 5 segundos, el programa se queda en un bucle esperando a q RA0 sea 1.
Por el lado de la interrupcion tengo configurado por cambio de estado de RB7:RB4, si se detecta la interrupcion se realiza NUM1-NUM2 y se debe mostrar por el puertoB el resultado, es decir "1" durante 5 segundos, y luego volver a preguntar por el estado de RA0.
el problema esta en q cuando se detecta la interrupcion se queda siempre mostrando el resultado de la resta y no regresa al preguntar el estado de RA0, yo creo q el problema lo genera la rutina de tiempo o tal vez estoy manejando mal la interrupcion, adjunto el codigo .
gracias por las aclaraciones q me puedan hacerLIST P=16F84A
#INCLUDE "P16F84A.INC"
CBLOCK 0CH
NUM1
NUM2
PDel0
PDel1
PDel2
ENDC
ORG 0
GOTO INICIO
;##################interrupcion#######################
ORG 4
RESTA MOVF NUM2,W
SUBWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB
BCF INTCON,RBIF
;BSF INTCON,GIE
retfie
;GOTO PREGUNTA
;##########################################################
;*****Principal***************************
INICIO BSF STATUS,5
BSF PORTA,0
MOVLW 0XF0
MOVWF PORTB
BCF STATUS,5
CLRF PORTB
CLRF PORTA
PRE MOVLW 88H
MOVWF INTCON
MOVLW 5H
MOVWF NUM1
MOVLW 4H
MOVWF NUM2
PREGUNTA BTFSS PORTA,0
GOTO PREGUNTA
GOTO SUMA
SUMA MOVF NUM2,W
ADDWF NUM1,W
MOVWF PORTB
CALL DEMORA
CLRF PORTB
GOTO PREGUNTA
;********************************************
DEMORA movlw .165 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Fin.
END
-
cual es la rutina de interrupción?
la rutina de demora, no tendría que estar encima del ORG 0 o quizá por debajo?
un saludo
-
Saludos
No veo el retfie por ningun lado, si no tienes esta instrucción como pretendes retornar a PCL + 1, es decir, salir de la interrupción y volver donde estaba tu programa ejecutandose.
Un saludo desde Pereira - Colombia
-
tambien utilize el retfie, tengo entendido q el retfie actualiza el bit GIE y retorna a lugar donde se estaba ejecutando el programa, pero almenos en simulacion tampoco sale de la interrupcion, pero en cambio si quito la rutina de tiempo el programa funciona pero me vota muchos errores en el proteus
¿es totalmente indispensable utilizar el retfie?
¿puedo yo actualizar las banderas y dirigir al programa a otra ubicacion luego de tratada la interrucion?
-
Saludos
La suma debe estar en el programa principal y la resta debe estar en la interrupcion pero si no sales de la interrupción como pretendes hacer la suma. además para salir del la interrupción obligatoriamente tienes que utilizar el retfie o si no tu programa se quedara en la interrupción. m i consejo es el siguiente haz la rutina de suma en el main del programa y la resta en el vector de interrupción. es decir cuando tu programa detecto interrupción inmediata mente va al vector de interrupcion ejecuta la rutina retorna y sigue preguntando por la suma. pero veo otro problema. es que en transcurso de la rutina de tiempo si hay interrupción ejecuta lo de la interrupción. entonces no hay suma.
Un saludo desde Pereira - Colombia
-
probe cambiando de posicion la rutina de tiempo y tampoco funciona, ahi acomode mejor el programa para q se vea donde esta la interrupcion, efectivamente la resta esta dentro de la interr y la suma en el programa principal
pero creo q el problema es la rutina de tiempo por que el programa funciona haciendo la suma y si cambio de estado muestra la resta pero se queda mostrandola
gracias
-
Despues de poner clrf PORTB, pon movf PORTB,W y despues pon a cero el RBIF
por cierto en que programa simulas?
Saludos
-
Cordial saludo sander, hice lo q me dijiste y si funciona, ahora mi pregunta es ¿por qué? si con la instruccion CLRF PORTB limpio el puerto e inmediatamente procedo a actualizar la bandera de la interrupcion y luego habilito el bit GIE
gracias
-
:D :D leyendo un post de CCS encontré la respuesta, resulta q mi ingles es muy basico por no decir nefasto, entonces para orientarme uso un ebook del 16F84 en español, y sospecho q en el datasheet del 16F84 se estipula q en la interrupcion por cambio de estado en RB4:RB7 se debe incluir la instruccion de "relleno" de lectura o escritura del puertob, en este caso mi programa funcionó con la instruccion movf portb,w
me parece raron q un libro q es dedicadoo exclusivamente al 16F84 no mencione esta rutina, ni siquiera la ponen en los ejemplos