bien spi no se queda pegado

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tetris_pc.cpp Source File

tetris_pc.cpp

00001 #include "mbed.h"
00002 #include "piezas.h"
00003 //#define DEBUG 1
00004 
00005 
00006 Serial pc(USBTX,USBRX);    
00007 SPI deviceM(PB_15, PB_14, PB_13);  //SE DEFINE EL LED QUE ACTIVARA  EL DISPOSITIVO
00008 DigitalOut ssel (PB_12);
00009 DigitalIn pulsador_izq(A5); //pulsador conector izquierdo
00010 DigitalIn pulsador_der(A4); //pulsador conector derecho
00011 DigitalIn p_giro(A3); //pulsador conector giro
00012 
00013 //Declaracion de funciones
00014 void inicializar();
00015 void pulsador_der();
00016 
00017 uint16_t* girar(uint16_t* pieza, int posicion);
00018 int memoria[8]={0};
00019 int *pointer=0;
00020 void debuging(char*s,...){
00021     
00022     #if DEBUG
00023     pc.printf(s);
00024     #endif
00025     
00026     }
00027 
00028 // FUNCION EL CUAL ENVIA EL DATO JUNTO CON LA DIRECCION DE LA COLUMNA CORRESPONDIENTE AL PRIMER  DISPOSITIVO
00029 void sendSPI(uint8_t d1, uint8_t d2)
00030 {
00031     deviceM.unlock();
00032     ssel=0;            // SELECCIONA EL PRIMER DISPOSOTIVO
00033     deviceM.write(d1); // ESCRIBE EL ADDRESS
00034     deviceM.write(d2); // ESCRIBE EL DATA
00035     ssel=1;
00036     deviceM.lock();
00037 };
00038 
00039 // Toma el vector reorganizado , lo imprime y lo almacena
00040 void captura_matriz(uint16_t* imprimir,int posicion,int auxi, char figura, char giro, int izq, int der){
00041 int i=0; // inicia el contador i en 0
00042 int enable=1;
00043 
00044  while(enable){ //se encarga de desplazar los bits dentro del vector
00045     //pc.printf("\n1- conteo del corriemiento:\n %d",i);
00046 
00047     int j=1;  // inicia el contador j en 1        
00048            
00049            while(pulsador_izq ==1 & pulsador_der==0 & p_giro == 0 && posicion<izq){
00050             //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 giro  %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der);
00051             posicion++;
00052             for(int ci=7; ci >=0; ci--){
00053                 pc.printf("\n hacia la izq:\n ");
00054             //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 IZQ giro  %d, posicion %d\n ",giro, posicion);
00055                 imprimir[ci]=imprimir[ci-1];
00056                 if(ci==0){
00057                     imprimir[ci]=0;
00058                     
00059                     }         
00060                 }
00061             for(int m=1;m<=8;m++){
00062                  sendSPI(m, memoria[m-1]|(imprimir[m-1]>>i-1));
00063                  }   
00064             wait(1.0);  
00065  
00066             }
00067             
00068             while(pulsador_der ==1 & pulsador_izq ==0 & p_giro == 0 && posicion>der){
00069             //pc.printf("\n hacia la der:\n ");
00070             //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 DER giro  %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der);
00071             posicion--;
00072             for(int k=0; k <8; k++){
00073  
00074                 imprimir[k]=imprimir[k+1];
00075                 if(k==7){
00076                     imprimir[k]=0;
00077                     
00078                     }
00079                 }    
00080             for(int n=1;n<=8;n++){
00081                  sendSPI(n, memoria[n-1]|(imprimir[n-1]>>i-1));
00082                  }   
00083             wait(1.0); 
00084                 
00085             }  
00086    if(p_giro == 1 & pulsador_der ==0 & pulsador_izq ==0){
00087            giro++;
00088            //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA GIRO giro  %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der);
00089            if(giro ==4){
00090                giro=0;
00091                }
00092            switch(figura){ //Este switch escoje la figura con que trabajaar
00093              case 0: // L
00094              if(giro == 0)
00095              imprimir= girar(PZA_L, posicion);
00096              izq=6, der = 0;
00097              auxi=7;          
00098              if(giro == 1)
00099              imprimir= girar(PZA_LDN, posicion);
00100              izq=5, der = 0;
00101              auxi=7;
00102              if(giro == 2)
00103              imprimir= girar(PZA_LDO, posicion);
00104              izq=5, der = -1;
00105              auxi=7;
00106              if(giro == 3)
00107              imprimir=girar(PZA_LDD, posicion);
00108              izq=5, der = 0;
00109              auxi=8;
00110              break;
00111              case 1://T       
00112              if(giro == 0)
00113              imprimir= girar(PZA_T, posicion);
00114              izq=5, der = 0;
00115              auxi=9;
00116              if(giro == 1)
00117              imprimir= girar(PZA_TN, posicion);
00118              izq=6, der = 0;
00119              auxi=8;
00120              if(giro == 2)
00121              imprimir= girar(PZA_TO, posicion);
00122              izq=5, der = 0;
00123              auxi=8;
00124              if(giro == 3)
00125              imprimir= girar(PZA_TD, posicion);
00126              izq=5, der = -1;
00127              auxi=8;
00128              break;
00129              case 2://I
00130              if(giro == 0 || giro == 2)
00131              imprimir= girar(PZA_I, posicion);
00132              izq=6, der = -1;
00133              auxi=8;
00134              if(giro == 1 || giro == 3)
00135              imprimir=girar(PZA_IR, posicion);
00136              izq=5, der = 0;
00137              auxi=9;
00138              break;
00139              case 3://Cuadrado
00140              if(giro == 0 || giro == 1 || giro == 2 || giro == 3)
00141              imprimir= girar(PZA_C, posicion);
00142              izq=6, der = 0;
00143              auxi=9;
00144              break;   
00145              case 4: //Z
00146              if(giro == 0 || giro == 2)
00147              imprimir= girar(PZA_Z, posicion);
00148              izq=5, der = 0;
00149              auxi=9;
00150              if(giro == 1 || giro == 3)
00151              imprimir= girar(PZA_ZN, posicion);
00152              izq=6, der = 0;
00153              auxi=8;
00154              break;
00155 
00156              }  
00157              
00158              
00159              
00160              }             
00161              
00162     while(j<=8){ //se encarga de seleccionar que posicion del vector imprimira
00163          
00164          sendSPI(j, memoria[j-1]|(imprimir[j-1]>>i));  //Imprime el resultado de aplicar OR a la memoria y al desplamamiento de imprimir
00165          //wait(0.1); // Activar este wait para pruebas de desplazamiento y captura de los datos
00166 
00167      if(i==auxi-1 || (memoria[j-1]&(imprimir[j-1]>>i+1))!=0){  //Detiene el desplazamiento cuando los bits tocan fondo, 
00168          enable=0;// desabilitador del ciclo while 
00169          
00170          for(int k=0; k<8;k++){                          // Almacena todos lo datos del vector en la posicion que corrimiento en la memoria
00171               memoria[k]= memoria[k]|(imprimir[k]>>i);
00172              pointer= &memoria[k];
00173              pc.printf("\n pointer %d \n", *pointer);
00174              if(*pointer==511){
00175                  NVIC_SystemReset();
00176                  }
00177              
00178              }
00179     
00180          }
00181      j++;
00182      } 
00183      wait(1.0); // espera para tomar el otro valor de lectura
00184      i++;
00185      }
00186 
00187   }
00188 
00189  void desplazar(uint16_t* datos, int posicion, int auxi, char figura, char giro, int izq, int der){ // tomar la figura y la desplaza segun la posicion ingresada inicialmente
00190     
00191   uint16_t desplazamiento[8]={0};      // Inicia un vector auxiliar con solo Ceros
00192   int j= 0;
00193   
00194        for(int i=posicion; i<(posicion+3);i++){  // Inicia un vector auxiliar con solo Ceros
00195            desplazamiento[i]=datos[j]; // Alamcena los nuevos datos tomados en el vector 
00196            j++;                    
00197                           }
00198        captura_matriz(desplazamiento,posicion,auxi,figura,giro,izq,der); //Envia el Vector desplazado la funcion de captura de matriz
00199   }
00200   
00201  void read(int posicion, char figura, char giro){
00202       
00203          switch(figura){ //Este switch escoje la figura con que trabajaar
00204              case 0: // L
00205              if(giro == 0)
00206              desplazar(PZA_L,posicion,8,figura,giro,6,0);
00207              if(giro == 1)
00208              desplazar(PZA_LDN,posicion,8,figura,giro,5,0);
00209              if(giro == 2)
00210              desplazar(PZA_LDO,posicion,8,figura,giro,5,-1);
00211              if(giro == 3)
00212              desplazar(PZA_LDD,posicion,9,figura,giro,5,0);
00213              break;
00214              case 1://T       
00215              if(giro == 0)
00216              desplazar(PZA_T,posicion,9,figura,giro,5,0);
00217              if(giro == 1)
00218              desplazar(PZA_TN,posicion,8,figura,giro,6,0);
00219              if(giro == 2)
00220              desplazar(PZA_TO,posicion,8,figura,giro,5,0);
00221              if(giro == 3)
00222              desplazar(PZA_TD,posicion,8,figura,giro,5,-1);
00223              break;
00224              case 2://I
00225              if(giro == 0 || giro == 2)
00226              desplazar(PZA_I,posicion,8,figura,giro,6,-1);
00227              if(giro == 1 || giro == 3)
00228              desplazar(PZA_IR,posicion,9,figura,giro,5,0);
00229              break;
00230              case 3://Cuadrado
00231              if(giro == 0 || giro == 1 || giro == 2 || giro == 3)
00232              desplazar(PZA_C,posicion,9,figura,giro,6,0);
00233              break;   
00234              case 4: //Z
00235              if(giro == 0 || giro == 2)
00236              desplazar(PZA_Z,posicion,9,figura,giro,5,0);
00237              if(giro == 1 || giro == 3)
00238              desplazar(PZA_ZN,posicion,8,figura,giro,6,0);
00239              break;
00240              default:
00241              figura=0;
00242              giro=0;
00243              desplazar(VACIO,posicion,9,figura,giro,6,0);
00244              break;
00245              }
00246      }
00247 
00248 void captura_datos(){
00249          
00250          pc.baud(38400); //Inicializa la velocidad de comunicacion
00251          char inicio=0;
00252          int posicion= 0;
00253          char figura= 0;
00254          char giro= 0;
00255          char final=0;
00256          
00257          debuging("\n Ingrese el inicio del comando. ");
00258          inicio=pc.getc(); 
00259          debuging("\n Ingrese la Figura. ");
00260          figura=pc.getc();
00261          debuging("\n Seleccione el giro. ");
00262          giro=pc.getc();
00263          debuging("\n Seleccione la posicion. ");
00264          posicion=pc.getc(); 
00265          debuging("\n Ingrese el final del comando. ");
00266          final=pc.getc();    
00267          
00268          if(inicio!= '<' || final != '>'){
00269              
00270              debuging("\n Error en el comando.");
00271              
00272              }else{
00273                  
00274                  read(posicion,figura,giro);
00275                   
00276                  }
00277                  
00278          
00279 
00280     }
00281     
00282 void inicializar(){ //INICIALIZA LA MATRIZ 
00283     
00284     sendSPI(0x0c,1);    
00285     sendSPI(0x0b,7);
00286     sendSPI(0x09,0);   
00287     sendSPI(0x0A,0x00); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ
00288     int i;
00289     for (i=0;i<2;i++){
00290         sendSPI(0x0F,1);
00291         wait (0.5);
00292         sendSPI(0x0f,0);
00293         wait (0.5);
00294     }
00295     
00296     for (int j= 1; j<=8;j++){  // limpia la pantalla al encenderce o reiniarcea asi 
00297                                //no quedan leds encendidos cuando se ejecute el programa nuevamente
00298           
00299           sendSPI(j, 0x00);    //pone cada columna y vecto en blanco al inicializar
00300                             } 
00301     }
00302 
00303  
00304 int main() {
00305     inicializar(); // Inicializa el programa para establecer los modos de trabajo liminosidad
00306     while(1){
00307             captura_datos(); // Inicia la lectura de la informacion
00308             }
00309  
00310 }
00311 
00312 uint16_t* girar(uint16_t* pieza, int posicion){
00313      uint16_t desplazamiento[8]={0};                      
00314      int l= 0;
00315      for(int o=posicion; o<(posicion+3);o++){  // Inicia un vector auxiliar con solo Ceros
00316      desplazamiento[o]=pieza[l]; // Alamcena los nuevos datos tomados en el vector 
00317      l++;                    
00318      }
00319     
00320     return desplazamiento;
00321     }