Autor Tema: matriz de led 11x17  (Leído 1547 veces)

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

Desconectado Garbanzo

  • PIC10
  • *
  • Mensajes: 13
matriz de led 11x17
« en: 30 de Marzo de 2017, 04:59:29 »
hola todos pues como siempre desarrollando un proyecto y se presentan problemas y mas para los que tenemos poca experiencia
estoy haciendo un reloj muy grande con rtc para que se vea desde lejos con una matriz de 11x17 y uso 5 registros 74164
3 para 17 columnas y 2 para 11 filas (pensaba utilizar 74595 pero no los conseguí  :) )la cosa es que no logro que los datos
serie salgan hacia los registros asi que decidi en practicar primero con una sola matrix 8x8 y dos registros uno para filas y otro para columnas ya busque en los foros pero no encontré algo util y en la web encontre un ejemplo en un blog y basado en eso lo intente de varias maneras pero tampoco

Esto es lo que tengo:

#include <16f886.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=4M)
#byte portb=0x06
#byte trisb=0x86
#define datop pin_b3
#define clkp pin_b2
#define daton pin_b1
#define clkn pin_b0

int i,j;
byte valor,valorn;
byte const bitmask[8]={1,2,4,8,16,32,64,128};
byte const columnas[8]={0b00010000,0b00101100,0b01001100,0b01000000,0b01001100,0b00101100,0b00010000,0b00000000};
byte const filas[8]={0b000000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000};
           
void main(){
set_tris_b(0b00000000);
while(true){  //ciclo infinito
valor=columnas; //datos de columnas guardadas en variable "valor"
valorn=filas;   //datos de filas guardadas en variable "valor"
for(j=0;j<8;j++){ //for para mandar los 8 bytes  de filas y columnas a los registros
output_low(clkp); //clock del registro de las columnas en estado bajo
output_low(clkn); //clock del registro de filas en estado bajo
output_bit(datop,valor&bitmask[j]); //salida de datos hacia el registro de las columnas
output_bit(daton,valor&bitmask[j]); //salida de datos hacia el registro de las filas
delay_ms(30); //demora para carga de datos
output_high(clkp); //clock del registro de las columnas en estado alto
output_high(clkn); ////clock del registro de las filas en estado alto
i++; //incremento de variable i para pasar al siguiente byte de los array "columnas y filas"
}
}
}

lo que deberia hacer es poner en la matriz una cara asi :) pero solo enciende una columna incompleta
si me pudieran orientar que estoy haciendo mal u otra forma de mandar los datos a los registros por favor

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re:matriz de led 11x17
« Respuesta #1 en: 30 de Marzo de 2017, 14:13:24 »
Buenas, no se cuanta experiencia con micros ya tienes, lo que haría en tu caso, sería poner un solo registro, con una sola linea de leds de la matriz, uniendo ánodos o cátodos y polarizandolos correctamente, y luego enviar los datos para esos 8 leds, supongamos la primera fila de 8, luego, una vez que logras ver el dato que estas mandando correctamente, le sumas la cantidad de clocks que necesitas, y haces lo mismo con las filas, seguramente, una vez que agarres la mano con las columnas ya con las filas te sera mas fácil.

Incluso aún mas simple, conecta las matrices y los registros, saca el micro y en el lugar de los datos coloca unos switchs y un antirebote, y lo haces pulso por pulso, así luego le pones un osciloscopio en la salida del micro y ves en que te estas equivocando.

Sin el circuito es complicado ver si el error lo tienes en el código o en las conexiones. Así a simple vista veo que tiene un retardo de 30 ms después de colocar cada bit de dato en la salida, y eso nos llevaría a demoras del orden de 240 ms para mandar 8 bits que están lejos de los requeridos.
Como se ve en el código no usas registros con latch, por lo que vas a tener que estar todo el tiempo multiplexando los datos y la frecuencia de refresco para "engañar" la vista es de unos 35 HZ.

En fín, primero lo primero y segundo lo segundo. Fijate si lo podes hacer andar con pulsadores, así ves bien lo que esta pasando y aprendes, sino, nos copias el circuito que usas para simular así alguno te podrá dar una mano.

Salutes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:matriz de led 11x17
« Respuesta #2 en: 30 de Marzo de 2017, 14:17:08 »
Si es un reloj por mas tamaño que sea, creo que lo mas sensato seria simular con varios leds los segmentos de cada numero. Asi de esa forma se vuelve mas simple el control, tendrias el mismo control que un display de 7 segmentos, la unica diferencia es que los transistores deberan ser de potencia.

Por otra parte si deseas trabajar con matrices mas grande el tiempo ya pasa a ser algo importante. Creo que lo ideal seria que uses el SPI para enviar los datos y un Timer que al rebalsar se ponga el dato a enviar.

Otro tema es que cuando trabajas con matrices, lo mejor es crear en la RAM la imagen, y luego enviarla. Es decir tu programa seria algo asi:

- LLega el Dato y se separa en cada digito a enviar '1','3',':','2','1' (Este es independiente de como debe transformarlo y de como enviarlo)
- Ese dato pasa por una funcion que crea en la RAM un array con los valores que deben ponerse en el reloj. (Este es independiente de lo otro, toma el dato y lo rtasforma en el array)
- Finalmente otra parte que estaria encargada de enviar los datos. ( Este es independiente de lo anterior, solo envia lo que esta en el array)

Al ser todos indepednientes, si falla el envio sabes que funcion tiene la culpa, si falla el paso de un dato al array es culpa de la segunda funcion, etc.

Si no posee demasiada RAM lo que se hace es que el que envia los datos antes procesa la entrada segun los datos anteriores.

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

Respecto al programa:
- es muy dificil de ver que queres hacer si es que no sabes que datos estas intentando mostrar en el display
- Es complicado de ver por que tampoco sabes como estan conectada la matriz de leds con el 74595
- Por ultimo estoy viendo que a valor y valorn estas cargandole la direccion de memoria de los arras columnas y filas, y luego tratas de mostrar eso.


 

anything