Autor Tema: Problema al multiplexar leds  (Leído 3257 veces)

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

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Problema al multiplexar leds
« en: 19 de Marzo de 2007, 16:29:12 »
Hola a todos

Soy novato y tengo un problema al multiplexar 6 leds.Ya he utilizado la formula para el desbordamiento del timer0 pero no me funciona.He pensado que con un desbordamiento de 5ms estaria bien, pero no me va.Ni siquiera me llaga a verse todos encendidos con el tipico parpadeo de cuando le falta algo de velocidad.Como he visto que con los datos obtenidos no me funcionaba he probado con muchas configuraciones distintas de preescaler y carga pero nada.

Alguien puede ayudarme?

Gracias por adelantado  :) :)

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Re: Problema al multiplexar leds
« Respuesta #1 en: 19 de Marzo de 2007, 16:45:21 »
Perdon que no doy datos que son importantes.El oscilador que utilizo es de 8Mhz y el pic es el 18F4620

Muchas gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Problema al multiplexar leds
« Respuesta #2 en: 19 de Marzo de 2007, 16:57:58 »
Holas barg.
Postea el código que le echemos un vistazo y si puedes explicar por encima como tienes conectados los leds,mejor.

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Re: Problema al multiplexar leds
« Respuesta #3 en: 19 de Marzo de 2007, 17:27:32 »
Bueno, os mando el trozo de codigo que no me funciona.Se trata de una serie de semaforos que estan conectados al pic de la siguiente forma.Como son muchos y no se disponen de suficientes patillas para todos los leds, lo primero que he hecho es dividir los 12 semaforos en dos grupos de 6(los que hay en cada sentido).Para utilizar menos patillas he utilizado demultiplexoser de forma que utilizo tres patillas para la seleccion de la salida y otras tres (una para color) para el encendido de los leds(utilizo tres patillas para cada grupo de semaforo pero las mismas señales de seleccion).

#include <18f4620.h>
#use delay(clock=8000000)
#fuses XT,INTRC_IO,NOPUT,NOBROWNOUT,NOWDT,NOLPT1OSC,NOCPB,NOCPD
#fuses NOWRT,NOPBADEN,NOMCLR,NOSTVREN,NODEBUG,NOPROTECT,NOLVP
#use fast_io(B)
#use fast_io(D)

#byte PORTB = 0xF81
#byte PORTD = 0xF83

#bit SEL1 = 0xF81.0
#bit SEL2 = 0xF81.1
#bit SEL3 = 0xF81.2

#bit V_DER = 0xF81.3
#bit A_DER = 0xF81.4
#bit R_DER = 0xF81.5

#bit V_IZQ = 0xF83.5
#bit A_IZQ = 0xF83.6
#bit R_IZQ = 0xF83.7

boolean S01v,S01a,S01r,S02v,S02a,S02r,S03v,S03a,S03r,S04v,S04a,S04r;   //variables que modifico y que posteriormente
boolean S05v,S05a,S05r,S06v,S06a,S06r,S07v,S07a,S07r,S08v,S08a,S08r;   // iran a las entradas de los demultiplexoser
boolean S09v,S09a,S09r,S10v,S10a,S10r,S11v,S11a,S11r,S12v,S12a,S12r;
int con;

#int_Timer0
void IntTM0 ()
{
   switch (con) {                                                                         
      case 0:  SEL1 = 0; SEL2 = 0; SEL3 = 0;                                //selecciona el semaforo 1
                   V_DER = S01v; A_DER = S01a; R_DER = S01r;        //pone en los puertos los valores que deben tener los leds 
                   V_IZQ = S02v; A_IZQ = S02a; R_IZQ = S02r;
                   break;
      case 1:  SEL1 = 0; SEL2 = 0; SEL3 = 1;                               //selecciona el semaforo 2
                   V_DER = S03v; A_DER = S03a; R_DER = S03r;
                   V_IZQ = S04v; A_IZQ = S04a; R_IZQ = S04r;
                   break;
      case 2:  SEL1 = 0; SEL2 = 1; SEL3 = 0;                              //selecciona el semaforo 3
                   V_DER = S05v; A_DER = S05a; R_DER = S05r;
                   V_IZQ = S06v; A_IZQ = S06a; R_IZQ = S06r;
                   break;
      case 3:  SEL1 = 0; SEL2 = 1; SEL3 = 1;                             //selecciona el semaforo 4
                   V_DER = S07v; A_DER = S07a; R_DER = S07r;
                   V_IZQ = S08v; A_IZQ = S08a; R_IZQ = S08r;
                   break;
      case 4:  SEL1 = 1; SEL2 = 0; SEL3 = 0;                              //selecciona el semaforo 5
                   V_DER = S09v; A_DER = S09a; R_DER = S09r;
                   V_IZQ = S10v; A_IZQ = S10a; R_IZQ = S10r;
                   break;
      case 5:  SEL1 = 1; SEL2 = 0; SEL3 = 1;                               //selecciona el semaforo 6
                   V_DER = S11v; A_DER = S11a; R_DER = S11r;
                   V_IZQ = S12v; A_IZQ = S12a; R_IZQ = S12r;
                   break;
   };
   if (con==5){
      con = 0;
   } else {
      con++;
   };
}

void main ()
{
   set_tris_B(0b00000000);      //puerto B como salida
   set_tris_D(0b00000000);      //puerto D como salida
     
   enable_interrupts(INT_TIMER0);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
   set_timer0(216);
   enable_interrupts(GLOBAL);
   
   S01v = 1; S01a = 0; S01r = 0;                     //por ahora solo he inicializado los semaforos a un valor
   S02v = 0; S02a = 0; S02r = 1;
   S03v = 0; S03a = 0; S03r = 1;
   S04v = 0; S04a = 0; S04r = 1;
   S05v = 1; S05a = 0; S05r = 0;
   S06v = 0; S06a = 0; S06r = 1;
   S07v = 1; S07a = 0; S07r = 0;
   S08v = 0; S08a = 0; S08r = 1;
   S09v = 1; S09a = 0; S09r = 0;
   S10v = 0; S10a = 0; S10r = 1;
   S11v = 1; S11a = 0; S11r = 0;
   S12v = 0; S12a = 0; S12r = 1;
   con = 1;
   
   for(;;) {   };
}


Bueno, a ver que os parece mi programa. :? Si teneis alguna duda sobre el funcionamiento no dudeis en preguntar.Gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Problema al multiplexar leds
« Respuesta #4 en: 19 de Marzo de 2007, 17:56:40 »
No haces la recarga del timer dentro de la interrupción.
Pon esto dentro de la misma,al final,para que siempre reinicie la cuenta desde el mismo punto establecido por tus calculos:

set_timer0(216);

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Re: Problema al multiplexar leds
« Respuesta #5 en: 19 de Marzo de 2007, 19:14:18 »
Muchas gracias Modulay pero no funciona.He hecho lo que me has dicho y como iba igual he cambiado los valores de preescalar y de carga pero nada.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Problema al multiplexar leds
« Respuesta #6 en: 20 de Marzo de 2007, 12:18:13 »
Parece que setup_counters no está yendo bien.He simulado este código y parece que funciona.

Código: C++
  1. #include <18f4620.h>
  2. #use delay(clock=8000000)
  3. #fuses HS,INTRC_IO,NOPUT,NOBROWNOUT,NOWDT,NOLPT1OSC,NOCPB,NOCPD
  4. #fuses NOWRT,NOPBADEN,NOMCLR,NOSTVREN,NODEBUG,NOPROTECT,NOLVP
  5. #use fast_io(B)
  6. #use fast_io(D)
  7.  
  8. #byte PORTB = 0xF81
  9. #byte PORTD = 0xF83
  10.  
  11. #bit SEL1 = 0xF81.0
  12. #bit SEL2 = 0xF81.1
  13. #bit SEL3 = 0xF81.2
  14.  
  15. #bit V_DER = 0xF81.3
  16. #bit A_DER = 0xF81.4
  17. #bit R_DER = 0xF81.5
  18.  
  19. #bit V_IZQ = 0xF83.5
  20. #bit A_IZQ = 0xF83.6
  21. #bit R_IZQ = 0xF83.7
  22.  
  23. boolean S01v,S01a,S01r,S02v,S02a,S02r,S03v,S03a,S03r,S04v,S04a,S04r;   //variables que modifico y que posteriormente
  24. boolean S05v,S05a,S05r,S06v,S06a,S06r,S07v,S07a,S07r,S08v,S08a,S08r;   // iran a las entradas de los demultiplexoser
  25. boolean S09v,S09a,S09r,S10v,S10a,S10r,S11v,S11a,S11r,S12v,S12a,S12r;
  26. int con;
  27.  
  28. #int_Timer0
  29. void IntTM0 ()
  30. {
  31.    switch (con) {                                                                        
  32.       case 0:  SEL1 = 0; SEL2 = 0; SEL3 = 0;                                //selecciona el semaforo 1
  33.                    V_DER = S01v; A_DER = S01a; R_DER = S01r;        //pone en los puertos los valores que deben tener los leds
  34.                    V_IZQ = S02v; A_IZQ = S02a; R_IZQ = S02r;
  35.                    break;
  36.       case 1:  SEL1 = 0; SEL2 = 0; SEL3 = 1;                               //selecciona el semaforo 2
  37.                    V_DER = S03v; A_DER = S03a; R_DER = S03r;
  38.                    V_IZQ = S04v; A_IZQ = S04a; R_IZQ = S04r;
  39.                    break;
  40.       case 2:  SEL1 = 0; SEL2 = 1; SEL3 = 0;                              //selecciona el semaforo 3
  41.                    V_DER = S05v; A_DER = S05a; R_DER = S05r;
  42.                    V_IZQ = S06v; A_IZQ = S06a; R_IZQ = S06r;
  43.                    break;
  44.       case 3:  SEL1 = 0; SEL2 = 1; SEL3 = 1;                             //selecciona el semaforo 4
  45.                    V_DER = S07v; A_DER = S07a; R_DER = S07r;
  46.                    V_IZQ = S08v; A_IZQ = S08a; R_IZQ = S08r;
  47.                    break;
  48.       case 4:  SEL1 = 1; SEL2 = 0; SEL3 = 0;                              //selecciona el semaforo 5
  49.                    V_DER = S09v; A_DER = S09a; R_DER = S09r;
  50.                    V_IZQ = S10v; A_IZQ = S10a; R_IZQ = S10r;
  51.                    break;
  52.       case 5:  SEL1 = 1; SEL2 = 0; SEL3 = 1;                               //selecciona el semaforo 6
  53.                    V_DER = S11v; A_DER = S11a; R_DER = S11r;
  54.                    V_IZQ = S12v; A_IZQ = S12a; R_IZQ = S12r;
  55.                    break;
  56.    }
  57.    if (con==5){
  58.       con = 0;
  59.    } else {
  60.       con++;
  61.    }
  62.    set_timer0(216);
  63. }
  64.  
  65. void main ()
  66. {
  67.    set_tris_B(0b00000000);      //puerto B como salida
  68.    set_tris_D(0b00000000);      //puerto D como salida
  69.      
  70.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_BIT);
  71.    
  72.    
  73.    S01v = 1; S01a = 0; S01r = 0;                     //por ahora solo he inicializado los semaforos a un valor
  74.    S02v = 0; S02a = 0; S02r = 1;
  75.    S03v = 0; S03a = 0; S03r = 1;
  76.    S04v = 0; S04a = 0; S04r = 1;
  77.    S05v = 1; S05a = 0; S05r = 0;
  78.    S06v = 0; S06a = 0; S06r = 1;
  79.    S07v = 1; S07a = 0; S07r = 0;
  80.    S08v = 0; S08a = 0; S08r = 1;
  81.    S09v = 1; S09a = 0; S09r = 0;
  82.    S10v = 0; S10a = 0; S10r = 1;
  83.    S11v = 1; S11a = 0; S11r = 0;
  84.    S12v = 0; S12a = 0; S12r = 1;
  85.    con = 1;
  86.    
  87.    set_timer0(216);
  88.    enable_interrupts(INT_TIMER0);
  89.    enable_interrupts(GLOBAL);
  90.    
  91.    for(;;) {  }
  92. }

Por cierto ¿estás funcionando con el oscilador interno?
Si es así deberás configurarlo con setup_oscillator( )
Para 8 MHz el fuse del tipo de cristal no es XT,debes poner HS (> 4 MHz)
« Última modificación: 20 de Marzo de 2007, 12:24:00 por Modulay »

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Re: Problema al multiplexar leds
« Respuesta #7 en: 20 de Marzo de 2007, 14:42:42 »
Muchas gracias Modulay.Ya me funciona!!!

El oscilador que utilizo es el interno pero funciona perfectamente con el setup_timer_0, con la otra sentencia me va peor.En cuanto a los del XT fue un error mio al ponerlo aqui, en el programa lo tengo bien.Eso si, he tenido que modificar los valores de preescalar y carga porque con los que tu me dabas se veia parpadear.Por lo demas, todo perfecto  :lol: :lol:
 :-/ :-/ :-/ :-/ :-/

Muchas gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Problema al multiplexar leds
« Respuesta #8 en: 20 de Marzo de 2007, 14:55:00 »
Me alegro.
Configura el oscilador.Si no me equivoco,con los valores que te he puesto la interrupción se produce cada 5 ms aproximadamente...si los has tenido que modificar seguramente sea porque tu oscilador interno no esté corriendo a 8 MHz