Autor Tema: Como configurar el timer 1 en modo contador  (Leído 9256 veces)

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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como configurar el timer 1 en modo contador
« Respuesta #15 en: 08 de Octubre de 2009, 23:32:06 »
La idea es la siguiente:

Código: C
  1. #priority TIMER1,RB
  2. char Tecla;
  3. int1 Actualizar_hora=0, Tecla_pulsada=0;
  4.  
  5. #INT_TIMER1
  6. timer1_rsi()
  7. {
  8.    ++Conta_Segundos;
  9.    Actualizar_hora=1;
  10. }
  11.  
  12. // Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
  13. #INT_RB
  14. rb_isr()
  15. {
  16.     byte changes;
  17.     changes=last_b^portb;       //XOR.
  18.     last_b=portb;
  19.     if (bit_test(changes,5) && !bit_test(last_b,5))
  20.     {                                                    
  21.        Tecla=1;
  22.     }
  23.     if (bit_test(changes,6) && !bit_test (last_b,6))   //INCREMENTAR.
  24.     {
  25.       Tecla=2;
  26.     }
  27.     if (bit_test(changes,7) && !bit_test (last_b,7))   //DECREMENTAR.
  28.     {
  29.       Tecla=3;
  30.     }
  31.  
  32. }
  33.  
  34.        
  35. void  main(void){
  36.  
  37.       lcd_init();
  38.       set_tris_b(0xf0);
  39.       port_b_pullups(TRUE);
  40.       portb=0xf0;
  41.       setup_timer_1(T1_EXTERNAL|T1_DIV_BY_2|T1_CLK_OUT);//el preescaler q va es 2.
  42.  
  43.       set_tris_c(0b00000011);
  44.       set_tris_d(0x00);
  45.       lcd_gotoxy(1,1);
  46.       lcd_putc("Reloj Digital");
  47.       delay_ms(1500);
  48.       lcd_putc("\fHora 00:00:00 ");
  49.       lcd_gotoxy(1,2);
  50.       lcd_putc("        ..      ");
  51.       delay_ms(250);
  52.       lcd_gotoxy(1,2);
  53.       lcd_putc("                ");
  54.       delay_ms(250);
  55.       lcd_gotoxy(1,2);
  56.       lcd_putc("        ..      ");
  57.       delay_ms(250);
  58.       set_timer1(0);
  59.       enable_interrupts(INT_RB);
  60.       enable_interrupts(INT_TIMER1);
  61.       enable_interrupts(GLOBAL);
  62.       while(1){
  63.          if(Actualizar_hora==1){
  64.             Actualiza_hora=0;
  65.             ...
  66.          }
  67.          if(Tecla_pulsada==1){
  68.             Tecla_pulsada=0;
  69.             switch(Tecla){
  70.                case 1:
  71.                ...
  72.             }        
  73.          }
  74.       }
  75. }


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

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Como configurar el timer 1 en modo contador
« Respuesta #16 en: 09 de Octubre de 2009, 20:54:22 »
Suky probe tu código estan blandos lo pulsadores estan que vuelan y fíjate que debujeando en proteus actualiza la hora cada un segundo exacto pero en la proto sigue = asique concluyo o que mi crystal se corrio de frecuencia o algo pero que el programa esta bien adjunto la imagen de proteus,Saludos  ;-)




Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como configurar el timer 1 en modo contador
« Respuesta #17 en: 09 de Octubre de 2009, 22:21:07 »
Te he convencido  :mrgreen: Con respecto al hardware real, mmm.. lo has conectado como indica el datasheet, lo mas cerca posible del PIC?
No contesto mensajes privados, las consultas en el foro

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Como configurar el timer 1 en modo contador
« Respuesta #18 en: 10 de Octubre de 2009, 00:40:25 »
Mira amigo Suky nunca use la directiva del priority pero supongo que acepté lo de las banderas porque se trata solo de if en el programa principal por eso quise meter dentro de la interrupción del timer el cálculo de la hora por ejemplo,porque no se puede controlar la carga del contador de programa;ej: en la función Mi_Hora estando en el programa principal q pasaba si se interrumpia por timer justo cuando el pc estuviese apuntando despues de la primera instrucción?:se hubiera ignorado el incremento del contador de segundos lo cual hubiera redundado en una perdida de tiempo ya que el registro MomentoActual seguiria operando con el valor previo a la interrupción,por eso a veces hago largas las interrupciones porque de alguna manera me sirve para ``controlar´´ el pc.Saludos.  ;-)

PD:No cambia lo ponga cerca o mas lejos para mi es el cristal de  4MHz que esta corrido para arriba porque adelanta y no atrasa vi la hoja de datos como me dijiste la lei con dificultad ya que odio el english y lo único que dice es q van de 33pf pero habla de LP y no se si estara hablando para este caso (yo uso 2 de 27 pf no creo q haya gran diferencia =) asique yo esperaria que atrasara y no que adelantara.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como configurar el timer 1 en modo contador
« Respuesta #19 en: 10 de Octubre de 2009, 12:31:28 »
Hola.

El cristal, al que se refiere Suky, debe ser de 32k768Hz. El de 4MHz es el cristal para el oscilador principal, el otro es para el oscilador secundario para el Timer1 (T1OSI - T1OSO).

Saludos
« Última modificación: 10 de Octubre de 2009, 12:35:02 por MLO__ »
El papel lo aguanta todo

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Como configurar el timer 1 en modo contador
« Respuesta #20 en: 10 de Octubre de 2009, 13:49:31 »
Da igual  :mrgreen: alguno o los dos estan corridos para arriba y ¿porque debe estar lo más cerca posible?  :shock: ,¿Coincidimos en esto?: el clock envia un flanco asc cada 1/32768 s si esto es cierto y si tengo algún error en el programa tiene que retrasar no adelantar,no se voy a ver si consigo mejores cristales y sino pasare al DS1307 y espero tener mejor suerte.