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++;
}
...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.
....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.
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.
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.
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.CitarEl 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++
// Variables globales int fila = 0; //************************************************ //**** Barrido matriz led 3 filas, 5 columnas **** //************************************************ void set_leds() { // Apaga filas output_low(PIN_D0 + 0); output_low(PIN_D0 + 1); output_low(PIN_D0 + 2); // Enciende leds fila activa for (i = 0; i < 5; i++) { output_bit(PIN_D3 + i, !led_state[(fila * 5) + i]); } // Enciende fila activa output_high(PIN_D0 + fila); // Incrementa fila fila++; // Fila 0, 1, 2 if (fila == 3) fila = 0; }
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.