Autor Tema: determinar fecrec.. en multiplexacion  (Leído 2110 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
determinar fecrec.. en multiplexacion
« en: 10 de Septiembre de 2008, 23:41:09 »
hola amigos otra ves me veo en la obigacion de acudir a ustedes. bueno primero grax por la ayuda que me an otargado en las dudas que me an surguido a lo largo de mi aprendisaje en pic XD. bueno la duda que tengo ahora es la siguiente estoy asiendo una multiplexacion para 60 LED los estoy asiendo con pic16f873a y 74ls164 que es un registro de desplazamiento de 8 bits. para poder recorrer los 60 led e calculado que se puede con un intervalo de ensendido de cada uno de 300us, en donde da un siclo de trabajo de 18ms ( es lo que se demora en recorrer los 60 led) lo cual es sufisiente para que el ojo humano no lo vea, ahora bien mi duda es la siguiente.
1º-- se me ocurrio que asiendo la siguiente intruccion puedo hacer la frecuencia requerida que es de 56hz es como sigue:
for (;;){
          output_high(PIN_C0);
          delay_us(150);
          output_low(PIN_C0);
          delay_us(150);
          }
ahora bien lo que no se hacer esque cuando termine un periodo que como mensione es de 18ms se active la salida output_high(PIN_C1); y me arroje un 1 por 150us en conjunto con 
for (;;){
output_high(PIN_C0);
          delay_us(150);
          output_low(PIN_C0);
          delay_us(150);
}.
agradeseria su ayuda ya que tengo que terminar esto antes de el 18de septiembre, que es el cumpleanio de mi novia y lo que estoy asiendo va hacer su regalo d(^_^)b   bueno cualquier cosa o duda me dicen no + bueno chao y de antemanos grax.

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Re: determinar fecrec.. en multiplexacion
« Respuesta #1 en: 11 de Septiembre de 2008, 13:38:22 »
Haber si entendi la pregunta.. :lol: :lol: tu necesitas que cada periodo de 18ms te saque un bit por determinado pin, lo que se me ocurre es que utilices la interrupcion de algun timer, ya sea el 0 o 1 y en la interrupcion cuentes los ms en una variable y en el main de tu programa estes verificando la variable para que cuando ya pasaron los 18ms hagas lo que tengas que hacer. :mrgreen:

Saludos.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: determinar fecrec.. en multiplexacion
« Respuesta #2 en: 11 de Septiembre de 2008, 14:37:44 »
holas tosbar primero grax por ayuda. bueno bien te comento que e pensado en eso pero el drama es que no entiendo los ejemplos que e visto de los timer, por eso tengo que recurrir a lo mostrado anterirmente por que sè que se puede generar una frecuencia (de 56hz   XD)  :,(    . buen en resumidas cuentas lo que intento haces es que nesesito generar una frecuensia de 56hz y sacarla por un pin del pic como tambien sacar por otro pin un bit a cada 18ms, pero esto tiene que hacerce en conjunto con la frecuencia, como dije en el primer post los 56hz tiene un T=18ms, por lo cual cuando alla trancurrido cada periodo osea 18ms ( que es el primer periodo de la frecuencia) se active una salida tirando un 1 por 150us.
por otra parte si me pudieras explicar un poco de los timer = seria fabuloso de antemanos grax.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: determinar fecrec.. en multiplexacion
« Respuesta #3 en: 11 de Septiembre de 2008, 16:28:22 »
seguramente que si te explico con lujo de detalles lo que hace un timer y la interrupcion que provoca seguramente duplicaré información que ya esta acá en el foro, así que trataré de resumir, peor para una mejor explicación te ruego que busques en el foro, pues el tema de timers e interrupciones está muy bien desarrollado por aca. Te resumo:

Nuestros micros tienen TIMER's, algunos 1, otros 2 otros 3, y así dependiendo del tipo de uC, los más comunes son el tmr0 y el tmr1 (según mi punto de vista) cada uno tiene alguna característica que lo distingue de los otros.

Estos Timer son simplemente registros de nuestro uC, registros de 8 o 16 bits (al menos en familias 16Fy 18F, para abajo)

Los timers, dependiendo de la configuración que le des contarán indefinidamente, en si una vez que actives a un timer se incrementará de uno en uno y desde 0 (o el valor con el que o inicies) hasta desbordar en 255 (con timers de 8bits) o 65535 (en 16bits), se incrementarán con una velocidad variable (que el programador lo configura, y dependerá tb de la Fosc, que es la frecuencia de tu cristal) cuando desborden volverán a contar desde 0 otra vez, y así es la triste y aburrida vida de los timer's, no hacen nada más que eso, pero esa su aburrida rutina que tiene a nosotros nos servirá muchísimo y nos hará una vida feliz :D :D

Pues podemos aprovechar los desbordes que esta cuenta tendrá, y en efecto este desborde provoca una INTERRUPCION, que nosotros sabremos en que tiempo se realiza, por tanto podemos contar interrupciones (previamente sabiendo cuanto dura un desborde del timer) y cuando suceda una determinada cantidad de interrupciones (entonces pasó un determinado tiempo) y podemos ejecutar una rutina de código.

La cuenta del timer no siempre sera desde 0, sino que puede ser configurable tb por el programador.

De esta manera y con un registro de PREESCALER podemos hacer variar casi a cualquier valor que queramos de temporización.

normalmente el timer se incrementará cada ciclo de reloj (preescaler=1), pero con el preescaler se puede hacer retrasar de cierta manera esa cuenta, y por ejemplo con un preescaler 2, hacer que se incremente cada 2 ciclos de reloj, y así sucesivamente.

Y hasta hay formulas y programas para poder determinar el tiempo preciso, te recomiendo nuevamente que le des una mirada al foro con el buscador, seguramente que encuentras mucho material.

Te sugiero estas web:
Pag de Redpic
Pag de Nocturno
y el foro.

espero te sirva, un saludo, adios
« Última modificación: 11 de Septiembre de 2008, 16:35:11 por Cryn »
.

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Re: determinar fecrec.. en multiplexacion
« Respuesta #4 en: 12 de Septiembre de 2008, 02:01:17 »
Muy buena explicacion la del compañero Cryn y yo optaria por hacerlo por timer  :mrgreen: pero una idea con los dealys seria poner una variable incrementando cada que pasa el delay.  Seria algo como:

Código: [Seleccionar]
//Con esto se genera la frecuencia de 56hz, T=18ms
output_high(PIN_C0);
delay_ms(9);
variable++; //Se incrementa variable cada medio periodo para lograr mas precision
output_low(PIN_C0);
delay_ms(9);
variable++; //Se incrementa variable para saber cuando paso un periodo completo

if(variable==2) //el 2 indica que paso un periodo completo
   output_high(PIN_C1); //Sacamos un uno por otro pin
else if (variable==17){ //Como cada incremento d la variable es d 9ms entonces 17*9ms=153ms o puede ser 16*9ms=144ms
   output_low(PIN_C1); //Apagamos el pin
   variable=0; //Reseteamos la variable para volver a contar
}

En este caso no se puede lograr el 150ms exacto porque los delay son de 9ms :lol: pero podrias hacerlos cada 1ms, poner otra variable que cuando sea igual a 9 poner a high el pin de la frecuencia y cuando pasen 18 ponerlo a low, de esa manera podrias ir contando de a 1 ms y podrias igual incrementar la variable de los 150ms para despues comparar con 150 exactos. Espero te sirva, saludos. :P

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: determinar fecrec.. en multiplexacion
« Respuesta #5 en: 12 de Septiembre de 2008, 12:02:53 »
Ahora mismo me encuentro con un dilema existencial del uso de delay_ms(xx); y hasta delay_us(xx);  :D :D

Porque como leí por el foro muchas veces esos son retardos ocupados, es decir tenemos a nuestro uC ocupado contando una o algunas variables hasta llegar a un retardo aproximado del que le propusimos. A veces sirve, pero otras (y qui´za la mayoría) realmente son una pérdida de uC, porque ese tiempo que se está perdiendo en un bucle de retardo, puede mbien ocuparse en una mejor tarea, nose por ejemplo explorando un teclado matricial o haciendo ver un resultado en el LCD, nose varias cosas, de esa manera nos vamos asemejando de cierta manera a un multiprocesamiento, emulando un sistema de recursos compartidos. Talvez exagero con el calificativo que le dí pero vamos ampliando nuestro capacidad de programadores.

Pues la rutina de interrupción se ejecutará por un muy corto tiempo, pues estas rutinas siempre son utilizadas para explotarlas en lo máximo utilizando el mínimo de instrucciones, seteando algunas banderas, para no convertir a esa interrupción en algo perjudicial, en vez de sernos de ayuda.

Piénsalo japifer, de esa manera puedes conocer más a fondo a un micro, creo yo. Porque la idea de Tosbar no está nada mal.

Un saludo muchachos.
.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: determinar fecrec.. en multiplexacion
« Respuesta #6 en: 13 de Septiembre de 2008, 16:23:26 »
hola como están grax por la sugerencias amigos. Bueno vamos al grano, justo antes de leer el post por tosbar estaba asiendo eso pero al final me encontré con un drama, pero primero seria mejor que les contara en detalle lo que quiero hacer:
Quiero hacer un letrero matricial de Led de 7X80 en conjunto con un reloj, lo quería hacer de menos columnas pero me di cuenta que los tiempo eran con decimales como les explicare mas adelante, pero me puse a pensar que seria mejor que fueran números enteros para que asi el micro trabajara mejor.
para el caso de la matriz 7X80(filas X columnas):
lo primero que hay que hacer en esto es una multiplexasion de cada fila pero como sabemos tendríamos que ocupar muchos pines del micro para realizar esto, así que lo que pensé es utilizar un 74ls164 que es un registro de desplazamiento de 8 bits, este ultimo como lo dice puede manejar en términos censillos 8 Led de las columnas pero al conectarlos en cascada podemos cubrir los 80 led que se requiere para esta matriz , ahora bien si queremos multiplexar los 80 led y sin que el ojo humano lo detecte podemos hacer que el recorrido de los 80 led sea de 20ms (podríamos llamar a esto un periodo de la matriz), ósea que cada led se tendría que encender en un tiempo de 250us, pero ahora bien despejando este periodo nos da una frecuencia de 4000hz, donde f=1/T.
ahora bien la ideal es que se encienda cada columna pos si sola (como un secuencial) esto lo podemos hacer como bien dije con el 74ls164 ingresándole un clck de 4khz para que cada recorrido de las columnas (ósea los 80 Led) dure 20ms y tendríamos que enviarle adicionalmente un pulso que es de dato por cada nuevo recorrido de la matriz que vendría siendo en 7X1, donde este tendrían que durar 125us y solo activarse en cada nuevo ciclo (ósea en un tiempo de activación cada 20.125ms) para que el registro de desplazamiento solo encienda de aun Led pos ves.
Pero el drama viene ahora como tengo que manejar tantos tiempos que son los del mismo reloj como el de la multiplexasion y también los tiempos de recorrido de los mensajes através de la matriz el uC no lo tolera así que lo voy hacer en 2 pic.
Mmm interesante escribiendo esto se me vino una idea, que solo podríamos depender de la frecuencia de 4KHz para manejar todo lo demás sin tiempo pero con cuentas, por ejemplo para generar los segundos del reloj  podríamos decir que cuando aya pasado supongamos en RC0 (entrada del clock) los 4Hz
 if(input(PIN_C0)){  reloj++ ;
if(reloj==2000) {
 entonces ya trascurrió 1segundo
y reloj =0;}}

esto ultimo también se podría utilizar para enviar mensajes por la matriz suponiendo que RC0 han entrado 20 pulsos en alto entonces publica o enciende la columna Nª20 y publicamos una parte de una letra y así sucesivamente.
Pero ahora bien el micro podrá analizar tantos datos a laves que serian el reloj, la frecuencia y los mensajes de la matriz en un tiempo que no afecte esta frecuencia.
Bueno si me podrían responder esta pregunta seria fenomenal.   

Desconectado Tosbar

  • PIC10
  • *
  • Mensajes: 17
Re: determinar fecrec.. en multiplexacion
« Respuesta #7 en: 15 de Septiembre de 2008, 13:53:03 »
Por lo que entiendo pretendes hacer el barrido de la matriz por columnas, es recomendable mejor hacerlo por filas ya que asi solo tienes que barrer 7 en lugar de las 80 columnas con lo que ganas muchisima velocidad, por otro lado, te comento que este proyecto de matriz de led y el registro de desplazamiento 74HC164 ha sido ya tatado en el foro y tambien en la pagina Ucontrol dale un vistazo, esta muy bien explicado el algoritmo de como meter los datos y hacer el refresco, hace poco yo trabaje en una matriz similar y quedo muy bien, de cualquier forma si despues de leer la info tienes algunas dudas donde pueda apoyar, con todo gusto.

Saludos.