Sei sulla pagina 1di 5

/*************************************************************************** */

/* timer0_Ciclos_int.c
*/
/*---------------------------------------------------------------------------*/
/* TEMPORIZADOR 0 Ver clculos en archivo de Excel: timer0_Calc
*/
/*---------------------------------------------------------------------------*/
/* Ejemplo para permitir CC ciclos mediante interrupciones. Los ciclos de */
/* trabajo se pueden establecer mediante entrada por teclado.
*/
/* Este ejemplo permite controlar la temperatura de una resistencia R calefac*/
/* tora para una incubadora.
*/
/*---------------------------------------------------------------------------*/
/* TALLER DE AUTOMATIZACION I PROF MAYA LUIS
*/
/*****************************************************************************/
#include <16f877a.h>
#byte
TMR0=0x01
//POSICION DEL TEMPORIZADOR 0
#byte
PUERTOC=0X07
//POSICION del PUERTO C
#bit RES_ON =0X07.0
//LED COLOCADO EN EL PIN 0 DEL PUERTO C
#byte INTCON=0x0B
//POSICION DEL REGISTRO INTCON BANCO 0
#bit
TOIF=0x0B.2
//BANDERA DE INTERRUPCION DEL TIMER 0
//#bit
TMR0IE=0x0B.5
//HABILITA INTERRUPCION DEL TIMER 0
#byte OPTION_REG=0x81
//POSICION DEL REGISTRO OPTION_REG BANCO 1
#bit
PS0=0X81.0
//BIT PARA SELECCIONAR VALOR DEL PREESCALADOR
#bit
PS1=0X81.1
//BIT PARA SELECCIONAR VALOR DEL PREESCALADOR
#bit
PS2=0X81.2
//BIT PARA SELECCIONAR VALOR DEL PREESCALADOR
#bit
PSA=0X81.3
//BIT PARA ASIGNAR EL PREESCALADOR AL TIMER0 o WDT
#bit
T0CS=0X81.5
//BIT PARA SELECCIONAR LA FUENTE DEL RELOJ
//-- Estados de generacion
#define ESTADO_ON 0
#define ESTADO_OFF 1
//-- Ciclos de trabajo
unsigned char ct[]={26,51,77,94,128,154,179,205,230};
unsigned char estado=0;
unsigned char T0ini;
//-- Interfaz entre la rutina de atencion a la int.
unsigned char Ton=0;

unsigned char ctcc[]={250,225,200,175,150,125,100,75,50};


//unsigned char ctcc[]={5,5,5,5,5,5,5,5,5};
unsigned char cc=0;
unsigned char Tcc=0;
/*****************************************/
/* Rutina de atencion a la interrupcion */
/*****************************************/
#int_TIMER0
void TIMER0_isr(void)
{
//-- En este estado se envia medio ciclo
if (estado==ESTADO_ON)
{
RES_ON=0;
//-- Energiza R calefactora
T0ini=Ton;
//-- Valor para medio ciclo
estado=ESTADO_OFF; //-- Pasar al estado siguiente
}
//-- En este estado se envia otro medio ciclo para completar un ciclo
else
{
//RES_ON=1;
//-- Desconectar R calefactora
RES_ON=0;
//-- Conectar R calefactora en el sig semiciclo
T0ini=Ton;
//-- Valor para un ciclo completo
estado=ESTADO_ON; //-- Pasar al estado inicial
cc=cc+1;
//-- Contador de ciclos
}
TMR0=T0ini;
//-- Dar valor inicial del timer
TOIF=0;
//-- Quitar flag de interrupcion
}
void main(void)
{
unsigned char ic;
unsigned char i;
unsigned char icc;
unsigned char j;
set_tris_c(0xFE);

//CONFIGURA AL PIN PORTC,0 COMO SALIDA (1111 1110)

T0CS=0; PSA=0;
//-- Configurar Timer 0
//-- Modo temporizador
//PS2=1; PS1=0; PS0=0;
//-- Presscaler a 32
PS2=1; PS1=1; PS0=1;
//OPTION_REG,(2 1 0) PREESCALADOR a 256
//-- El bucle principal se encarga de leer las teclas recibidas
//-- y establecer el pwm solicitado
while(1)
{
ic='4'; //c=4 permite onda de 8,33s de semiperiodo
//-- Teclas de control. Establecer el ciclo de trabajo
if (ic>='1' && ic<'9')
{
i=ic-'1';
Ton=ct[i];
//-- Leer la tecla Rafaga de ciclos
icc='3'; //icc=3 permite RAFAGA de cc (200) ciclos
//-- Teclas de control. Establecer el ciclo de trabajo
if (icc>='1' && icc<'9')
{
j=icc-'1';
Tcc=ctcc[j];
if (Tcc<=cc)
{
RES_ON=1;
//-- Desconectar R calefactora
DISABLE_INTERRUPTS(GLOBAL); // Prohibe interrupciones globales,
DISABLE_INTERRUPTS(INT_TIMER0); // Prohibe interrupciones del TIMER0
}
else
{
ENABLE_INTERRUPTS(GLOBAL); //Activar interrupciones globales,
ENABLE_INTERRUPTS(INT_TIMER0); //permite interrupciones del TIMER0
}
}
}

}
}
HASTA AQU EL ARCHIVO DEBE EDITARSE EN EXTENSIN: Nombre.c

A CONTINUACIN ALGUNOS CLCULOS:


Frecuencia del sistema (Fs) = Frecuencia del Cristal (Fc)/4
Reloj del sistema (Ts) =(1/Fs)
Suministre Fc -->

Cristal Fc=

Frecuencia del sistema (Fs) =


Reloj del sistema (Ts)
=

20

MHz

20.000.000,00 Hz

MHz

5.000.000,00 Hz

ns

0,000000200 s

200

N = Numero de Ticks
Temporizador de 8 bits --> Nmax = 256 ticcks
Nmin = 1 ticks
Tiempo a medir: t= (4/Fosc)*N*Divisor

Suministre t =

tmax (us) = (4/Fosc(MHz))*N_max*Divisor


tmax (us) = (4/Fosc(MHz))*256*Divisor
tmax (us) = (1.024/Fosc(MHz))*Divisor

tmin (us) = (4/Fosc(MHz))*N_min*Divisor


tmin (us) = (4/Fosc(MHz))*1*Divisor
tmin (us) = (4/Fosc(MHz))*Divisor

8,300

ms

Valor inicial del Timer0 (TOINI)


TOINI = 256 - N
TOINI = 256 - ((Fosc[MHz]/4) * Divisor) * t[ms]
Tiempo natural tc = (256 - TOINI) * (4/Fosc[MHz]) * Divisor
Error E = t - tc
+++++++++++++++++
Divisor para el prescaler
PS2
PS1
PS0
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0

Divisor
2
4
8
16
32
64
128

tmin [us]
0,40
0,80
1,60
3,20
6,40
12,80
25,60

tmax [us]
102,40
204,80
409,60
819,20
1.638,40
3.276,80
6.553,60

TOINI
-2.244,00
-994,00
-369,00
-56,50
-1.040,88
-392,44
-68,22

REDONDEADO
TOINI

-1.041,00
-392,00
-68,00

t deseado
t[ms]

t natural
tc[us]

Error [us]
|E| = |t -tc|

8,3
8,3
8,3

8.300,80
8.294,40
8.294,40

0,8
5,6
5,6

256

51,20

13.107,20

93,89

94,00

TIEMPO QUE:

8,3
SE
QUIERE
MEDIR

8.294,40

SE MIDE
REALMENTE

5,6

MEJO
SOLU

Potrebbero piacerti anche