Autor Tema: dudas con matriz de leds  (Leído 3066 veces)

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

Desconectado Garbanzo

  • PIC10
  • *
  • Mensajes: 13
dudas con matriz de leds
« en: 15 de Julio de 2016, 03:55:07 »
Saludos a todos
Soy algo novato programando solo e realizado algunos programas y hace poco me anime a fabricarme una matriz de 5x5
con los leds que solo tenia guardados y no usaba y asi aprender a programar las matrices e ir subiendo el tamaño de la matriz conforme
aprenda.

Realice mi primer programa de matrices y como es normal me surgieron varias dudas. El programa consiste en que cada vez que
presione un botón aparezcan de una a una las letras del típico "hola mundo" para esto use el timer 0 como contador
para registrar los pulsos del botón y una condición switch con cada una de las letras no se si me explico adjunto mi código en CCS

Mis dudas son las siguientes de antemano gracias por responder :)

1.- La simulación en proteus funciona bien pero el CCS al compilar me dice que en algunas lineas de código no tendrán efecto si embargo
sin esas lineas de código la simulación no funciona en proteus me podrían explicar porque?

2.-Quisiera que por favor me explicaran como podría hacer para que en vez de usar un botón las letras se desplazaran

3.-si me pudieran decir si de la manera en que lo hice me complique demasiado y se podría hacer de otra manera?

 - Adjunto no válido -

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:dudas con matriz de leds
« Respuesta #1 en: 15 de Julio de 2016, 04:16:23 »
1- Deberias Copiar y pegar el codigo ( el hex no sirve de nada), y tambien decir que lineas son las que te dice el compilador que no tienen sentido.

2- Deberias pensarlo primero como un array  5x5 bits cada letra, es decir la H es un array 5x5 la o tiene su propio array 5x5 , para desplazarlo en ves de mostrar los 5x5 de la letra H, mostras 4 columnas de las 5 de la letra H, columna 1 a 4, y mostras la columna 0 de la letra "o", luego en la proxima actualizacion, deberias mostrar de 2 a 4 de la "H" y de 0 a 1 de la letra "o".
Y asi es como va ingresando esa letra. Cuando ocupe los 5x5, se comienza con otra letra.

3- Si se puede hacer otra manera que cosa? Todo el programa ?

Si, trata primero de implementar el desplazamiento con el boton, es decir cada ves que presiones el boton, se desplaza 1 lugar a la izquierda todos los leds. Luego cuando tengas esto armado, podes usar un timer, que cada ves que el timer produzca el overflow active un flag para que actualize los leds a su nuevo valor.

Desconectado Garbanzo

  • PIC10
  • *
  • Mensajes: 13
Re:dudas con matriz de leds
« Respuesta #2 en: 16 de Julio de 2016, 03:50:58 »
hola gracias por responder este es mi código marque las lineas que el CCS dice no tendrán efecto pero sin esas lineas no funciona

#include <18f452.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=8M)
#byte porta=0xf80
#byte trisa=0xf92
#byte portb=0xf81
#byte trisb=0xf93

int sw;
void main()
{

set_tris_a(0b00010000);
set_tris_b(0b00000000);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
set_timer0(0);

while(true)
{
sw=get_timer0();
switch(sw)
{
case 1: sw==1; //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 2: sw==2;  //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 3: sw==3; //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 4: sw==4;  //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111010);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111010);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b010001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 5: sw==5;  //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b010000);
        delay_ms(1);
        break;
case 6: sw==6;  //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b110000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b110000);
        delay_ms(1);
        break;
case 7: sw==7; //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b010000);
        delay_ms(1);
        break;
case 8: sw==8;   //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 9: sw==9;  //esta linea no tendra efecto
        output_b(0b00000001);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;

}
if(sw==10)
{
set_timer0(0);
}
}
}
lo que dice que no tendrá efecto son todos los sw==0,1,2,3.4.5.......

Otra cosa también trate de hacerlo con el timer 1 en vez del timer 0 declare todo lo del timer 1 su configuración y el puerto del
pic donde esta todo bien conectado en la simulación y revisado varias veces pero simplemente nunca funciono con timer 1
por que podrá ser?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:dudas con matriz de leds
« Respuesta #3 en: 16 de Julio de 2016, 11:42:42 »
Acerca del Timer 0 o Timer 1, seguramente no lo configuraste correctamente.

Respecto a las lineas que no tienen efecto:

Código: C
  1. switch(sw)
  2. {
  3.   case 1: sw==1; //esta linea no tendra efecto


Cuando haces el switch de sw, supongamos que tiene el valor 1, va a entrar en cada caso a segun lo que tengas definido el case, es decir ese case 1:

Lo que sigue seria una instruccion y no influye en nada donde este ubicado, seria como poner:

Código: C
  1. case 1:
  2.         sw==1; //esta linea no tendra efecto
  3.         output_b(0b00000001);

Ahora esa linea es una comparacion, es sw igual a 1? SI lo es, y por eso entro antes a ese case, pero esa comparacion te devuelve un TRUE o FALSE, que no se usa en nada por lo tanto es obvio que esa linea no tiene sentido. Y que espero que veas cual es el porque. Con el case solamente basta.

En ves de usar esto:

Código: C
  1. if(sw==10)
  2. {
  3. set_timer0(0);
  4. }

podrias usar el default del switch

Código: C
  1. switch(sw)
  2. {
  3. case 1:
  4.         // Instrucciones aca
  5.         break;
  6. case 2:
  7.         // Instrucciones aca
  8.         break;
  9. case 3:
  10.         // Instrucciones aca
  11.         break;
  12. case 4:
  13.         // Instrucciones aca
  14.         break;
  15. case 5:
  16.         // Instrucciones aca
  17.         break;
  18. default:
  19.         // Aca entra cuando no se cumple NINGUNO de los anteriores case, es decir para el sw >= 6 en este ejemplo
  20.         break;


PD: Si usas arrays, tu programa se vuelve mucho mas corto. Me refiero a hacer un array de estas dimensiones [9][5] e int8, en resumen :

Código: C
  1. int8 Valores[9][5]=
  2.                            {
  3.                                {x,x,x,x,x},
  4.                                {x,x,x,x,x},
  5.                                {x,x,x,x,x},
  6.                                {x,x,x,x,x},
  7.                                {x,x,x,x,x}
  8.                            };

Donde las x serian los valores en binario. Ejemplo usando tu case igual a 1 ( 0 en el array ): {0b010000, 0b111011,0b111011,0b010000,0b111111},

Desconectado Garbanzo

  • PIC10
  • *
  • Mensajes: 13
Re:dudas con matriz de leds
« Respuesta #4 en: 17 de Julio de 2016, 01:42:09 »
Gracias ya lo intente quitando las lineas e sw==1,2,3,4...etc  y use el default al final del switch y funciono perfecto
y lo del array para que las letras se desplacen lo estoy llevando a cabo solo que ahora tengo problemas con el efecto
rebote del botón en la prueba física que utilizo para cambiar las letras lo que sucede es que cada vez que se presiona
el botón cambia dos letras en lugar de solo una este es mi código hasta ahora

#include <18f452.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=8M)
#byte porta=0xf80
#byte trisa=0xf92
#byte portb=0xf81
#byte trisb=0xf93

int sw;
void main()
{

set_tris_a(0b00010000);
set_tris_b(0b00000000);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
set_timer0(0);

while(true)
{
sw=get_timer0();
;
switch(sw)
{
case 0:
output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 1:
        output_b(0b00000001);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 2:
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 3:
        output_b(0b00000001);
        output_a(0b010001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111010);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111010);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b010001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 4: output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b010000);
        delay_ms(1);
        break;
case 5:
        output_b(0b00000001);
        output_a(0b110000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b011111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b110000);
        delay_ms(1);
        break;
case 6:
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b111101);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b111011);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110111);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b010000);
        delay_ms(1);
        break;
case 7:
        output_b(0b00000001);
        output_a(0b010000);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
case 8:
        output_b(0b00000001);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00000010);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00000100);
        output_a(0b011110);
        delay_ms(1);
        output_b(0b00001000);
        output_a(0b110001);
        delay_ms(1);
        output_b(0b00010000);
        output_a(0b111111);
        delay_ms(1);
        break;
default:set_timer0(0);
        break;

}
}
}

es lo mismo solo sin las lineas de sw y con el default en otros programas arregle el efecto rebote con un delay
pero en este programa ya lo intente y no se quita el efecto de que manera podría hacerlo?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:dudas con matriz de leds
« Respuesta #5 en: 17 de Julio de 2016, 04:23:27 »
para no complicarte cno el programa por ahora, busca "circuito antirebote" por google, y seguro que vas a dar con un circuito y el switch. Usualemtne con una resistencia + condensador.

Desconectado Garbanzo

  • PIC10
  • *
  • Mensajes: 13
Re:dudas con matriz de leds
« Respuesta #6 en: 22 de Julio de 2016, 04:04:40 »
hola ya realize lo del circuito antirrebote funciono bien, gracias
Estos días e estado intentando hacer la matriz ahora con un timer para que las letras aparezcan solas una por una
intente hacerlo con arrays como aconsejaste pero no funciono jamas aparecían las letras termine usando un byte const [8]
y asi si funciono saque una carita feliz en una matriz 8x8 este es mi codigo:

#include <18f452.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=4M)
#byte portd=0xf83
#byte trisd=0xf95
#byte portb=0xf81
#byte trisb=0xf93
int cuenta,sw;
byte const fila[8]={0b11110111,
                 0b11101111,
                 0b11011111,
                 0b10110001,
                 0b10111111,
                 0b11010001,
                 0b11101111,
                 0b11110111};
#int_timer1
void timer_1()
{
cuenta++;
if(cuenta==4)
{
sw=sw+1;
cuenta=0;
}
set_timer1(3036);
}




void main()
{
set_tris_b(0b00000000);
set_tris_d(0b00000000);
setup_timer_1(t1_internal|t1_div_by_8);
set_timer1(3036);  //valor cargado en timer para .5 segundos
enable_interrupts(int_timer1);
enable_interrupts(global);

switch(sw)
{
case 0: output_d(0b00000001);
      output_b(fila[0]);
      delay_ms(1);
      output_d(0b00000010);
      output_b(fila[1]);
      delay_ms(1);
      output_d(0b00000100);
      output_b(fila[2]);
      delay_ms(1);
      output_d(0b00001000);
      output_b(fila[3]);
      delay_ms(1);
      output_d(0b00010000);
      output_b(fila[4]);
      delay_ms(1);
      output_d(0b00100000);
      output_b(fila[5]);
      delay_ms(1);
      output_d(0b01000000);
      output_b(fila[6]);
      delay_ms(1);
      output_d(0b10000000);
      output_b(fila[7]);
      delay_ms(1);
}
while(true)
{
}

}

explico lo que trate de hacer
configure el timer 1 para que tuviera un periodo de .5 segundos y cree la variable "cuenta" para que aumentara su valor
en 1 con cada desborde del timer y cuando la variable cuanta llegara a 4 se resetea a 0 y vuelve a contar
 lo que me da un periodo del timer de 2 seg. despues use la variable sw que aumenta su valor cada vez que la variable cuenta
es =4 osea cada 2 segundos aumenta su valor en uno
y al final use un switch para sw que en el caso 0 me mostrara la carita feliz mientras sw==0 osea por 2 segundos hasta que
sw valiera 1 y quitara la carita feliz y mostrara otra cosa en el case 1
lo que sucede es que muestra la carita feliz pero solo es un parpadeo apenas y se ve pero segun yo deberia estar por 2 segundos
no se cual pueda ser mi error espero haberme explicado
gracias por sus respuestas

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:dudas con matriz de leds
« Respuesta #7 en: 22 de Julio de 2016, 12:39:31 »
Es por que no pusiste el switch, dentro del while, entonces se ejecuta una sola ves ese switch.

-------------------


byte const fila[8] es un array de 8 variables de 8bits ubicados en la flash.

el byte es lo mismo que poner int8
el const, EN ESTE CASO lo unico que hace es ponerlo en la FLASH, por lo cual no se puede modificar los valores, sin el const va a la RAM