Autor Tema: timer1_ 3 temporizaciones simultáneas, 1 único temporizador  (Leído 1560 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
timer1_ 3 temporizaciones simultáneas, 1 único temporizador
« en: 18 de Noviembre de 2011, 12:56:55 »
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.

Código: [Seleccionar]
#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

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: timer1_ 3 temporizaciones simultáneas, 1 único temporizador
« Respuesta #1 en: 18 de Noviembre de 2011, 13:11:54 »
Hola de nuevo.... por supuesto se admiten Y DE MUY BUENA GANA opiniones, alternativas, críticas al programa para hacerlo más corto, más extructurado, más exacto.... :-/ :-/ :-/

Saludos...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: timer1_ 3 temporizaciones simultáneas, 1 único temporizador
« Respuesta #2 en: 18 de Noviembre de 2011, 13:19:52 »
Podes mirar la siguiente librería que realice en algún momento para ser más flexible un proyecto que tenia entre manos : http://www.micros-designs.com.ar/c18-varias-temporizaciones-un-solo-timer/

Es para C18, pero como para ver la estructura, o si se te ocurre alguna idea. Por ejemplo, podes usar variables seteables o definiciones para establecer las temporizaciones, así no hay que buscar entre el código para ver que modificar  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything