Autor Tema: Matriz LED 3x5 con PIC CCS  (Leído 305 veces)

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

Desconectado marcoscab1166

  • PIC12
  • **
  • Mensajes: 52
Matriz LED 3x5 con PIC CCS
« en: 28 de Octubre de 2018, 22:18:55 »
Hola, tengo un proyecto en el que necesito poder apagar y encender unos leds que se componen de 3 filas de 5 leds cada una. Probe con muchos metodos pero no consigo hacer que funcione. Y los codigos que busque por internet estan mas orientados a mostrar formas o letras en matrices leds, no a encenderlos  individualmente.
Si alguno me puede ayudar se lo agradezco.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3262
    • Pinballsp
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #1 en: 28 de Octubre de 2018, 23:32:12 »
 
¿ Y cual es exactamente el problema ?, es algo muy sencillo.

Conectas las filas, con ánodo o cátodo común, activas el puerto de la fila, que podrías barrer en un bucle for, y activas los puertos de cada uno de los 5 leds.

Puedes guardar las secuencias en arrays, para un barrido fácil con bucles for. Yo ahora estoy programando una aplicación que maneja dos matrices Led de 8x8 RGB y una placa adicional con leds SMD 1206 controlados en matriz de 6x6.

El planteamiento es simple; cargas el estado de los Led en un array, y con un timer vinculado a una interrupción dejas que una rutina encienda los Led periódicamente. En el programa principal, manejas el estado de los led, en mi caso eso depende de unas señales externas que vienen de una máquina, con un bus de datos de 8 bits, y 6 lineas que determinan las filas. Si quieres encender secuencias fijas, guardalas en un array.

Si las filas son de cátodo común, metes un ULN2803 y a correr, las columnas directas al microcontrolador.

Desconectado marcoscab1166

  • PIC12
  • **
  • Mensajes: 52
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #2 en: 30 de Octubre de 2018, 23:35:07 »
Entiendo, pero tendria algunos problemas con lo que me sugeris.
Primero, para hacerlo con un ULN tendria que usar uno por cada fila de leds, y no lo veo muy practico que digamos. La idea de este proyecto es simplificar un diseño anterior y ahorrar componentes.
Por el momento tengo este bucle que funciona:
Código: [Seleccionar]
void set_leds(){
      if(s==6){
         s=0;
         a++;
         for(i=0;i<3;i++){
            output_low(PIN_D0+i);
         }
         for(i=0;i<5;i++){
            output_high(PIN_D3+i);
         }
      }
      if(a==3){
         a=0;
      }
      output_high(PIN_D0+a);
      if(s<=4){
         output_bit(PIN_D3+s, !led_state[(a*5)+s]);
      }
      s++;
}

El codigo lo que hace es manejar los pines segun los estados de la variable led_state[]. Las filas las voy cambiando con la variable 'a' y las columnas con la variable 's'.
Cada vez que se llama a la funcion va caminando por la variable 's' encendiendo o apagando los pines D3-D7, y tiene una de las filas encendidas, que son los pines D0-D2.
Cuando termina de switchear la fila pasa a la siguiente y asi sucesivamente.
El problema es que llamar a esta funcion todo el tiempo hace muy lento el proceso. Se nota demasiado la transicion entre el encendido y apagado de los leds.
Intente poner la funcion en la interrupcion del timer 0 pero no funciona, me tira el error "Interrupt disabled to prevent recall". Creo que es xq en otra parte del codigo uso el Timer 1 para medir el tiempo de adquisicion en el modulo Comparador, y como apaga y enciende esa interrupcion no me deja usar la del Timer 0. La verdad eso no termino de entenderlo bien.
Cualquier sugerencia se agradece.

Desconectado Eduardo2

  • PIC16
  • ***
  • Mensajes: 107
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #3 en: 31 de Octubre de 2018, 01:11:16 »
...Primero, para hacerlo con un ULN tendria que usar uno por cada fila de leds, y no lo veo muy practico que digamos. La idea de este proyecto es simplificar un diseño anterior y ahorrar componentes.

No se trata de practicidad sino de la corriente que manejará el puerto, si es mayor de la que soporta, pues hace falta un driver.

Si de la matriz de leds solo puede estar encendido uno, pues no hará falta el ULN, pero si pueden estar encendido todos o casi todos, probablemente si.


Citar
....El codigo lo que hace es manejar los pines segun los estados de la variable led_state[]. Las filas las voy cambiando con la variable 'a' y las columnas con la variable 's'.
Cada vez que se llama a la funcion va caminando por la variable 's' encendiendo o apagando los pines D3-D7, y tiene una de las filas encendidas, que son los pines D0-D2.
Cuando termina de switchear la fila pasa a la siguiente y asi sucesivamente.

Eso es ineficiente , además necesita mucha mas corriente para brillar decentemente pues su ciclo de trabajo es de 1/15
En un multiplexado normal no se barren filas y columna , solo filas (ciclo de trabajo 1/3)
Y si solo se activara de a un led por vez ni haría falta el multiplexado.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3262
    • Pinballsp
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #4 en: 31 de Octubre de 2018, 01:25:01 »
Entiendo, pero tendria algunos problemas con lo que me sugeris.
Primero, para hacerlo con un ULN tendria que usar uno por cada fila de leds, y no lo veo muy practico que digamos.

La idea de este proyecto es simplificar un diseño anterior y ahorrar componentes.

No señor, un ULN2803, tiene 8 salidas, basta un chip para las 3 filas. Y si no te convence, usa transistores, pero el ahorro económico será mínimo y te complica algo más el circuito, mejor poner un chip que tres transistores y sus correspondientes resistencias de base.

Si solo vas a encender un led a la vez, entonces directo al pin del microcontrolador, sin ULN.

Citar
El problema es que llamar a esta funcion todo el tiempo hace muy lento el proceso. Se nota demasiado la transicion entre el encendido y apagado de los leds.
Intente poner la funcion en la interrupcion del timer 0 pero no funciona, me tira el error "Interrupt disabled to prevent recall". Creo que es xq en otra parte del codigo uso el Timer 1 para medir el tiempo de adquisicion en el modulo Comparador, y como apaga y enciende esa interrupcion no me deja usar la del Timer 0. La verdad eso no termino de entenderlo bien.
Cualquier sugerencia se agradece.

No me extraña que funcione a pedales, si cada llamada a esa función solo enciende un led, en vez de encender todos los led de una fila (los que toque encender, pero de una fila completa).

Prueba con este código, y trata de configurar una interrupción controlada por un timer para llamar a la función, así el encendido será independiente del resto de procesos del programa.

Código: C++
  1. // Variables globales
  2. int fila = 0;
  3.  
  4. //************************************************
  5. //**** Barrido matriz led 3 filas, 5 columnas ****
  6. //************************************************
  7. void set_leds()
  8. {
  9.     // Apaga filas
  10.     output_low(PIN_D0 + 0);
  11.     output_low(PIN_D0 + 1);
  12.     output_low(PIN_D0 + 2);
  13.  
  14.     // Enciende leds fila activa
  15.     for (i = 0; i < 5; i++)
  16.     {
  17.         output_bit(PIN_D3 + i, !led_state[(fila * 5) + i]);
  18.     }
  19.  
  20.     // Enciende fila activa
  21.     output_high(PIN_D0 + fila);
  22.  
  23.     // Incrementa fila
  24.     fila++; // Fila 0, 1, 2
  25.     if (fila == 3) fila = 0;
  26. }


« Última modificación: 31 de Octubre de 2018, 01:32:48 por planeta9999 »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3262
    • Pinballsp
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #5 en: 31 de Octubre de 2018, 02:22:17 »
 
Si solo vas a encender un led a la vez, como sería por ejemplo en el diseño de una ruleta, puedes usar el Charlieplexing. Con unos pocos pines, sin multiplexado, ni electrónica adicional, puedes controlar todos los led.

Aún así, tu código fuente es muy poco eficiente.



Desconectado marcoscab1166

  • PIC12
  • **
  • Mensajes: 52
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #6 en: 31 de Octubre de 2018, 06:22:30 »
Entiendo, pero tendria algunos problemas con lo que me sugeris.
Primero, para hacerlo con un ULN tendria que usar uno por cada fila de leds, y no lo veo muy practico que digamos.

La idea de este proyecto es simplificar un diseño anterior y ahorrar componentes.

No señor, un ULN2803, tiene 8 salidas, basta un chip para las 3 filas. Y si no te convence, usa transistores, pero el ahorro económico será mínimo y te complica algo más el circuito, mejor poner un chip que tres transistores y sus correspondientes resistencias de base.

Si solo vas a encender un led a la vez, entonces directo al pin del microcontrolador, sin ULN.

Citar
El problema es que llamar a esta funcion todo el tiempo hace muy lento el proceso. Se nota demasiado la transicion entre el encendido y apagado de los leds.
Intente poner la funcion en la interrupcion del timer 0 pero no funciona, me tira el error "Interrupt disabled to prevent recall". Creo que es xq en otra parte del codigo uso el Timer 1 para medir el tiempo de adquisicion en el modulo Comparador, y como apaga y enciende esa interrupcion no me deja usar la del Timer 0. La verdad eso no termino de entenderlo bien.
Cualquier sugerencia se agradece.

No me extraña que funcione a pedales, si cada llamada a esa función solo enciende un led, en vez de encender todos los led de una fila (los que toque encender, pero de una fila completa).

Prueba con este código, y trata de configurar una interrupción controlada por un timer para llamar a la función, así el encendido será independiente del resto de procesos del programa.

Código: C++
  1. // Variables globales
  2. int fila = 0;
  3.  
  4. //************************************************
  5. //**** Barrido matriz led 3 filas, 5 columnas ****
  6. //************************************************
  7. void set_leds()
  8. {
  9.     // Apaga filas
  10.     output_low(PIN_D0 + 0);
  11.     output_low(PIN_D0 + 1);
  12.     output_low(PIN_D0 + 2);
  13.  
  14.     // Enciende leds fila activa
  15.     for (i = 0; i < 5; i++)
  16.     {
  17.         output_bit(PIN_D3 + i, !led_state[(fila * 5) + i]);
  18.     }
  19.  
  20.     // Enciende fila activa
  21.     output_high(PIN_D0 + fila);
  22.  
  23.     // Incrementa fila
  24.     fila++; // Fila 0, 1, 2
  25.     if (fila == 3) fila = 0;
  26. }




Mil gracias, hoy sin falta lo pruebo.
Y si, los leds pueden encender todos a la vez, así que voy a usar el ULN nomás.
En cuanto a lo que había planteado sobre ejecutar la rutina con un timer, resulta que el error estaba en que no puedo prender o apagar pines en una interrupción.
Igualmente cálculo que con el código que me pasaste pueda ejecutarlo en el main sin problemas.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3262
    • Pinballsp
Re:Matriz LED 3x5 con PIC CCS
« Respuesta #7 en: 31 de Octubre de 2018, 11:01:53 »
En cuanto a lo que había planteado sobre ejecutar la rutina con un timer, resulta que el error estaba en que no puedo prender o apagar pines en una interrupción.

La primera vez que leo algo así. El problema será otro, ese seguro que no, no hay ninguna relación entre una interrupción y el encendido/apagado de un puerto (que yo sepa).


 

anything