Autor Tema: interrupcion timer1  (Leído 2357 veces)

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

Desconectado francpa

  • PIC10
  • *
  • Mensajes: 16
interrupcion timer1
« en: 10 de Abril de 2013, 15:27:20 »
hola a todos

necesito ayuda por favor no puedo hacer que mi microcontrolador tenga una interrupcion de 250 ms, con 500 ms funciona bien, estoy utilizando el timer1 del pic 16lf1828, el preescaler es de 8 y el timer1 lo cargo con 0x0BDC para que me de 500 ms, no puedo hacer que de 250 ms ( he canbiado el prescaler y la carga del timer pero no pasa nada)

Código: [Seleccionar]
#include <timy.h>
#int_TIMER1

void  TIMER1_isr(void) {
RA1=~RA1;// toogle RA1
RA2=~RA2;// toogle RA2
set_timer1(0x0BDC);//carga del TMR1
}

void main() {
   set_tris_b(0b11111100);
   RA1=0;// inicializo RA1
   RA2=0;// inicializo RA2
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);     

   setup_timer_4(T4_DISABLED,0,1);
   setup_timer_6(T6_DISABLED,0,1);

   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
set_timer1(0x0BDC);
 
   while(true){
     output_low(LED);
     delay_ms(DELAY);
     output_high(LED);
     delay_ms(DELAY);
 
   }
}

les adjunto el codigo

de ante mano muchas gracias
saludos

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: interrupcion timer1
« Respuesta #1 en: 10 de Abril de 2013, 16:49:19 »
Hola francpa, puedes mostrar el archivo de configuración? Velocidad de cristal, fuses etc...

Saludos!

Desconectado francpa

  • PIC10
  • *
  • Mensajes: 16
Re: interrupcion timer1
« Respuesta #2 en: 10 de Abril de 2013, 18:10:58 »
Hola francpa, puedes mostrar el archivo de configuración? Velocidad de cristal, fuses etc...

Saludos!

claro que si aqui esta
Código: [Seleccionar]
#include <16LF1828.h>
#device adc=16
#bit RA1=0x8C.1
#bit RA2=0x8C.2

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES WDT_SW                   //No Watch Dog Timer, enabled in Software
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES PLL_SW                   //4X HW PLL disabled, 4X PLL enabled/disabled in software
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(int=4000000)


#define LED PIN_A0
#define TIEMPO PIN_A1



cualquier ayuda me sirve gracias

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: interrupcion timer1
« Respuesta #3 en: 10 de Abril de 2013, 19:01:11 »
Hola francpa, pues lo que veo es que tienes sin definir a DELAY y la configuración del Timer1 no corresponde a los 250 mS que buscas.  Por otro lado no veo la necesidad de definir los pines del PIC ya que CCS los trae definidos y tiene todas las instrucciones para manejarlos.  Te dejo las correcciones y una pequeñas explicación de la configuración del Timer:

Código: C
  1. //
  2. //  En general:
  3. //  Tosc = (1 / clock)
  4. //  Tiempo = 4 x Tosc x Valor a contar en Timer x Rango del Divisor
  5. //  Tiempo = 4 x 0.00000025 x 65535 x 4 = 262.14 mSeg.   // 16 bits
  6. //  Tiempo = 4 x 0.00000025 x 62500 x 4 = 250.00 mSeg.   // 16 bits
  7. //  Valor de carga de Timer1: 65535-62500=3035 (0xBDB)
  8. //
  9.  
  10. #include <16LF1828.h>
  11. #device adc=16
  12.  
  13. #FUSES NOWDT                    //No Watch Dog Timer
  14. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  15. #FUSES WDT_SW                   //No Watch Dog Timer, enabled in Software
  16. #FUSES NOMCLR                   //Master Clear pin used for I/O
  17. #FUSES NOBROWNOUT               //No brownout reset
  18. #FUSES PLL_SW                   //4X HW PLL disabled, 4X PLL enabled/disabled in software
  19. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  20.  
  21. #use delay(int=4000000)
  22.  
  23. #define LED pin_A0
  24. #define LED_1 pin_A1
  25. #define LED_2 pin_A2
  26. #define DELAY 150
  27.  
  28. #int_TIMER1
  29. void  TIMER1_isr(void)
  30. {
  31. output_toggle(LED_1);           // toogle RA1
  32. output_toggle(LED_2);           // toogle RA2
  33. set_timer1(0xBDB);              // carga del TMR1 para 250 mSeg.
  34. }
  35.  
  36. void main()
  37. {
  38.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);  //262 ms overflow
  39.  
  40.    setup_timer_4(T4_DISABLED,0,1);
  41.    setup_timer_6(T6_DISABLED,0,1);
  42.  
  43.    setup_comparator(NC_NC_NC_NC);
  44.    enable_interrupts(INT_TIMER1);
  45.    enable_interrupts(GLOBAL);
  46.  
  47.    // Inicio los LEDs para que trabajen alternados...
  48.    output_high(LED_1);          // inicializo a RA1
  49.    output_low(LED_2);           // inicializo a RA2
  50.    set_timer1(0xBDB);           // carga del TMR1 para 250 mSeg.
  51.    
  52.    while(TRUE)
  53.    {
  54.      output_low(LED);
  55.      delay_ms(DELAY);
  56.      output_high(LED);
  57.      delay_ms(DELAY);
  58.    }
  59. }

Saludos!

« Última modificación: 10 de Abril de 2013, 19:03:30 por bmb »

Desconectado francpa

  • PIC10
  • *
  • Mensajes: 16
Re: interrupcion timer1
« Respuesta #4 en: 11 de Abril de 2013, 10:01:01 »
muchas gracias bmb me funciono bien, tengo una duda es posible tener 2 interrupciones me refiero que un led parpadee a 500 ms y otro a 250ms con el mismo timer1 o es necesario un timer 0 o 2 por ejemplo
de ante mano muchas gracias por tu ayuda
saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: interrupcion timer1
« Respuesta #5 en: 11 de Abril de 2013, 11:23:52 »
muchas gracias bmb me funciono bien, tengo una duda es posible tener 2 interrupciones me refiero que un led parpadee a 500 ms y otro a 250ms con el mismo timer1 o es necesario un timer 0 o 2 por ejemplo
de ante mano muchas gracias por tu ayuda
saludos

  Podrías implementar un contador que cuando se produscan 2 interrupciones (cada 250ms) que accione el led que quieres que cambie cada 500ms
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: interrupcion timer1
« Respuesta #6 en: 11 de Abril de 2013, 12:55:41 »
muchas gracias bmb me funciono bien, tengo una duda es posible tener 2 interrupciones me refiero que un led parpadee a 500 ms y otro a 250ms con el mismo timer1 o es necesario un timer 0 o 2 por ejemplo
de ante mano muchas gracias por tu ayuda
saludos

  Podrías implementar un contador que cuando se produscan 2 interrupciones (cada 250ms) que accione el led que quieres que cambie cada 500ms

Así es, para ahorrar Timers hay que intentar buscar el máximo común divisor de los intervalos buscados.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.