Autor Tema: Strobe Light 7 segmentos  (Leído 1648 veces)

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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Strobe Light 7 segmentos
« en: 08 de Octubre de 2009, 15:11:08 »
Hola a todos,

estoy tratando de hacer un strobe light, la duda me surge a la hora de generar los pulsos, ya que utilizo tmr0 como contador exterior, y tmr1 visualizador de las rpm en los display.

Todo va bien si uso un pulso exterior, muestra los dígitos desde 1Hz (60rpm) hasta 166Hz(9960).

Lo que quiero saber, es

si es posible generar algún pulso exterior con el timer 2 que queda, y con éste, activar una salida y que vaya contando los pulsos internamente?

o sería mejor usar un generador de pulso externo?

Os muestro el code

Gracias de antemano, un saludo a todos

Código: C
  1. #include <16f876.h>
  2. #fuses XT, NOPROTECT, NOPUT,NOWDT,NOBROWNOUT, NOLVP
  3. #use delay(clock=1000000)
  4.  
  5. #use fast_io(c)
  6. #use fast_io(b)
  7.  
  8. #byte portb = 0x06
  9. #byte portc = 0x07
  10.  
  11. int numeros[10]={0b00111111,0b00000110,          
  12.                  0b01011011,0b01001111,
  13.                  0b01100110,0b01101101,
  14.                  0b01111101,0b00000111,
  15.                  0b01111111,0b01100111};
  16.  
  17.  
  18. unsigned int16 pulsocuenta=0;
  19. unsigned int8 u,d,c,m;
  20.  
  21.  
  22. #int_TIMER1
  23.    void timer1_isr(){
  24.  
  25.       pulsocuenta=get_timer0();
  26.       pulsocuenta=(pulsocuenta/2)*60;
  27.  
  28.        m= pulsocuenta/1000;
  29.        c=(pulsocuenta%1000)/100;
  30.        d=((pulsocuenta%1000)%100)/10;
  31.        u=((pulsocuenta%1000)%100)%10;
  32.  
  33.       set_timer0(0);
  34.       set_timer1(3036);
  35.   }
  36.  
  37. void main(void){
  38.  
  39.    set_tris_b(0x00);
  40.    set_tris_c(0x00);
  41.  
  42.  
  43.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  44.    setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
  45.  
  46.    enable_interrupts(int_TIMER1);
  47.    enable_interrupts(int_TIMER0);
  48.    enable_interrupts(global);
  49.    set_timer1(3036);
  50.    set_timer0(0);
  51.  
  52. while(1){
  53.  
  54.    portb = 0x00;
  55.    portb=numeros[u];
  56.    portc = 0b01110000;
  57.    delay_ms(5);
  58.    portb = 0x00;
  59.    portb=numeros[d];
  60.    portc = 0b10110000;
  61.    delay_ms(5);
  62.    portb = 0x00;
  63.    portb=numeros[c];
  64.    portc = 0b11010000;
  65.    delay_ms(5);
  66.    portb = 0x00;
  67.    portb=numeros[m];
  68.    portc = 0b11100000;
  69.    delay_ms(5);
  70.   }
  71. }

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Strobe Light 7 segmentos
« Respuesta #1 en: 09 de Octubre de 2009, 19:07:53 »
He realizado algunos cambios, ahora con timer0 y timer2, llevo la conversión de pulsos a displays. Eso funciona bien, ahora con el timer1, lo que trato de hacer es generar los pulsos y con int_ext en rb0, preselecciono los pulsos que quiero, es decir, preseleccionar las rpm.

Avanzando el programa poco a poco en proteus, se ve como voy decrementando para aumentar de RPM en la variable psel, pero el generador de pulsos con el timer1 se queda en 1Hz, y no soy capaz de que se incremente..

Uniendo el pin de salida de los pulsos generados con timer1 y el pin que los recoje en timer0, es como hago para pasar a display, pero se podría hacer internamente?

Creo que lo tengo un poco lioso, alguna idea?

Nuevamente, Gracias.

Un saludo.

Código: C
  1. int numeros[10]={0b01111110,0b00001100,
  2.                  0b10110110,0b10011110,
  3.                  0b11001100,0b11011010,
  4.                  0b11111010,0b00001110,
  5.                  0b11111110,0b11001110};
  6.  
  7.  
  8. unsigned int16 pulsocuenta=0;
  9. unsigned int8 u,d,c,m;
  10. int16 cont=0;
  11. int cont2=0;
  12.  
  13.  
  14.  
  15. int psel=1;
  16. int cont1=1;
  17.  
  18.  
  19.  
  20. #int_TIMER2
  21.    void timer2_isr(){
  22.  
  23.   cont++;
  24.          if (cont==977){
  25.             cont2++;
  26.             if (cont2==2){
  27.  
  28.     pulsocuenta=get_timer0();
  29.      pulsocuenta=(pulsocuenta)*60;
  30.  
  31.        m= pulsocuenta/1000;
  32.        c=(pulsocuenta%1000)/100;
  33.        d=((pulsocuenta%1000)%100)/10;
  34.        u=((pulsocuenta%1000)%100)%10;
  35.  
  36.       set_timer0(0);
  37.       set_timer2(255);
  38.       cont2=0;
  39.   }
  40.  
  41.  cont=0;
  42. }}
  43.  
  44. #int_EXT                                           //por cada pulso que recibo en el pin b0, decremento la preselección y aumento rpm
  45. void ext_isr()
  46. {
  47. psel--;
  48. delay_ms(150);
  49. if (psel==0) psel=166;
  50. }
  51.  
  52. #int_TIMER1                                                                             //que cuente hasta la preselección y salga el pulso por pin c0??
  53. void timer1_isr(){
  54. cont1++;
  55. if (cont1==167) cont1=1;
  56.  
  57.      if (cont1==psel)
  58.        {
  59.        output_toggle(pin_c0);
  60.        cont1=1;
  61.        
  62.        set_timer1(64000);
  63.        }
  64. }
  65.  
  66. void main(void){
  67.  
  68.    set_tris_b(0b00000001);
  69.    set_tris_c(0x00);
  70.  
  71.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  72.    setup_timer_2(T2_DIV_BY_1,255,1);
  73.    setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);
  74.  
  75.    enable_interrupts(int_TIMER1);
  76.    enable_interrupts(int_TIMER0);
  77.    enable_interrupts(int_TIMER2);
  78.    enable_interrupts (int_ext);
  79.    ext_int_edge(L_TO_H);
  80.    enable_interrupts(global);
  81.    
  82.    
  83.    set_timer1(64000);
  84.  
  85.    set_timer2(255);
  86.    set_timer0(0);