Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
/* 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;
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
Cristal Fc=
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 =
8,300
ms
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