Você está na página 1de 2

#include <12F675.

h>
#device adc=10
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES

NOWDT
INTRC_IO
CPD
PROTECT
NOMCLR
NOPUT
NOBROWNOUT
BANDGAP_HIGH
RESERVED

//No Watch Dog Timer


//Internal RC Osc, no CLKOUT
//Data EEPROM Code Protected
//Code protected from reads
//Master Clear pin used for I/O
//No Power Up Timer
//No brownout reset
//Used to set the reserved FUSE bits

#use delay(clock=4M)
#include <Puertos.c>
//*******************Declaracion de Variables**********************************
signed long
Error=0,
//Variable que almacena la diferencia entre el set_point y Tem
p
Set_Point=0,//Valor al cual deseamos poner la temperatura
Temp=0;
//Valor de temperatura medida en un instante de tiempo
/***************************************************************************
Esta funcion se realiza por la interrupcion del timer0, se utiliza el
Timer0 para determinar el tiempo necesario que transcurre despues del cruce por
cero para variar el angulo de disparo del Triac
***************************************************************************/
int1 int_flag;
#int_GLOBAL
void TIMER0_isr(void){
if(int_flag){
delay_us(135);
disable_interrupts(INT_TIMER0);
}
set_timer0(0);
GP4=1;
//Se pone a 0 GP4 para encender el optoacoplador
GP5=1;
delay_us(50); //Se hace que el ancho del pulso de disparo sea de 50us
GP4=0;
//Se pone a 1 GP4 para apagar el optoacoplador (el Triac queda
encendido)
clear_interrupt(INT_TIMER0);
//Limpiamos el flag TIMR0 para evitar reingreso a la interrupc
ion
int_flag=1;
}
void RA_isr(void){
if(Error>=255){ //Si Error es igual a 255 se debe encender el Triac justo de
spues del cruce por cero
int_flag=0;
delay_us(50);
TIMER0_isr(); //para ello saltamos a la funcion TIMER0_isr() que envia un
pulso de 30us al triac
enable_interrupts(INT_TIMER0); //desabilitamos la interrupcion del timer
0 para no reingresar
goto L1;
//Saltamos al label L1
}
else{
//Si Error es distinto a 255
GP5=0;

setup_adc_ports(sAN0 | sAN1 | VSS_VDD); //Seleccionamos AN0 y AN1 como a


nalogicos
}
if(Error<=0)
//y si la temperatura es mayor o igual al
set_point
disable_interrupts(INT_TIMER0); //Desabilitamos la Interrupcion Timer0 pa
ra apagar el Triac
else{
//de lo contrario
clear_interrupt(int_timer0);
//limpiamos el flag del timer0 por seguri
dad
int_flag=0;
set_timer0(Error);
//cargamos el valor del error en Timer0
enable_interrupts(INT_TIMER0); //Habilitamos la interrupcion Timer0
}
L1:
Delay_us(20);
//Retardo de 20us para evitar errores
Temp=read_adc();
set_adc_channel(0);
//Multiplexamos el ADC al canal 0 para leer Temper
atura
Temp=Temp-435;
//Leemos el valor de la temperatura instantanea
delay_us(40);
Set_Point=read_adc()/4;
//Leemos el valor del pin correspondiente al Set_P
oint
set_adc_channel(1);
//Multiplexamos el ADC al canal 1 para leer Temper
atura
Error = Set_Point - Temp;
//El error es la diferencia entre Set_point y T
emp.
}
void main(){
GP4=0;
//Ponemos en 1 GP4 para desactivar el optoacoplado
r
setup_adc_ports(sAN0 | sAN1 | VSS_VDD);
//Seleccionamos AN0 y AN1 como analogicos
setup_comparator(NC_NC); //Apagamos los comparadores
TRISIO=0B001111;
//GP6 y 7 como salidas los demas como entradas.
setup_adc(ADC_CLOCK_DIV_8);//Seteamos Tadc=Tosc/8 debido a que fosc=4MHz
setup_vref(FALSE);
//Apagamos el Voltaje de referencia interno
setup_timer_0(T0_INTERNAL|T0_DIV_32);
//Seteamos que el desborde ocurra (256-Timer0)*Tos
c/4*32
//si Timer0=0 el desborde ocurrira a 8.192ms
setup_timer_1(T1_DISABLED);//Desabilitamos el Timer1
enable_interrupts(GLOBAL); //Habilitamos las interrupciones globales
set_adc_channel(1);
//Multiplexamos el ADC al canal 1 para leer Temper
atura
for(;;){
while(GP2);
//Esperar que GP2 cambie de 1 a 0
delay_ms(1);
while(!GP2);
//Esperar que GP2 cambie de 0 a 1
RA_isr();
//Hacer la funcion RA_isr
}
}

Você também pode gostar