ruta3

Declaracion de Funciones

#include "mbed.h"
#include "piezas.h"
//#define DEBUG 1

Serial pc(USBTX,USBRX);    
SPI deviceM(PB_15, PB_14, PB_13);  //SE DEFINE EL LED QUE ACTIVARA  EL DISPOSITIVO
DigitalOut ssel (PB_12);

Como lo indica su nombre la funcion principal es la mas importante del programa desde ella se iniciara la ejecucion de los demas programas, para esto hace un primer llamamiento a la fucnion de inicializar(), que al ejecutarce establecera como se comporatara el MAX7219, como el modo de trabajo y su luminosidad, posterior ha eso dentro de un while infiniro hace el llamado a la funcion de lectura que iniciara con la captura de datos para su posterior ejecucion.

Funcion Principal

int main() {
    inicializar(); // Inicializa el programa para establecer los modos de trabajo liminosidad
    while(1){
            read(); // Inicia la lectura de la informacion
            }
 
}


En base a lo anterior el primer llamado de la funcion principal es a esta funcion inicializar(), que establece el modo de trabajo del MAX 7219 como se detalla acontinuacion, posterior ha eso realiza un limpieza de pantalla que evita que se mantengan led encendidos luego de reinicializar el programa.

Funcion inicializar


void inicializar(){ //INICIALIZA LA MATRIZ 
    
    sendSPI(0x0c,1);    
    sendSPI(0x0b,7);
    sendSPI(0x09,0);    //SELECCIONA EL MODO DE TRABAJO DE LA MATRIZ
    sendSPI(0x0A,0x0f); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ
    int i;
    for (i=0;i<2;i++){
        sendSPI(0x0F,1);
        wait (0.5);
        sendSPI(0x0f,0);
        wait (0.5);
    }
    
    for (int j= 1; j<=8;j++){  // limpia la pantalla al encenderce o reiniarcea asi 
                               //no quedan leds encendidos cuando se ejecute el programa nuevamente
          
          sendSPI(j, 0x00);    //pone cada columna y vecto en blanco al inicializar
                            } 
    }

La funcion de lectura es la más laga de todas desde aqui se capturan los datos para ser procesado, estableciendo una comunicacion serial de 38400 bauds, enviandolos a las variables de posicion (pos), figura y rotacion.

Debe Ingresar 3 datos al abrir el send string del coolterm el primero indica la posicion , luego la figura y finalmente el giro en el siguiente formato 00 00 00 en hexadecimal a 38400 bauds.

/media/uploads/djinn77/dasts.png

La posicion va entre 01-07 la figuras van :

00. L 01. T 02. linea 03. Cuadrado

En su segunda parte como se puede ver en el ejemplo el procesamiento de la variables anteriores con dos ciclos swicth anidados, es realizado, el primero escoje la figura y el segundo la rotacion, una vez dentro de esto swicth se realiza el llamado a la funcion desplazamiento tomando como parametros de entrada al vector de la figura extraido del encabezado y a la posicion en el que este se mostrara en la matriz

Funcion de lectura

void read(){
     
         pc.baud(38400); //Inicializa la velocidad de comunicacion
         
         char pos= 0;
         char figura= 0;
         char giro= 0;
         
         debuging("\n Ingrese el posicion. ");
         pos=pc.getc();
         debuging("\n Seleccione la Figura. ");
         figura=pc.getc();
         debuging("\n Seleccione la rotacion. ");
         giro=pc.getc();
         
         
         switch(figura){ //Este switch escoje la figura con que trabajaar
             case 0: // L
                   switch(giro){ //Este switch rota la figura a trabajar
                         case 0:
                         desplazar(PZA_LD,pos); //LLAMA A LA FUNCION DESPLAZAMIENTO Y PONE LA POSICION
                         case 1:
                         desplazar(PZA_LDN,pos);

                         break;
                         case 2:
                         desplazar(PZA_LDO,pos);

                         break;
                         case 3:
                         desplazar(PZA_LDD, pos);

                         break;
             }
             break;
             }
     }
     

Una vez capturados los datos anteriores la funcion de desplazamiento posee un vector del mismo tamaño de la pieza capturada y es inicializado en ceros cada vez que es llamado, la figura es reubicada en base a la posicion deseada mediante el otro dato capturado por la funcion aqui la variable i inicializa desde que i = posicion ingresada hasta que cubre las tres posiciones principales que sobre la figura para luego de organizada ser llevada a la matriz de captura.

Funcion de desplazamiento

void desplazar(uint16_t* datos, char des){ // tomar la figura y la desplaza segun la posicion ingresada inicialmente
    
  uint16_t desplazamiento[8]={0};      // Inicia un vector auxiliar con solo Ceros
  int j= 0;
  
       for(int i=des; i<(des+3);i++){  // Inicia un vector auxiliar con solo Ceros
           desplazamiento[i]=datos[j]; // Alamcena los nuevos datos tomados en el vector 
           j++;                    
                          }
       captura_matriz(desplazamiento); //Envia el Vector desplazado la funcion de captura de matriz
  }
  

La matriz de captura es la encargada de memorizar y de realizar la impresion de los datos que ejecutara el programa. cuenta con 2 ciclos while que permiten que se ejecute el codigo haste que cierto parametro no se cumpla, el pimer ciclo while, realizar el corrimiento de los bits del vector capturado hasta la parte inferior de la matriz para luego ser capturados en la memoria, el segundo ciclo while imprime a cada "columna" el corrimento del vector, e l programa cuenta con un sistema que le permite identifcar la colicion con otra figura previamente enviada haciendo uso de la operacion and, mientras recorre el vecotr el resultado de esta siempre sera 0 hasta que finalemente vale 1 al chocar con otro objeto y luego ser nuevamente almacenado en la memoria.

Funcion de captura de matriz

void captura_matriz(uint16_t* imprimir){
int i=0; // inicia el contador i en 0
 
 while(i <8){ //se encarga de desplazar los bits dentro del vector
    int j=1;  // inicia el contador j en 1
    
    while(j<=8){ //se encarga de seleccionar que posicion del vector imprimira
         
         sendSPI(j, memoria[j-1]|(imprimir[j-1]>>i));  //Imprime el resultado de aplicar OR a la memoria y al desplamamiento de imprimir
     
     if((memoria[j-1]&(imprimir[j-1]>>i+1))!=0){
         memoria[j-1]= memoria[j-1]|(imprimir[j-1]>>i);
         break;
         }
         
     if(i==7){  //Detiene el desplazamiento cuando los bits tocan fondo, 
         
         memoria[j-1]= memoria[j-1]|(imprimir[j-1]>>i); //Almacena el nuevo valor de la operacion OR en la memoria
         
         }
     j++;
     } 
     wait(1.0); // espera para tomar el otro valor de lectura
     i++;
     }

  }


Please log in to post comments.