Hola a todos feliz año, retomando el tema de las interrupciones con el PIC12F675 en PBP, me he decidido a realizar un pequeño circuito de un dimmer digital con dos pulsadores, con los cuales se baja o se sube la intensidad de luz, el programa es bien sencillo no llega a los 300bytes.
Descripcion y Funcionamiento:
El circuito consta de 3 entradas:
GPIO-5 y GPIO-4, los cuales son los pulsadores para atenuar la luz.
GPIO-2, Detección del cruce por cero por INT. Externa.
GPIO-3, NC
La salida.
GPIO.1, para el control del Gate del Triac.
A traves de la activacion de la interrupcion exeterna del PIC-INT.GPIO.2, se logra detectar
los flancos de bajada o subida.
Para lograr eso con PBP, se realiza una configuracion en el REGISTRO INTCON del pic
el cual tiene los siguientes bit's de configuracion segun Hoja de Datos:
REGISTRO INTCON, conformado de 8 bits de configuración:
bit 7 GIE: Global Interrupt Enable bit 'bit de habilitación de todas las interrupciones
1 = Enables all unmasked interrupts
0 = Disables all interrupts
bit 6 PEIE: Peripheral Interrupt Enable bit 'bit de habilitación de interrupción perimetral
1 = Enables all unmasked peripheral interrupts
0 = Disables all peripheral interrupts
bit 5 T0IE: TMR0 Overflow Interrupt Enable bit 'bit de habilitación de interrupción por desborde del TMR0
1 = Enables the TMR0 interrupt
0 = Disables the TMR0 interrupt
bit 4 INTE: GP2/INT External Interrupt Enable bit 'bit de habilitación de interrupción externa por GPIO.2
1 = Enables the GP2/INT external interrupt
0 = Disables the GP2/INT external interrupt
bit 3 GPIE: Port Change Interrupt Enable bit(1)'bit de habilitación de interrupción externa por cambio de estado en el puerto completo GPIO.
1 = Enables the GPIO port change interrupt
0 = Disables the GPIO port change interrupt
bit 2 T0IF: TMR0 Overflow Interrupt Flag bit(2) 'bit de habilitación de bandera de interrupción por desborde del TMR0
1 = TMR0 register has overflowed (must be cleared in software)
0 = TMR0 register did not overflow
bit 1 INTF: GP2/INT External Interrupt Flag 'bit de habilitación de bandera interrupción externa por GPIO.2
1 = The GP2/INT external interrupt occurred (must be cleared in software)
0 = The GP2/INT external interrupt did not occur
bit 0 GPIF: Port Change Interrupt Flag 'bit bit de habilitación de bandera interrupción externa por cambio de estado en el puerto completo GPIO.
1 = When at least one of the GP5:GP0 pins changed state (must be cleared in software)
0 = None of the GP5:GP0 pins have changed state
ENABLE: habilitado
DISABLE: des-habilitado
Ya conociendo cada bit del registro, tome la decisión de realizar la siguiente configuración:
INTCON = %10010000 'Habilita la interrupción GPIO.2
Ya teniendo esta configuración cuando exista un cambio en el PIN GPIO.2 se generara una interrupción.
Ahora el problema esta en que tipo de cambio se va a detectar, por flanco de bajada o de subida, en este caso como es para la detección de cruce por cero para la activación del triac se necesitan detectar ambos flancos de lo contrario no se encendería de manera optima la lampara.
Para definir el tipo de detección o el modo, esta el registro OPTION, el cual también esta conformado por 8Bit.
bit 7 GPPU: GPIO Pull-up Enable bit ' bit de habilitación de las resistencias PULL-UP internas
1 = GPIO pull-ups are disabled
0 = GPIO pull-ups are enabled by individual PORT latch values
bit 6 INTEDG: Interrupt Edge Select bit ' bit de habilitación del tipo de flanco de interrupción externa por GPIO.2
1 = Interrupt on rising edge of GP2/INT pin 'Por flanco ascendente
0 = Interrupt on falling edge of GP2/INT pin 'Por flanco descendente
bit 5 T0CS: TMR0 Clock Source Select bit ' bit de habilitación de tipo de fuente clock para el TMR0
1 = Transition on GP2/T0CKI pin
0 = Internal instruction cycle clock (CLKOUT)
bit 4 T0SE: TMR0 Source Edge Select bit ' bit de habilitación del tipo incremento del clock si es GPIO.2 la fuente.
1 = Increment on high-to-low transition on GP2/T0CKI pin
0 = Increment on low-to-high transition on GP2/T0CKI pin
bit 3 PSA: Prescaler Assignment bit' bit de habilitación y pre-establecimiento del presscaler
1 = Prescaler is assigned to the WDT
0 = Prescaler is assigned to the TIMER0 module
bit 2-0 PS2
S0: Prescaler Rate Select bits
El bit que nos permite elegir por que tipo de flanco va activarse la interrupcion externa del GPIO.2 es el bit 6 el cual establece dos modos por flanco(1) ascendente y por flanco(2) descendente.
Como necesitamos ambos pero solo permite uno, se debe jugar con la configuración de estos bit turnandolos en cada flanco de tal manera que se logre detectar ambos.
Se puede hacer con sentencias IF...THEN
con ! ó con ^...
He realizado pruebas con todas y funcionan y quedarian asi:
OPTION_REG.6 = OPTION_REG.6 ^%1
OPTION_REG.6 = !OPTION_REG.6
en el caso de if...then
se pregunta si se encuentra en 1 ó 0 y se cambia de estado.
Teniendo esto claro con un ciclo de interrupción se puede lograr controlar el triac.
Aquí un ejemplo de incremento de una variable para la atenuación de un bombillo.
@ device pic12f675,intrc_osc,wdt_on,pwrt_off,mclr_oFF,bod_off,protect_off
Define OSC 4
DEFINE OSCCAL_1K 1
CMCON = 7
ANSEL = 0
TRISIO = %00111101
GPIO = %00000000
OPTION_REG = %01000000
WPU = %00110000
SUBE VAR GPIO.5
BAJA VAR GPIO.4
TRIAC VAR GPIO.1
A VAR WORD
TRIAC = 0
a = 0 'PUNTO DE ACTIVACION MINIMO 0ms MAXIMO 8.3ms EN TEORIA
PAUSE 500
ON INTERRUPT GOTO CRUCE_POR_CERO 'Define el vector de interrupción
INTCON = %10010000 'Habilita la interrupción GPIO.2
INICIO:
A = A + 1
IF A >= 3800 THEN
A = 0
ENDIF
GOTO INICIO
DISABLE
CRUCE_POR_CERO:
PAUSEUS A
IF A => 1 THEN
TRIAC = 1
PAUSEUS 100
TRIAC = 0
ENDIF
INTCON.1=0
OPTION_REG.6 = OPTION_REG.6 ^%1
RESUME
ENABLE
END
Bueno hasta aquí he logrado llegar cualquier cosa que este mal me avisan para corregirla aun sigo aprendiendo de los triac, PIC y del PBP...saludosss
PD: Luego subo la simulacion.