Plantilla uso del timer 0 e Interrupcion

Anuncio
Plantilla para el uso de la Interrupción RTCC mediante el TIMER0
La interrupción RTCC se produce cada vez que el contador TIMER0 pasa de FFh a
00h.
•
El TIMER0 hace un cómputo completo de 00h a FFh cada 512 us, sin
embargo este tiempo puede ser cambiado mediante un preescaler o sea un
divisor, ajustable. Los tiempos generados para cada configuración (Los Micros
usados son el 16F628, el 16F876A y el 18F4550 pero puede ser fácilmente
adaptado a otros modelos de PIC. Ocasionalmente se usan también los
18F1320 y 18F2550. Todos los tiempos están calculados para cristales de 4 Mhz
y 20 Mhz, salvo en los 18F4550 y 18F2550 en funciones de USB que "corren" a
48 Mhz mediante el PLL interno) son:
•
•
•
•
•
•
•
•
:2
:4
:8
:16
:32
:64
:128
:256
->
->
->
->
->
->
->
->
512
1.0
2.0
4.0
8.1
16.3
33.3
66.6
µS al mínimo preescaler posible.
mS
mS
mS
mS
mS
mS
mS al máximo preescaler posible.
La plantilla usa un Preescaler de 128 para producir una interrupción RTCC cada 33.3
mS y así cada 30 veces que se produce cambio de estado la variable Flag, o sea 33.3 x
30 = 999 ms.
PLANTILLA PARA USO DE INTERRUPCIÓN Y TIMER0.
#include <16f628.h>
// Selecciona el PIC
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=4000000)
// Velocidad del Cristal : 4 Mhz
byte const NInts=30;
// Numero de interrupciones para 1 Segundo
// VARIABLES GLOBALES
char C_Ints=0;
char Flag=0;
// Contador de Interrupciones ocurridas
// Flag que cambia cada NInts interrupciones
#int_RTCC
RTCC_isr() {
// Interrupción por desbordamiento
// del TIMER0 RTCC
if(C_Ints > NInts){
if(Flag==0){
Flag=1;
}
else{
Flag=0;
}
C_Ints=0;
}
}
++C_Ints;
// Si las ints ocurridas > ints para 1 Seg.
// Reinicializo Contador de Ints
// Incremento el número de interrupciones
// Ocurridas
void main(void) {
setup_counters(RTCC_INTERNAL,RTCC_DIV_128);// TIMER0: Clock Interno, Presescaler 128
setup_timer_1(T1_DISABLED);
// para una RTCC cada 33.3 milisegundos
setup_timer_2(T2_DISABLED,0,1);
// -> 1 Segundo = 30 RTCC
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(global);
// Habilito Interrupción RTCC
// Habilito Interrupciones
do{ // Bucle infinito
if(Flag==K){}
else
{
// si ha cambiado Flag ...
// AQUI HAGO LO QUE DESEE CADA 1 SEGUNDO
}
k=Flag;
// Guardo estado anterior de Flag
}While(TRUE);
}
EJEMPLO DE LA PLANTILLA PARA PARPADEO DE UN LED CADA ½ SEGUNDO
#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(B)
#use fixed_io(b_outputs=PIN_B0)
//
//
//
//
//
Selecciona el PIC
Opciones de configuración
Velocidad del Cristal : 4 Mhz
PORTB en estándar IO digital
B0 como salida en PORTB
byte const NInts=7;
// Numero de interrupciones para 0.25 Segundos
// VARIABLES GLOBALES
char C_Ints=0;
char Flag=0;
char K=0;
// Contador de Interrupciones ocurridas
// Flag que cambia cada NInts interrupciones
// Estado anterior del Flag
#int_RTCC
RTCC_isr() {
// Interrupción por desbordamiento
// del TIMER0 RTCC
if(C_Ints > NInts){
if(Flag==0){
Flag=1;
}
else{
Flag=0;
}
C_Ints=0;
}
++C_Ints;
}
// Si las ints ocurridas > ints para 0.25 seg.
// Reinicializo Contador de Ints
// Incremento el número de interrupciones
// Ocurridas
void main(void) {
setup_counters(RTCC_INTERNAL,RTCC_DIV_128);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(global);
// TIMER0: Clock Interno, Presescaler 128
// para una RTCC cada 33.3 milisegundos
// -> 1 Segundo = 30 RTCC
output_low(PIN_B0);
// Empiezo apagando el Led
// Habilito Interrupción RTCC
// Habilito Interrupciones
do{ // Bucle infinito
if(Flag!=K)
{
if(Flag==0){ output_low(PIN_B0); }
if(Flag==1){ output_high(PIN_B0); }
k=Flag;
}
}While(TRUE);
}
//
//
//
//
si ha cambiado Flag ...
Si es 0 Apago el Led
si es 1 Enciendo el Led
Guardo estado anterior de Flag
Descargar