Hola buenas a tod@s
Soy aficionado a la electrónica y he dado con vuestro foro en varias ocasiones al hacer búsquedas en google. Me he decidido a escribir por que siempre me surge un problema a la hora de hacer algún “inventillo” utilizando pics.
El problema es que cuando utilizo interrupciones, estas son Hipersensibles, es decir con solo tocar la patilla de entrada con el dedo o la punta del tester el PIC detecta entrada y salta a la interrupción.
En mi ultimo diseño he utilizado un PIC 12f675 configurando gp1 como entrada (interrupción por cambio de estado de la patilla-GPIE) y gp2 también como interrupción (INTE). Mi idea es que cuando se detecta un nivel alto en GPI active la salida GP4 durante un determinado tiempo, y cuando se detecte un nivel alto en GP2 se active la salida GP5 el mismo intervalo de tiempo, así mismo si alguna salida está activa y se detecta nivel alto en la otra entrada se activaría la salida correspondiente.
Como digo he probado de todas maneras posibles, colocando resistencias de pull-up externas a masa y a VCC, resistencias de 200ohm, 1k, 10k. También he probado activando las resistencias de pull-up internas del PIC y nada. Tengo colocado un condensador de 100nf entre vcc y gnd. Ahora mismo lo tengo montado en una protoboard pero en circuito integrado pasa lo mismo.
A ver si tenéis idea donde estoy metiendo la pata. Esto también me ha pasado con pics 16f84 por lo que deduzco que es algún detalle que se me escapa a la hora de manejar pics.
Un saludo.
El codigo es el siguiente:
Soy aficionado a la electrónica y he dado con vuestro foro en varias ocasiones al hacer búsquedas en google. Me he decidido a escribir por que siempre me surge un problema a la hora de hacer algún “inventillo” utilizando pics.
El problema es que cuando utilizo interrupciones, estas son Hipersensibles, es decir con solo tocar la patilla de entrada con el dedo o la punta del tester el PIC detecta entrada y salta a la interrupción.
En mi ultimo diseño he utilizado un PIC 12f675 configurando gp1 como entrada (interrupción por cambio de estado de la patilla-GPIE) y gp2 también como interrupción (INTE). Mi idea es que cuando se detecta un nivel alto en GPI active la salida GP4 durante un determinado tiempo, y cuando se detecte un nivel alto en GP2 se active la salida GP5 el mismo intervalo de tiempo, así mismo si alguna salida está activa y se detecta nivel alto en la otra entrada se activaría la salida correspondiente.
Como digo he probado de todas maneras posibles, colocando resistencias de pull-up externas a masa y a VCC, resistencias de 200ohm, 1k, 10k. También he probado activando las resistencias de pull-up internas del PIC y nada. Tengo colocado un condensador de 100nf entre vcc y gnd. Ahora mismo lo tengo montado en una protoboard pero en circuito integrado pasa lo mismo.
A ver si tenéis idea donde estoy metiendo la pata. Esto también me ha pasado con pics 16f84 por lo que deduzco que es algún detalle que se me escapa a la hora de manejar pics.
Un saludo.
El codigo es el siguiente:
Código:
LIST P=16F675 ;utilizamos el pic 16f84
include "P12F675.inc" ;se incluye la definicion de los registros internos de una libreria
TEMPO EQU 0X21 ;valor de temporizador
ORG 0 ;inicio en el vector de reset
GOTO INICIO ;va a la primera instruccion del programa
ORG 4
GOTO INTERRUPCION
ORG 5 ;salva vector de interrupcion
;comienzo del programa principal
INICIO
BSF STATUS,RP0 ;entra en el banco0
MOVLW B'01000111'
MOVWF OPTION_REG ;CONFIGURO TMR0 CON PREESCALADO 256, resistencias de pull-up puerta activadas, flanco ascendente para GP2
MOVLW B'00000110'
MOVWF TRISIO ;GP1 Y GP2 ENTRADA, DEMAS SALIDA
MOVLW B'00000110'
MOVWF WPU ;ACTIVO RESISTENCIAS PULL-UP PARA LAS ENTRADAS (GP1 Y GP2)
MOVLW B'00000010'
MOVWF IOC ;CONFIGURO GP1 COMO INTERRUPCION
CLRF ANSEL ;DESACTIVO CONVERSOR AD PARA USAR ENTRADAS
BCF STATUS,RP0 ;VUELVE AL BANCO 0
MOVLW 0X7
MOVWF CMCON ;DESACTIVO EL COMPARADOR PARA USAR ENTRADAS
CLRF GPIO ; pongo a 0 todas las salidas del puerto b
CONFIGURACION
MOVLW B'10011000' ; INTERRUPCION POR CAMBIO EN GP1 Y GP2
MOVWF INTCON
SUEÑO
GOTO SUEÑO
;RUTINA DE TEMPORIZACION
TEMPORIZACION
BCF INTCON,T0IF
MOVLW 0X3D
MOVWF TMR0
RUTINA1
BTFSS INTCON,T0IF
GOTO RUTINA1
DECFSZ TEMPO
GOTO TEMPORIZACION
RETURN
INTERRUPCION
CLRF GPIO ;paro los relés
BTFSS INTCON,1 ;MIRA SI intf=1 (INTERMITENTE izquierdo)
goto DERECHO ;INTERMITENTE DERECHO
goto IZQUIERDO ;INTERMITENTE IZQUIERDO
IZQUIERDO
BSF GPIO,5 ;ACTIVA RELE
MOVLW B'10001000' ;ACTIVO LAS INTERRUPCIONES POR SI HAY QUE GIRAR A DERECHA (INTE DESACTIVADO)
MOVWF INTCON ;TEMPORIZACIÓN DE 2.65 SEGUNDOS APROX, PARA 4 PARPADEOS
MOVLW 0X45
MOVWF TEMPO
CALL TEMPORIZACION
BCF GPIO,5 ;PARO RELÉ
ESPERO
BTFSC GPIO,2 ;ESPERO HASTA QUE EL INTEMITENTE ESTÉ APAGADO
GOTO ESPERO
MOVLW 0XA ;ESPERO 0.5 SEGUNDOS PARA VER SI REALMENTE EL INTERMITENTE ESTÁ APAGADO.
MOVWF TEMPO
CALL TEMPORIZACION
BTFSC GPIO,2
GOTO ESPERO
GOTO CONFIGURACION
DERECHO
BSF GPIO,4 ;ACTIVA RELE
MOVLW B'10010000' ;ACTIVO LAS LAS INTERRUPCIONES POR SI HAY QUE GIRAR A IZQ (RBIE DESACTIVADO)
MOVWF INTCON
MOVLW 0X45
MOVWF TEMPO
CALL TEMPORIZACION ;TEMPORIZACION DE UNOS 3.5 SEGUNDOS (4 PARPADEOS)
BCF GPIO,4 ;PARO RELÉ
ESPERO2
BTFSC GPIO,1 ;ESPERO HASTA QUE EL INTERMITENTE DERECHO SE APAGUE
GOTO ESPERO2
MOVLW 0XA
MOVWF TEMPO ;PEQUEÑA TEMPORIZACIÓN PARA EVITAR QUE SE ACTIVE EL RELÉ AL DESCONECTAR INTEMITENTE
CALL TEMPORIZACION
BTFSC GPIO,1
GOTO ESPERO2
GOTO CONFIGURACION
END
Última edición por un moderador: