Autor Tema: ayuda con el timer de pic 18f542  (Leído 2698 veces)

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

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
ayuda con el timer de pic 18f542
« en: 04 de Septiembre de 2008, 14:16:23 »
hola a todos bueno estoy haciendo un programa que requiere que el timer1 del pic 18f452 marque cada 2 segundos con la bandera del timer se escribe la palabra time  el problema es q no puedo cambiar la frecuencia del cristal q esta en 19660800 (ese es el requerimiento) y me piden q use un preescalador

aca esta el codigo

void main(void)
{

   startup();
   setup_timer1();
   printf(CLR_SCR);                              // Rensa skärmen

   do
     {
        // Här snurrar vi nu och väntar på roll over flaggan, TMR1IF, ska sättas
          if (bit_test(PIR1,TMR1IF))                  //Bit 0 är TMR1IF
             {
                 output_bit(PIN_C2,~input(PIN_C2));         // Blinka Status Led Master Card 5 ggr/sek
                bit_clear(PIR1,TMR1IF);                  // Nolla roll over flaggan, TMR1IF
            printf("Time");
           }
       }while(TRUE);
}

void setup_timer1(void)
{
   setup_timer_1(T1_DISABLED);               // Se includefilen 18f452.h
   set_timer1(RESET_TIMER);               // TMR1H och TMR1L nollställs
   disable_interrupts(INT_TIMER1);            // Interrupten frånkopplas
   disable_interrupts(INT_EXT);
   disable_interrupts(GLOBAL);
   setup_timer_1(T1_INTERNAL |  0x70);   // Starta Timer1 med prescale 1:8
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda con el timer de pic 18f542
« Respuesta #1 en: 04 de Septiembre de 2008, 14:58:32 »
Hola.

No seria mas sencillo llevar la cuenta de ese tiempo con la interrupcion del Timer1 y asignar un flag en la funcion de interrupcion para validarla en el main? Lo unico que habria que calcular es el numero de veces que se debe desbordar con un cristal de 20MHz.

T = 2^16 * 4/20M = 13.1072mS -> tiempo de desborde del Timer1 con T1_DIV_BY_1. (puedes usar otro para aumentar el tiempo)

Saludos
El papel lo aguanta todo

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: ayuda con el timer de pic 18f542
« Respuesta #2 en: 04 de Septiembre de 2008, 15:18:06 »
hola bueno gracias por responder el problema es q me lo piden hacer de esa forma mira aca esta el enunciado  Write a program that uses TMR1IF as a timerreference by polling the flag
and check if it is set. The Program must write to the hyperterminal every two
seconds, as close as possible to 2.00 sec. Compute the cycletime of the timer
with respect to the crystal frequency that is used on the Master Card. Use the
prescaler for Timer1 and if necessary a software prescaler to come close to 2
seconds, 2.033 sec, Let the register of the timer roll over as close as
possible.

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: ayuda con el timer de pic 18f542
« Respuesta #3 en: 04 de Septiembre de 2008, 15:47:03 »
hable con el profesor y me dijo q si podia usar interrupciones pero no tengo ni idea de como hacerlo con el timer es q la verdad no tengo mucho tiempo trabajando en c espero q me puedan ayudar gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda con el timer de pic 18f542
« Respuesta #4 en: 04 de Septiembre de 2008, 16:21:29 »
Hola.

Tu estas usando el contador interno del Timer1 para cambiar de estado el pin y para enviar el dato.
Seria algo asi:

Código: C#
  1. #include<18F452.h>
  2. #fuses HS,NOLVP,NOWDT,PUT
  3. #use delay(clock=20M)
  4. #use rs232(baud=9600, bits=8, xmit=pin_c6, rcv=pin_c7)
  5.  
  6. int1 data_ok=0;
  7. int8 ints=0;
  8.  
  9. #int_TIMER1
  10. void reloj_isr(void)
  11. {
  12.         set_timer1(3036);
  13.         ++ints;
  14.         if(ints>=20)
  15.         {
  16.                 ints=0;
  17.                 data_ok=true;
  18.         }
  19. }
  20.  
  21. void main(void)
  22. {
  23.         setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
  24.         enable_interrupts(INT_TIMER1);
  25.         enable_interrupts(GLOBAL);
  26.         while(true)
  27.         {
  28.                 if(data_ok)
  29.                 {
  30.                         data_ok=false;
  31.                         puts("Time");
  32.                 }
  33.         }
  34. }

Como el cristal es de 20MHz y le coloco una precarga de 3036 y esta multiplicado por 8, tendre bases de tiempo de 100mS, si cuento 20 veces tendre los 2 segundos.

Saludos.
El papel lo aguanta todo

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: ayuda con el timer de pic 18f542
« Respuesta #5 en: 07 de Septiembre de 2008, 11:20:51 »
hola niños!!! gracias por la ayuda aki pongo la solucion..

void setup_timer1(void)
{
   setup_timer_1(T1_DISABLED);               // Se includefilen 18f452.h
   set_timer1(RESET_TIMER);               // TMR1H och TMR1L nollställs
   disable_interrupts(INT_TIMER1);            // Interrupten frånkopplas
   disable_interrupts(INT_EXT);
   disable_interrupts(GLOBAL);
   setup_timer_1(T1_INTERNAL |  T1_DIV_BY_8);   // Starta Timer1 med prescale 1:8
}

void main(void)
{
   int counttimer=0;
   startup();
   setup_timer1();
   printf(CLR_SCR);
   puts("timer counting");                              // Rensa skärmen

   
      while(TRUE){
    
        // Här snurrar vi nu och väntar på roll over flaggan, TMR1IF, ska sättas
         
          if (bit_test(PIR1,TMR1IF))                  //Bit 0 är TMR1IF
             {
                 output_bit(PIN_C2,~input(PIN_C2));         // Blinka Status Led Master Card 5 ggr/sek
                bit_clear(PIR1,TMR1IF);   
            counttimer++;               // Nolla roll over flaggan, TMR1IF
         }
         if (counttimer==20){
         puts("Timer1");
         counttimer=0;}
      }
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda con el timer de pic 18f542
« Respuesta #6 en: 07 de Septiembre de 2008, 12:18:56 »
Hola.

 :-/ :-/ :-/
Felicitaciones.

Por cierto el codigo que postee es para hacerlo por interrupciones.

Saludos
El papel lo aguanta todo