domingo, 20 de julho de 2014

Firmware para cubo de LED's.

Olá pessoal, voltamos a falar sobre o Cubo de LED's, mas hoje não vamos abordar aquilo que se chuta (Hardware) , mas sim aquilo que se ofende com palavras de baixo calão (Software), segue trecho de código para PIC18F242 que contaremos a seguir:

#include <18f242.h>
#include <stdio.h>
#use delay (clock=400000)
    
     int a, b, c, d;
    
     void linha( ){  
    
     b=0b00001;
     for(a=0; a<5; a++){
              d=c & b;
              if(d>0){                
                      output_high(pin_b7); //dado
                      delay_ms(1);
                      output_high(pin_b6); //clock  
                      delay_ms(1);
                      output_low(pin_b6);  //clock    
                      delay_ms(1);                 
                      }else{
              output_low(pin_b7);  //dado
              delay_ms(1);
              output_high(pin_b6); //clock
              delay_ms(1);  
              output_low(pin_b6);  //clock
              delay_ms(1);
}
              if(a==0){b=0b00010;}
              if(a==1){b=0b00100;}
              if(a==2){b=0b01000;}
              if(a==3){b=0b10000;}      
              }                                             
}

     void coluna( ){
          output_c(0b11111110);
          delay_ms(1000);
          output_c(0b11111101);
          delay_ms(1000);
          output_c(0b11111011);
          delay_ms(1000);
          output_c(0b11110111);
          delay_ms(1000);
          output_c(0b11101111);
          delay_ms(1000);
          output_a(0xff);  // desliga todo PORTA  
}
    
     void t( ){
     c=0b11111;
               linha( );
     c=0b00100;
               linha( );
     c=0b00100;
               linha( );
     c=0b00100;
               linha( );
     c=0b00100;
               linha( ); 
               coluna( );
}              
     void e( ){
     c=0b11111;
               linha( );
     c=0b00001;
               linha( );
     c=0b11111;
               linha( );
     c=0b00001;
               linha( );
     c=0b11111;
               linha( ); 
               coluna( );          
}
     void s( ){
     c=0b11111;
               linha( );
     c=0b00001;
               linha( );
     c=0b11111;
               linha( );
     c=0b10000;
               linha( );
     c=0b11111;
               linha( ); 
               coluna( );
}               
     void main( ){
        
     output_a(0x00);  // desliga todo PORTB
     output_b(0x00);  // desliga todo PORTB
     output_c(0xff);  // desliga todo PORTA
                      output_high(pin_b7); //bit erro
                      delay_ms(1);
                      output_high(pin_b6); //clock  
                      delay_ms(1);
                      output_low(pin_b6);  //clock    
                      delay_ms(1);  
     

     while(true){  
          
                      t( );
                      e( );
                      s( );
                      t( );
                      e( );

     }
}

                            
Lembro que este programa acima é apenas para teste, existem métodos para tornar o código mais "simples", mas para a nossa finalidade este serve. Vamos em partes agora, primeiramente declaramos as variáveis globais que serão usadas (Repito que este código é didático, de preferência sempre se se exclui a opção de variável global) , em seguida temos as "void's" (trechos de sub-rotina do programa principal) que executarão as seguintes funções:

void linha( ): Pega a informação contida em cada linha declarada para formar a imagem (No nosso caso letra) e transforma em uma informação serial que será jogado para nosso barramento serial/paralelo (Comentado na postagem anterior sobre o assunto).

void coluna( ): Desloca a imagem formada na primeira "face" (Também comentado na postagem anterior sobre o assunto) para as "faces" posteriores, deslocando a imagem (Área) dentro do cubo.

void "t,e,s"( ): Como o próprio nome sugere, estas "void's" geram as faces correspondentes aos caracteres T,E,S para formar a palavra "TESTE", vale ressaltar que este software não gera uma imagem tridimensional, apenas gera letra por letra e as deslocam da parte frontal para a posterior do cubo, para podermos ver o cubo trabalhando. Optei por destrinchar a "face" em linhas pare ser mais visível o conceito de construção da mesma e por ocupar menor espaço de memória, notem que apesar de estar dividido em cinco linhas cada letra na verdade a informação de saída será um único trecho de código serial. A imagem a seguir  talvez ajude a visualizar:

Notem que a sequencia de linhas forma a letra "T" que queremos gerar e em seguida chama a função "coluna" para deslocar esta letra por dentro do cubo.

void main( ): Inicializa o barramento e implementa o "loop" que escreverá a palavra "TESTE" no nosso cubo de LED's.

Voltando ao hardware, não entrei em detalhes mais relevantes porque o circuito é genérico, depende da aplicação e das dimensões que queira produzir o cubo, porem não foge do material básico, um controlador (um "PIC", por exemplo, com uma ROM de no mínimo 7KB), um conversor serial/paralelo (Aconselho que possua "Buffer") como o "STP16CP05", uma fonte 12Vdc, muitos LED's e uma estrutura mecânica.

Espero que tenham gostado, uma grande abraço.


Nenhum comentário:

Postar um comentário