'****************************************************************
'* Name : Dimmer_16F84A.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 10/08/2014 *
'* Version : 2.0 *
'* Notes : Mod by RicBevi *
'* : *
'****************************************************************
Device 16F84A
Xtal=4
EData 30
On_Hardware_Interrupt GoTo Interrupcion ' Cuando ocurre la interrupcion salta a Interrupcion
Symbol T0IE = INTCON.5 ' Habilitacion TMR0
Symbol T0IF = INTCON.2 ' Flag TMR0
Symbol GIE = INTCON.7 ' Interrupciones globales habilitadas
Symbol INTF = INTCON.1 ' Flag rb0
Symbol INTE = INTCON.4 ' Habilitar interrupcion b0
Symbol T0CS = OPTION_REG.5 ' Timer0 reloj interno o externo
Symbol INTEDG = OPTION_REG.6 ' Flanco ascendente rb0
Input PORTA ' Puerto A como entrada de pulsadores en A.0 y A.1
Output PORTB ' Puerto B como salida
Input PORTB.0 ' Puerto B.0 como entrada
Symbol Triac = PORTB.1 ' Salida triac en B.1
Declare LCD_DTPin PORTB.4 ' Puerto B salida datos B4 B5 B6 B7
Declare LCD_RSPin PORTB.2 ' Puerto B1 pin rs del lcd
Declare LCD_ENPin PORTB.3 ' Puerto B2 pin Enable del LCD
Declare LCD_Interface = 4 ' Configuracion LCD
Declare LCD_Lines 2 ' Configuracion LCD
Declare LCD_Type 0 ' Configuracion LCD
Dim Porcentaje As Byte
Dim contador As Byte
Dim PorcentajeV As Byte ' Valor antiguo de la variable para comparacion
GoTo Inicio: ' Ir a inicio
Context Save
Interrupcion:
' Context Save ' Interrupcion
If INTF = 1 Then ' Si se produjo la interrupcion de portb0
Low Triac ' Apago el triac
INTE = 0 ' Desabilito interrrupcion rb0
INTF = 0 ' Borro el flag de rb0
contador = 100 - Porcentaje ' Contador es una variable que se usa para
'generar el retardo desde el punto cero hasta
'el disparo es igual a porcentaje + 10 \'
'ya que 10 es 1ms demora del transistor antes de cero
TMR0 = 165 ' El timer deberia ser de 100 pulsos cada vez osea
'255- 100 + algunas instrucciones que ya pasaron
T0CS = 0 ' El timer cuenta con el reloj interno comienza a contar
T0IE = 1 ' Abilito la interrupcion del timer
ElseIf T0IF = 1 Then ' Si se desbordo el timer
T0IF = 0 ' Borro el flag del timer
TMR0 = TMR0 + 150 ' Cargo Timer con el valor actual mas 150 que serian 100 instrucciones de resto
Dec contador ' Decremento contador
If contador = 0 Then ' Si contador = 0
T0IE = 0 ' Desabilito la interrupcion del timer
INTE = 1 ' Habilito la interrupcion RB0
High Triac ' Prendo el triac
EndIf
EndIf
Context Restore ' Restaurar variables y volver al lugar donde se detuvo
Inicio:
Porcentaje = ERead 0 ' Leo posicion 0 de eeprom
GIE = 1 ' Habilito interrupcion general
INTE = 1 ' Habilito interrupcion RB0
programa:
Print At 1,1, "Porcentaje "
program1:
If Porcentaje <> PorcentajeV Then
Print At 1,14, Dec2 Porcentaje
PorcentajeV = Porcentaje
EndIf
DelayMS 100
If PORTA.1 = 1 And Porcentaje < 99 Then
Inc Porcentaje
EWrite 0, [Porcentaje ]
ElseIf PORTA.0 = 1 And Porcentaje > 1 Then
Dec Porcentaje
EWrite 0, [Porcentaje ]
End If
GoTo program1
End