TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aripod en 31 de Octubre de 2006, 21:39:50

Título: Matriz de leds 5x7
Publicado por: aripod en 31 de Octubre de 2006, 21:39:50
Estoy tratando de aprender a manejar estas matrices....viendo el ejemplo de vszener , pero no tengo suerte....
Lo principal que quiero hacer es ir prendiendo de a uno los leds....

1-2-3-4-5
6-7-8-9-10
11-12..........

Lo que no me queda claro es como manejarlo....si lo imagino como una matriz para ir cambiando es facil...pero con el pic ya no lo es, ya que tengo en el pic (estoy aprendiendo con el 16f84) tal cual esta en el ejemplo con el 4028:
RA0->A
RA1->B
RA2->C
RA3->D

RB0->Fila1
RB1->Fila2
-------------------
RB6->Fila7

No entiendo como ir cambiando de de columnas si del pic salen solo 4 patas y son 5 columnas. Por ejemplo, si quiero prender el de la esquina superior izquierda, que seria el 1 tendria que poner en 0 la fila 1 y 0 en la columna 1 y todo lo demas 1, es asi?

01111111
11111111
11111111
11111111
11111111
11111111
11111111

Como manejo el tema del puerto a y b???


Espero haber sido claro.
Desde ya mil gracias por la ayuda!!

Título: Re: Matriz de leds 5x7
Publicado por: aripod en 04 de Noviembre de 2006, 17:14:53
nadie?
Título: Re: Matriz de leds 5x7
Publicado por: Astaroth_25 en 04 de Noviembre de 2006, 21:55:15
nadie?
Lo que podrias usar es un registro de desplazamiento por ejemplo el 74hc164 asi utilizar menos pines del PIC..
tendrias uno para el DATO que es el que selecciona la fila y otro pin para el clock y puedes utilizar otro para resetear el registro si asi lo requieres

Y si quieres seguir ahorrando pines puedes utilizar otro para 74hc164 para donde entra el dato que indica que columnas se van a prender...

Saludos
Bueno ahi tienes el LINK donde se trato mas a fondo sobre el tema

http://www.todopic.com.ar/foros/index.php?topic=14136.0
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 08 de Noviembre de 2006, 14:52:37
Estoy utilizando el 16f84...entonces, si conecto el puerto A a las filas, y el B a las columnas tengo justo la cantidad de pines....pero como hago para ke se prenda por ejemplo...el led de la fila 2 y columna 5? o cualkiera??
Título: Re: Matriz de leds 5x7
Publicado por: maunix en 08 de Noviembre de 2006, 15:02:27
Estoy utilizando el 16f84...entonces, si conecto el puerto A a las filas, y el B a las columnas tengo justo la cantidad de pines....pero como hago para ke se prenda por ejemplo...el led de la fila 2 y columna 5? o cualkiera??

¿Tu limitación está en el hardware o en el software?

Si es en el software, ¿qué lenguaje de programación utilizas?
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 09 de Noviembre de 2006, 19:19:26
Hard no creo, ya ke hice la conexion simple....del pic a la matriz,,pin a pin:

(http://img61.imageshack.us/img61/7324/matrizcz1.th.jpg) (http://img61.imageshack.us/my.php?image=matrizcz1.jpg)

La cosa es ke no se como controlar el prendido de los leds...

Si tengo en el puerto A las filas y en el puerto B las columnas...tendria ke ir poniendo 0 y 1 segun quiera,,,por ejemplo...si quisiera prender el led de la fila 2 y columna 3 deberia hacer:

PORTA=0b00100;
PORTB=0b00100000;

Estoy programando en C, uso el MPLAB con el compilador CC5X.
Título: Re: Matriz de leds 5x7
Publicado por: Astaroth_25 en 09 de Noviembre de 2006, 22:33:02
Ahi tienes una forma de conexion utilizando un registro de desplazamiento con el cual seleccionas la fila que se va a encender y por el PORTB sacar el dato.
Título: Re: Matriz de leds 5x7
Publicado por: maunix en 10 de Noviembre de 2006, 08:37:42
aripod, cuéntame cómo funciona esa matriz (nunca la he usado).

Cuando le pones un 1 en una columna y un 1 en una fila, ¿se enciende el led de la intersección?
Título: Re: Matriz de leds 5x7
Publicado por: vszener en 10 de Noviembre de 2006, 12:26:47
Buenas!!!! en el post de Ejemplitos en C para el 16F648A (http://www.todopic.com.ar/foros/index.php?topic=4530.0), concretamente en el número 49, hay un programa que utiliza una matriz 5x7.


Suerte!!! ;)
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 10 de Noviembre de 2006, 22:10:42
Ya baje ese ejemplo...pero no anda :(
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 10 de Noviembre de 2006, 22:24:10
Hice esto, copiando del codigo ke decis...:

Código: [Seleccionar]
void main(void)
{
TRISA=0;
TRISB=0;

int i,letra[5];
letra[0]=0b00000001;
letra[1]=0b01110110;
letra[2]=0b01110110;
letra[3]=0b01110110;
letra[4]=0b00000001;

while(1)
{
for(i=0; i<5;i++)
{
PORTA=i;
PORTB=letra[i];
delay_ms(10);
}
}
}

Pero no logro entender como es el funcionamiento de la matriz esta.
Por el puerto A ke es lo ke tengo ke enviar? y por el B?
No es ke hay ke seleccionar por el puerto A las columnas y el puerto B las filas y ya???
Título: Re: Matriz de leds 5x7
Publicado por: vszener en 11 de Noviembre de 2006, 07:31:28
Por el puerto A son las filas y por el puerto B las columnas, si vas al data sheet verás que no se puede mantener el nivel alto de columna y fila fijo, sino que hay que realizar una pausa para que sea visible, por eso es el retardo de 10ms cada vez que lanzamos parte d eun dato.


PD: Por cierto, amí el ejemplo de la matriz si me funciona, ¿has puesto todos los componentes que dice el ejemplo? en las columnas el decodificador 4028 para el barrido de las mismas.


Suerte!!! ;)
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 12 de Noviembre de 2006, 13:12:56
Porke hay ke poner ese componente para las columnas?? NO puede ser directo??
Título: Re: Matriz de leds 5x7
Publicado por: vszener en 12 de Noviembre de 2006, 15:14:42
Si puede ser directo, pero con dicho componente te ahorras pines del pic.

PD: El ejemplo está realizado con dicho componente


Suerte!!! ;)
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 12 de Noviembre de 2006, 19:14:12
Sera cuestion de seguir probando......

Ahora...para hacer una matriz...pero de pulsadores....como es el razonamiento?
Todavia no tengo bien definido cuantos son...pero,,,minimo van a ser 16.....necesitaria justo una matriz de 4x4........
No haria falta ke habra un thread para poner todas las dudas ke tengo sobre el poryecto ke estoy haciendo, es verdad?

Probe haciendo esto:

(http://img150.imageshack.us/img150/1781/teclado4x4th3.th.jpg) (http://img150.imageshack.us/my.php?image=teclado4x4th3.jpg)

Código: [Seleccionar]
#include <delay.h>
bit columna1@PORTB.7;
bit columna2@PORTB.6;
bit columna3@PORTB.5;
bit columna4@PORTB.4;
bit fila1@PORTB.3;
bit fila2@PORTB.2;
bit fila3@PORTB.1;
bit fila4@PORTB.0;

bit led@PORTA.2;

void main(void)
{
TRISA=0;
TRISB=0b11110000;
PORTB=0;

while(1)
{
columna1=1;
delay_ms(20);

if(fila1==1)
{
delay_ms(100);
led=1;
delay_ms(1000);
led=0;
}

if(fila2==1)
{
delay_ms(100);
led=1;
delay_ms(1000);
led=0;
}

if(fila3==1)
{
delay_ms(100);
led=1;
delay_ms(1000);
led=0;
}
if(fila4==1)
{
delay_ms(100);
led=1;
delay_ms(1000);
led=0;
}
columna1=0;

}
}

Pero no tuve suerte......ke es lo ke estaria mal? no encuentro la falla

No puedo hacer esto, para recorrer la matriz con dos fors?
int fila[4];
bit fila[0]@PORTB.3;
bit fila[1]@PORTB.2;
bit fila[2]@PORTB.1;
bit fila[3]@PORTB.0;
¿¿¿???
Aclaracion: No uso CCS, sino CC5X
Título: Re: Matriz de leds 5x7
Publicado por: BrunoF en 13 de Noviembre de 2006, 03:57:27
Hola. Antes que nada, recomiendo que actives las weak pull ups del puerto b.
La logica es esta:
Poner fila 1 en bajo(RB3) y las otras 3(RB0,RB1 y RB2) en alto y revisas las columnas <RB4:RB7>
Si el valor de <RB4:RB7> es distinto a 1111, significa que hay algo presionado. Sabiendo la fila actual y buscando el 0 presente, obtienes la tecla pulsada. Si <RB4:RB7> es 1111, pones en bajo la fila 2(RB2) y el resto(RB0,RB1 y RB3) en alto...y asi haces con las 4 filas. Una por una.

Saludos.
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 15 de Noviembre de 2006, 14:21:52
Como es eso de activar las weak pull ups del puerto b???

Como puedo hacer para manejar los pines con un vector, para poder recorrerlo mas facil con alguna estructura repetitiva??
Título: Re: Matriz de leds 5x7
Publicado por: BrunoF en 15 de Noviembre de 2006, 16:26:06
Hola.
Bueno, no programo micros en C, pero aca hice una rutina que te deberia servir.
Para justificarme un poco lo que hice, he hecho que la rutina admita multiple presion de teclas.

El codigo(hecho en CCS):

Código: C
  1. #include <16f84a.h>           //Modelo de PIC usado para este ejemplo
  2. #fuses XT,NOWDT,NOPROTECT,PUT //Fusibles: Oscilador <= 4Mhz, Perro Guardian Desactivado, Sin proteccion contra lectura, Demora al inicio activada
  3. #use delay (clock=4000000)    //Defino cristal 4Mhz
  4. #use standard_io(a)
  5. #use fast_io(b)
  6. #byte port_a=0x05             //Defino puertoA
  7. #byte port_b=0x06             //Defino puertoB
  8.  
  9. byte Tecla[15];               //Array de 16 bytes. Cada uno contiene la posible tecla pulsada.
  10. byte Cantidad;                //Variable que indicara la cantidad de teclas presionadas.
  11.  
  12.  
  13. void main(void)
  14. {
  15.  
  16. byte i,j,Temp;                      //Defino variables a usar...
  17.  
  18. set_tris_a (0b00000);               //puertoA todo como salida
  19. set_tris_b (0b11110000);            //<RB4:RB7> como entradas, <RB3:RB0> como salidas
  20. port_b_pullups(TRUE);               //Habilito Weak Pull Ups puerto b
  21.  
  22. port_a=0;                           //Inicializo puertoA cero
  23. do{                                 //loop
  24. port_b=0b00001110;                  //Fila 1 en bajo
  25. Cantidad=0;                         //Inicializo Cantidad teclas encontradas=0
  26. for(i=0;i<4;i++){                   //Recorro fila x fila
  27.   Temp=port_b;                      //Almaceno valor del puertoB en Temp
  28.   if (Temp < 240){                  //¿Hay algo presionado?
  29.     for(j=4;j>0;j--){               //Si. Busco columna por columna
  30.       if(!bit_test(Temp,7)){        //¿Columna con tecla presionada?
  31.         Tecla[Cantidad]= i*4+j;     //Si.Guardo el numero de tecla presionada en el array.
  32.         Cantidad++;                 //Incremento cantidad de teclas encontradas...
  33.       }                             //Cierro IF
  34.       rotate_left(&Temp,1);         //Rotacion para seguir con la proxima columna
  35.     }                               //Cierro FOR
  36.   }                                 //Cierro IF
  37.   rotate_left(&port_b,1);           //Rotacion para seguir con la proxima fila
  38. }
  39. if(Cantidad>0) port_a=Tecla[0]; else port_a=0;  //Si hay al menos una tecla presionada, mostrarla en puertoA(binario)
  40. }while(TRUE);                                   //Infinitamente reviso el teclado
  41. }                                   //Cierro main

Y te adjunto el programa y el esquema para simular en ISIS.
Saludos.
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 15 de Noviembre de 2006, 21:38:08
Bien, entendi el procedimiento..lo hice funcionar...ahora simplemente tengo el problema para usar un vector....estoy haciendo esto:

int columna[4];
bit columna[0]@PORTB.0;
..................................
bit columna[3]@PORTB.3;

Pero me tira un error.....asi ke tenog ke hacer columna1, columna2 y keda medio largo..y feo el codigo.....alguna idea???
Título: Re: Matriz de leds 5x7
Publicado por: BrunoF en 18 de Noviembre de 2006, 04:30:55
Hola andros.
Disculpame, pero no entiendo realmente qué es lo que queres hacer.

Tal vez este link te ayude:

http://www.todopic.com.ar/foros/index.php?topic=14612.0

Saludos.
Título: Re: Matriz de leds 5x7
Publicado por: aripod en 19 de Noviembre de 2006, 17:50:19
Es mas o menos eso lo ke kiero hacer...salvo ke....
En el compilador que uso, para asignarle nombre a cada pin se hace:

bit nombre@para (PORTB.1 por ejemplo).

Ya que son 4 filas y 4 columnas, lo ideal seria tener un vector por filas y otro por columnas, entonces:

int fila[4]; (seria int o unsigned?)
bit fila[0]@PORTB.0;
bit fila[1]@PORTB.1;
bit fila[2]@PORTB.2;
bit fila[3]@PORTB.3;

y lo mismo con las columnas, pero me da este error al momento de compilar:

int fila[4];
bit fila[0]@PORTB.0;
        ^------
Error[1] C:\Proyectos\Teclado\Codigo.c 15 : Syntax error
 (The expression must be corrected. The marker ^------ shows
 the approximate position where CC5X gives up. The documentation
 should be checked if the cause is not obvious)

Ke en realidad no me dice nada.....

En el CCS se puede hacer esto??? Se podria decir ke la unica razon por la ke no me paso al CCS es por el tema de asignarle nombres a cada pin ke seguro se puede......