Autor Tema: Tempo + Timer0 ...  (Leído 1987 veces)

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

Desconectado tretas

  • PIC10
  • *
  • Mensajes: 15
Tempo + Timer0 ...
« en: 22 de Noviembre de 2009, 13:08:26 »
Ola,

tenho o seguinte codigo para testar o timer0



Código: [Seleccionar]
#include <16f877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT, NODEBUG
#device  ADC=10 //CAN 10 bits
#use delay(clock=8000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)


#define sortie_piston14 PIN_A1
#define sortie_piston58 PIN_A2

unsigned int16 temps_piston14 =10000, temps_piston58=20000;


////////////////////////////////////////////////////////////////////////////////
//                                 TIMER 0                                    //
////////////////////////////////////////////////////////////////////////////////

#INT_timer0
void trata_timer0 ()
{
   static int conta;
  
  
   // reinicia o timer0 em 6 mais a contagem que já passou
   set_timer0 ( 6 + get_timer0() );
   conta++;
  
   // se já ocorreram 250 interrupções ( 256 - 6 = 250 )
   if ( conta == 250 ) //
   {
      conta = 0;
      // temps_piston14 -= temps_piston14 ;
       temps_piston14 = temps_piston14 - temps_piston14;
                  
   }
}

////////////////////////////////////////////////////////////////////////////////
//                                     MAIN                                   //
////////////////////////////////////////////////////////////////////////////////
void main()
{

 output_high(PIN_E0);
 enable_interrupts ( GLOBAL ) ;
  
  
   // configura o timer 0 para clock interno e prescaler dividindo por 32
   setup_timer_0 ( RTCC_INTERNAL|RTCC_DIV_32 );
   set_timer0 ( 6 ); // inicia o timer 0 em 6
   // habilita interrupções
   enable_interrupts ( INT_timer0 );


while(TRUE)
  {
  
    if (temps_piston14 > 1)
         output_high(sortie_piston14);
          else
           output_low(sortie_piston14);
  
  
   if (temps_piston58 > 1)
        output_high(sortie_piston58);
         else
          output_low(sortie_piston58);
   }
  
  
 
}







e queria activar a saida RA1 durante 10 segundos, so que ela fica 1 segundo activa no maximo que estarei a fazer de mal ?
pois penso que o timer0 esta bem programado ... estou a dar em loco :(

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tempo + Timer0 ...
« Respuesta #1 en: 22 de Noviembre de 2009, 13:50:08 »
Así como configuras el timer interrumpirá cada 4ms, y para realizar una temporización de 10s deberás contar 2500 interrupciones  :?
Otra puede ser configurar el timer para que interrumpa cada 16ms y contar 625, ect.


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

Desconectado tretas

  • PIC10
  • *
  • Mensajes: 15
Re: Tempo + Timer0 ...
« Respuesta #2 en: 22 de Noviembre de 2009, 14:03:26 »
ola,

sim eu genero uma interrupção todos os 4ms  mas ...

Código: [Seleccionar]
unsigned int16 temps_piston14 =10000, temps_piston58=20000;
Código: [Seleccionar]
if ( conta == 250 ) //
   {
      conta = 0;
      // temps_piston14 -= temps_piston14 ;
       temps_piston14 = temps_piston14 - temps_piston14;


0.004 ms * 250 = 1s .... ou estou errado ?

logo a variável  temps_piston14 só deveria ser = a 0 passado 10s ... ou o timer0 não funciona assim ?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tempo + Timer0 ...
« Respuesta #3 en: 22 de Noviembre de 2009, 16:51:06 »
Lo podes hacer con 1 variable:

Código: C
  1. int16 DiezSegundos=2500;
  2.  
  3. void trata_timer0 ()
  4. {
  5.     set_timer0(6);
  6.     DiezSegundos--;
  7.     if(DiezSegundos==0){...

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