Matriz de LED con RTOS

En este nuevo proyecto, se ha tomado como base el proyecto de http://electgpl.blogspot.com.ar/2012/05/control-de-matriz-estatica.html al cual se ha modificado para que funcione con RTOS, como vimos en la introducción a RTOS http://electgpl.blogspot.com.ar/2012/12/rtos-sistema-operativo-en-tiempo-real.html ahora se le quito la interrupción por desbordamiento del TIMER0 y directamente se realizaron dos tareas que correrán mediante el sistema operativo, la primera tarea se encargara de sensar las columnas o multiplexar las columnas y la segunda tarea se encargara del barrido de caracteres, si bien ambas funciones tienen que funcionar a una velocidad tal que no se detecten parpadeos en la matriz, nótese que la tarea del barrido de caracteres posee un tiempo de 30ms (30 veces mas lenta que la tarea de multiplexado), de esta forma se logra ver el movimiento de los caracteres formando la palabra "ELECTGPL".
El circuito es el mismo que se ha utilizado en la versión sin RTOS, y el único cambio es el mencionado sistema operativo, el cual nos ha dado mejores resultados tras la ejecución.



El código fuente es el siguiente:

#include<16F883.h>
#use delay(int=4000000)
#fuses XT,NOWDT


#use rtos(timer=0,minor_cycle=1ms)


//Definicion de variables
int fila[5],letra=0;


//Definicion de la primera tarea (sensado de columnas)
#task(rate=1ms,max=1ms)

void funcion1();
 

//Definicion de la segunda tarea (barrido de caracteres)
#task(rate=30ms,max=1ms)
void funcion2();
 

//Inicio del programa
void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
   rtos_run();
}


//Funcion de sensado de columnas
void funcion1(){
   output_a(0b00000001);
   output_c(~fila[0]);
   delay_ms(10);
   output_a(0b00000010);           
   output_c(~fila[1]);
   delay_ms(10);
   output_a(0b00000100);           
   output_c(~fila[2]);
   delay_ms(10);
   output_a(0b00001000);           
   output_c(~fila[3]);
   delay_ms(10);
   output_a(0b00010000);
   output_c(~fila[4]);
   delay_ms(10);
}


//Funcion de muestreo de caracteres
void funcion2(){
   switch(letra){
      case 0: fila[0]=0b01000001;
              fila[1]=0b01000001;
              fila[2]=0b01001001;
              fila[3]=0b01001001;
              fila[4]=0b01111111;
              letra++;
              break;
      case 1: fila[0]=0b00000001;
              fila[1]=0b00000001;
              fila[2]=0b00000001;
              fila[3]=0b00000001;
              fila[4]=0b01111111;
              letra++;
              break;
      case 2: fila[0]=0b01000001;
              fila[1]=0b01000001;
              fila[2]=0b01001001;
              fila[3]=0b01001001;
              fila[4]=0b01111111;
              letra++;
              break;
      case 3: fila[0]=0b01000001;
              fila[1]=0b01000001;
              fila[2]=0b01000001;
              fila[3]=0b01000001;
              fila[4]=0b00111110;
              letra++;
              break;
      case 4: fila[0]=0b01000000;
              fila[1]=0b01000000;
              fila[2]=0b01111111;
              fila[3]=0b01000000;
              fila[4]=0b01000000;
              letra++;
              break;
      case 5: fila[0]=0b00000110;
              fila[1]=0b01001001;
              fila[2]=0b01001001;
              fila[3]=0b01000001;
              fila[4]=0b00111110;
              letra++;
              break;
      case 6: fila[0]=0b00110000;
              fila[1]=0b01001000;
              fila[2]=0b01001000;
              fila[3]=0b01001000;
              fila[4]=0b01111111;
              letra++;
              break;
      case 7: fila[0]=0b00000001;
              fila[1]=0b00000001;
              fila[2]=0b00000001;
              fila[3]=0b00000001;
              fila[4]=0b01111111;
              letra++;
              break;
      case 8: fila[0]=0b00000000;
              fila[1]=0b00000000;
              fila[2]=0b00000000;
              fila[3]=0b00000000;
              fila[4]=0b00000000;
              letra = 0;
              break;
   }       
}


1 comentario:

  1. Que tal buenos días, tengo un problema, hice la simulación primero en proteus y si funciono con la matriz que ya viene predefinida 8x8, pero también lo intente hacer con puros leds, que 1.- el barrido es muy lento por más que le di el oscilador de 20 mhz, 2.- marca que: Simulation is not running in real time due to excessive CPU load.

    en teoría debería de funcionar igual una matriz predefinida a una hecha con leds, o algo estoy haciendo mal?

    Espero me puedas a ayudar a comprender eso.

    Saludos

    ResponderBorrar