TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: dagoh73 en 11 de Enero de 2010, 10:03:03
-
Hola. Tengo un problema con la interrupcion por rbo en flanco de bajada. ES un timer para tres tiempos 30s 45s y 60s que se configura con un Jumper .El programa funciona bien si saco las tres lineas que estan con comillas, sino funciona bien un par de veces y se cuelga. Creo que no meti la pata en nada. Si alguien me puede esplicar el problema se lo agradeceria, por que esta escapando de todas mis concluciones. Gracias.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
#include<p16f84a.inc>
#DEFINE SALIDA PORTA,.2
#DEFINE PULSADOR PORTB,.0 ; Línea donde se conecta el pulsador.
ORG .0
GOTO INICIO
ORG .4
GOTO SERVICIOINTERRUPCION
INICIO BSF STATUS,RP0
movlw b'11011'
movwf TRISA
bsf PULSADOR
movwf TRISB
bcf OPTION_REG,NOT_RBPU ; Se activan las resistencias de Pull-Up del Puerto B.
bcf OPTION_REG,INTEDG ; Interrupción INT activa por flanco de bajada.
bcf STATUS,RP0 ; Acceso banco 0.
movlw b'10010000' ; Habilita las interrupciones INT, RBI y la
movwf INTCON ; general GIE.
BCF SALIDA
PRINCIPAL SLEEP
GOTO PRINCIPAL
SERVICIOINTERRUPCION
;CALL Retardo_20ms ;retardo mayor no anda
;BTFSC PULSADOR
;GOTO PRINCIPAL
BTFSC PORTA,.1
GOTO SEG30
BTFSC PORTA,.3
GOTO SEG45
GOTO SEG60
SEG30 BSF SALIDA
CALL Retardo_20s
CALL Retardo_10s
GOTO FININTERRUPCION
SEG45 BSF SALIDA
CALL Retardo_20s
CALL Retardo_20s
CALL Retardo_5s
GOTO FININTERRUPCION
SEG60 BSF SALIDA
CALL Retardo_20s
CALL Retardo_20s
CALL Retardo_20s
GOTO FININTERRUPCION
FININTERRUPCION
BCF SALIDA ;desactiva rele
bcf INTCON,INTF ; interrupción.
retfie
#INCLUDE<RETARDOS.INC>
end
-
Disculpen no son con comilla son con punto y coma las tres despues del serviciointerrupcion.
-
No puedes usar goto Principal dentro de la interrupción, sino retfie, para que se retorne el valor de PC (Contador de programa) y se vuelva a setear el bit GIE. Si retorna de esa manera al ocurrir algunas interrupciones hay overflow de stack.
Saludos!
-
disculpa a ver si te entendi, despues del Sleep no poner Goto principal, sino retfie solamente.
Entonces quedaria
principal sleep
retfie
O sea que se produce la interrupcion, la procesa retorna de la interrupcion con retfie al paso siguiente de sleep y el retfie que sigue va a buscar la ultima direccion guardada en la pila y lo manda a sleep de nuevo y lo deja durmiendo. Esta bien interpretada la solucion para futuros proyectos por que lo probe y anda de maravillas. Muchas gracias.
-
Nooo! Me refería a las lineas donde colocaste ; donde estas tratando la interrupción.
Saludos!
-
ahora si te entendi. La duda ahora es por que funciona bien el anterior (casualidad) es por lo que mencine anteriormente o nada que ver. Con la nueva modificacion tambien anda de maravillas. mil gracias.
-
mmm... En los micros no creo que haya casualidades, si vos guías mediante la programación al micro :tongue: Al comentar esa linea estas evitando volver erróneamente al programa principal. Estas lineas se ejecutan cuando al pulsar/soltar la tecla se produce el efecto rebote, que te genera una interrupción no deseada.
Respecto al otro, hace una maraña de cosas, mas o menos como explicaste. Termina ejecutando el retfie de forma errónea, pero por lo menos reestablece el PC. :D
Saludos!
-
Desde ya MIL GRACIAS. Problema solucionado.