Muy buenas compañeros en esta oportunidad vengo con una duda con respecto a interrupciones en PBP. El caso es que estoy tratando de detectar flancos de bajada y subida por un pin del pic esto lo hago a través de la interrupción externa y al momento de detectar el flanco ya sea de bajada o subida la idea es deshabilitar la interrupción externa y habilitar la interrupción por desbordamiento del TMR0 y luego esperar hasta que se desborde el TMR0 y en ese momento hacerlo inverso activar la interrupción externa de nuevo y desactivar la del TMR0.
Ya he avanzado bastante con respecto a esto pero aun no logro que funcione al 100%.
Comento como hago cada cosa.
El pic es el 12F675
Para la detección de los flancos lo hago intercambiando el bit 6 del registro option de la siguiente manera:
Eso hace que si la interrupción fue por flanco de bajada el bit 6 estaba en 0 y por lo tanto lo cambio a 1 para que detecte cuando vuelva a cambia.
INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of GP2/INT pin
0 = Interrupt on falling edge of GP2/INT pin
Hasta aqui todo funciona al 100%
Ahora los pulsos son constantes tardan aproximadamente 8.3ms eso tomándolo de la red de 60Hz. Y la idea de esta parte era hacer un detector de cruce por cero.
Luego sabiendo esto lo que quiero es a partir del punto de detección implementar el TMR0 para activar el triac. Y porque el TMR0 y no un simple pause. Bueno de tanto investigar y leer resulta que mientras que el TMR0 me permite continuar con el programa principal el pause no me lo permite y me genera conflictos.
Entonces para lograr esto genere una variable para incrementar o decrementar el TMR0.
Active el TMR0 luego de la interrupción externa y deshabilite la interrupción externa.
Espero hasta que se desborde el TMR0 y luego activo el triac por un instante y lo desactivo.
Y luego desactivo la interrupción por TMR0 y vuelvo activar la interrupción externa.
Ahora funciona? Si si funciona, lo probé en físico.
Me permite hacer el programa principal? No no me lo ejecuta correctamente.
El loop de interrupción es este:
Aun no se como hacer lo de darle prioridades a las interrupciones me gustaría saber si es eso lo otro que se puede hacer y como lo haría.
Si tengo algún error en el código avísenme se los agradezco muchas gracias de antemano
Ya he avanzado bastante con respecto a esto pero aun no logro que funcione al 100%.
Comento como hago cada cosa.
El pic es el 12F675
Para la detección de los flancos lo hago intercambiando el bit 6 del registro option de la siguiente manera:
Código:
OPTION_REG.6 = OPTION_REG.6 ^%1
Eso hace que si la interrupción fue por flanco de bajada el bit 6 estaba en 0 y por lo tanto lo cambio a 1 para que detecte cuando vuelva a cambia.
INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of GP2/INT pin
0 = Interrupt on falling edge of GP2/INT pin
Hasta aqui todo funciona al 100%
Ahora los pulsos son constantes tardan aproximadamente 8.3ms eso tomándolo de la red de 60Hz. Y la idea de esta parte era hacer un detector de cruce por cero.
Luego sabiendo esto lo que quiero es a partir del punto de detección implementar el TMR0 para activar el triac. Y porque el TMR0 y no un simple pause. Bueno de tanto investigar y leer resulta que mientras que el TMR0 me permite continuar con el programa principal el pause no me lo permite y me genera conflictos.
Entonces para lograr esto genere una variable para incrementar o decrementar el TMR0.
Active el TMR0 luego de la interrupción externa y deshabilite la interrupción externa.
Espero hasta que se desborde el TMR0 y luego activo el triac por un instante y lo desactivo.
Y luego desactivo la interrupción por TMR0 y vuelvo activar la interrupción externa.
Ahora funciona? Si si funciona, lo probé en físico.
Me permite hacer el programa principal? No no me lo ejecuta correctamente.
El loop de interrupción es este:
Código:
DISABLE
CRUCE_POR_CERO:
TMR0 = A 'variable que contiene el valor para el desboramiento del TMR0 de 0 a 255
IF INTCON.2 = 1 AND INTCON.1 = 0 THEN 'bandera de interrupción del TMR0 y la bandera de
INTCON.2 = 0 'de la interrupción externa
TRIAC = 1
'PAUSEUS 100
TRIAC = 0
INTCON = %10010000 'deshabilito la interrupción por TMR0
ELSE 'en caso de que no se haya desbordado el TMR0
OPTION_REG.6 = OPTION_REG.6 ^%1 'intercambio el estado del bit de interrupción externa
INTCON = %10100000 'habilito la interrupción por TMR0 y deshabilito la externa.
ENDIF
RESUME
ENABLE
Aun no se como hacer lo de darle prioridades a las interrupciones me gustaría saber si es eso lo otro que se puede hacer y como lo haría.
Si tengo algún error en el código avísenme se los agradezco muchas gracias de antemano