Autor Tema: timer0  (Leído 1740 veces)

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

Desconectado hqv

  • PIC12
  • **
  • Mensajes: 70
timer0
« en: 27 de Junio de 2004, 17:10:00 »
hola amigos la consulta es la siguiente:


si hago andar el timer0 y este se desborda (lo que quiero)  para este o sigue andando

les cuento :

estoy utilizando la inetrrupcion ext, a ella le llegan un pulso para encender un equipo y dos pulsos , en el caso de los dos pulsos llegan con una diferencia de 3 segundos aproximados o menos.

lo que hago yo es dentro de la interrupcion ext enciendo el timer0
t espero a que se desborde, si se desborda y no ha llegado ninguna otra interrupcion ext significa q hay que encender el equipo, pero si llega otra y el timer0 esta encendido significa que hay que apagarlo.


espero una respuesta de ustedes.

gracias
hqv









Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: timer0
« Respuesta #1 en: 27 de Junio de 2004, 17:43:00 »
Hola..

Pues que yo sepa, que el TMR0 funcione o no depende si el preescaler esta asignado al TMR0 o al Watchdog, a lo que te refieres me imagino es a activar la interrupcion por desborde del TMR0, pero recuerda que si estas dentro de una interrupcion.. el pic no puede entrar en otra, osea si el pic esta atendiendo la interrupcion externa al entrar a la rutina el pic desactiva el bit GIE, solo hasta que salga de esa rutina el pic podra atender la del TMR0, postea el programa y asi, si no te ayudo yo, pues otro por aca lo hará

Adios

Desconectado hqv

  • PIC12
  • **
  • Mensajes: 70
RE: timer0
« Respuesta #2 en: 27 de Junio de 2004, 19:31:00 »
el programa debe estar malo pero voy a tratar de acplicarles lo que yo quiero hacer con la interrupciones.

#define INTS_PER_SECOND 15      //(4000000/(4*256*256))
byte    seconds;            //Número de interrupciones restantes antes de que
byte   int_count;            //transcurra un segundo.

void main(void)
{
enable_interrupts(global);
//enable_interrupts(int_rda);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
enable_interrupts(int_rtcc);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);


while(1)
     {

switch (estado)
{
case 0:
{
if((counter==1)&&(TOIF==1)//                             siempre en el estado 0, y si llega una inetrrupcion ext, va a ella.
{
estado=1;
}
bit_set(port_d,0);
bit_clear(port_d,1);
         
break;
}//fin case 0   
            
            
case 1:
{
counter=0;
            
bit_clear(port_d,0);         
bit_set(port_d,1);

break;
}//fin case 1

}//fin while
}//fin main


//interrupciones

#int_ext
void encendido (void)
{
bit_set(port_d,2);               //cuando llega una interrupcion ext
                                           //entra a la función como el counter==0
                                          //y se supone que el timer0 no lo he
                                          //enecndido no entra en el if
if ((counter==1)&&(TOIF==1))
   {
   estado=0;
   counter=0;
   }//fin if1

counter=1;                    
set_rtcc(0);     //con esto se enciende el Timer0?????? no lo sé


if((counter==1)&&(TOIF==0)) //debería pasar al estado 1 ya que
                                               //counter ==1 y no se a desbordado
                                               //el tmr0
   {
   estado=1;   
   
   }//fin if2   
delay_ms(1000);
bit_clear(port_d,2);
}//FIN INTERRUPCION EXT

#int_rtcc
void rtcc (void)
{
bit_set(port_d,3);
if(--int_count==0)
   {
   ++seconds;
   int_count=INTS_PER_SECOND;
   if(seconds==3)//a este punto se ha temporizado 3 segundos
      {
      seconds=0;   

      }//fin if2

   }//fin if1
delay_ms(1000);
bit_clear(port_d,3);
}//FIN INTERRUPCION RTCC





Desconectado hqv

  • PIC12
  • **
  • Mensajes: 70
RE: timer0
« Respuesta #3 en: 27 de Junio de 2004, 20:23:00 »
alguno de los tres timer se puede encender y apagar cuando uno quiera.

yo como trate de explicar solo queiro que funcione si me llega una interrupcion ext no mas, y depués q se detenga. para que no tenga problema con esta iterrupcion más tarde.


gracias

hqv

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: timer0
« Respuesta #4 en: 28 de Junio de 2004, 08:07:00 »
Hola..

Con set_rtcc(0); lo que haces es cargar el TMR0 con 0 es decir empieza la cuenta desde 0.. el TMR0 no se enciende.. el TMR0 siempre esta funcionando.. bueno claro esta si el preescaler esta asignado a él o esta funcionando con un reloj externo (TOCKI), en el main con setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Pones este a funcionar con el reloj interno, ademas setea el preescaler a 256... osea que siempre el TMR0 va a estar funcionando.. lo que recomiendo que hagas es..

set_rtcc(0); //seteas el TMR0 a cero
int_count=0; // reseteas esta variable para que empieze de cero
seconds=0; // Segundos a cero..

Recuerda que mientras el pic este en la rutina de interrupción externa.. no puede estar pendiente de la interrupción RTCC.


 

anything