Hola mundoPIC:
Tengo un programilla funcionando con un PIC16F877. El objetivo es que con único temporizador pueda arrancar 3 temporizaciones del orden de minutos atendiendo a tres activaciones por el puerto A. Si una temporización está en curso, la otra debe de arrancar sin afectar a la que se está efectuando.
A continuación muestro el programa. Esta basado en que el timer desborde cada segundo y cada segundo incrementar un contador en una función temporización que a los 60 efectue cambios de estado en un puerto.
#include <16f877.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07
#byte PORTD = 0X08
#byte PORTE = 0X09
int16 valor=0;
short ban_1seg=0;
short ban_1seg1=0;
short ban_1seg2=0;
int cont=0, con_min=0;
int cont1=0, con_min1=0;
int cont2=0, con_min2=0;
int1 flag=0, flag1=0, flag2=0;
void temporizar()
{
if(flag==1)
{
con_min++;
if(con_min == 60)//1MINUTO=60, 2MINUTO=120, 3MINUTO=180
{
con_min = 0;
PORTD=0X00;
flag=0;
}
}
}
void temporizar1()
{
if(flag1==1)
{
con_min1++;
if(con_min1 == 60)
{
con_min1=0;
PORTB=0X00;
flag1=0;
}
}
}
void temporizar2()
{
if(flag2==1)
{
con_min2++;
if(con_min2 == 60)
{
con_min2=0;
PORTC=0X00;
flag2=0;
}
}
}
///////////////////////////////////////
#int_TIMER1 //Interrupción Timer1
void temp1s(void) //Función
{
delay_cycles(2);
set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
if(flag==1)
{
cont++;
if(cont == 2){ //0,5 seg x 10 son 5 segundos.
ban_1seg = 1;
cont = 0;
}
}
if(flag1==1)
{
cont1++;
if(cont1 == 2){ //0,5 seg x 10 son 5 segundos.
ban_1seg1 = 1;
cont1 = 0;
}
}
if(flag2==1)
{
cont2++;
if(cont2 == 2){ //0,5 seg x 10 son 5 segundos.
ban_1seg2 = 1;
cont2 = 0;
}
}
}
///////////////////////////////////////
void main ()
{
SET_TRIS_A (0xFF);
SET_TRIS_B (0x00);
SET_TRIS_C (0X00);
SET_TRIS_D (0x00);
PORTD=0X00;
PORTC=0X00;
PORTB=0X00;
//PORTA=0X00;
setup_timer_1 (t1_internal | t1_div_by_8);
//set_timer1 (3041); //recarga del tmr1
enable_interrupts(int_timer1); //habilita interrupcion timer1
enable_interrupts(global); //habilita interrupción general
output_b(0);
while(true)
{
//diparo1
if(input(pin_A0)==0)
{
flag=1;
PORTD=0XFF;
set_timer1 (3041);
}
//disparo2
if(input(pin_A1)==0)
{
flag1=1;
PORTB=0XFF;
set_timer1 (3041);
//valor=get_timer1();
}
if(input(pin_A2)==0)
{
flag2=1;
PORTC=0XFF;
set_timer1 (3041);
//valor=get_timer1();
}
if(ban_1seg)
{
ban_1seg = 0;
temporizar();
}
if(ban_1seg1)
{
ban_1seg1 = 0;
temporizar1();
}
if(ban_1seg2)
{
ban_1seg2 = 0;
temporizar2();
}
}//while(1)
}//main()
///////////////////////////////////////
un saludo