Sketch para un joyduino más

Hola gente!!

Buenas soy un aerotrastornado que esta tratando de montar un panel auxiliar de botones y ejes para usar con su simulador favorito… la verdad es que estoy algo atascado porque no se si falla el sketch con el que leo a traves de la arduino uno o el .hex del atmega 16u2 que se habla con el ordenador y atmega328…

Bueno si alguien me pudiera ayudar revisando el siguiente sketch me haria un gran favor:

/*Arduino USB Joystick HISD
 Autor: ***** ****** ***** AKA E69 Jack_Aubrey
 Basado en los ejemplos de Darran ( http://hunt.net.nz/users/darran/ )
 y en el stack USB LUFA ( http://www.fourwalledcubicle.com/LUFA.php )
 
 Se recuerda que el codigo hace uso de la manipulacion de puertos
 directa, lo que implica que solo es valido para la Arduino UNO.
 
 El autor no se hace cargo de ningun tipo de responsabilidad 
 por el empleo de este sketch y de los archivos asociados a el*/

/* el programa da por hecho que se realiza una matriz de 
 interruptores y de ejes; con diodos, solo para los botones. 
 Actualmente se utiliza el pin 3,4,5 para seleccionar los ejes,
 el pin A5 para leerlos y el pin 2 para inhibir el hcf4051BE y 
 los pines del 5 al 13 para los interruptores; en los pines
 del 5 al 7 se usaran para mander señal solo si cambian de 
 estado*/

#define NUM_BOTONES 50  // si quieres aumentar el nº de botones 
//cambialo aqui
#define NUM_EJES 8      //lo mismo pero con los ejes

//paso a definir la estructura que usare en el reporte del USB 

typedef struct joyReport_t {
  int16_t ejes [NUM_EJES];            //10 bits de resolucion 
  uint8_t botones[(NUM_BOTONES+7)/8]; // 8 botones por byte
  } joyReport_t;
  
joyReport_t joyReport;

uint8_t estadotoggle[2] ={0,0};       // aqui almacenare el estado de los toggle
uint8_t lectura;                      //aqui almacenare la lectura del puerto C          
uint8_t prereport;                    //aqui organizare el valor del reporte
byte pinana[6]={A0,A1,A2,A3,A4,A5};   //con este array seleccionare los pines analaogicos 
  
void setup() 
    {
	Serial.begin(115200);
	for (uint16_t ind=0; ind<sizeof(joyReport.ejes); ind++) {      //pongo a cero los ejes
	    joyReport.ejes[ind] = 0;
	}

	for (uint8_t ind=0; ind<sizeof(joyReport.botones); ind++) {  //pongo a cero los botones
	    joyReport.botones[ind] = 0;
	}
        for (int ind=2; ind<14; ind++){        //pongo los pines 3 a 14 como input pullup, de tal manera que no 
            pinMode(ind,INPUT_PULLUP);               //descarguen los pines analogicos e inhibo el4051
        }
        for (int ind=0; ind<5; ind++){          //pongo los pines analogicos como input con resistencia pullup, de 
            pinMode(pinana[ind],INPUT_PULLUP);  //tal forma que si los leo obtendria HIGH cuando no tuviera botones pulsados
                                                //y LOW cuando los tenga.
        }
        pinMode(A5,INPUT);                      //preparo al A5 para realizar las lecturas de los ejes
    }
    
 // Manda un reporte HID a la interface USB; no tocar ya que esto no es mio y por tanto deberia funcionar....
    void sendJoyReport(struct joyReport_t *report)
    {
	Serial.write((uint8_t *)report, sizeof(joyReport_t));
    }
    
 //lee los ejes, sera lo primero que haga, ya que te piden que dejes un tiempo entre que el pin lee analogico o digital, aprovechando el tiempo que se toma arduino para relanzar el loop
  void leeejes()
    {
      byte Selector [8] = {B00000000,B00001000,B00010000,B00011000,B00100000,B00101000,B00110000,B00111000};  //Nos ayuda a seleccionar los pines 3 a 5 del puerto D ademas desinhibe el 4051
      int16_t leejes = 0;             //porque me parecia interesante leer los ejes y despues pasarselos al reporte            
      DDRD=B00111010;  //sin machar el Rx y el Tx preparo los pines del 2 al 5 para la tarea actual
      for (int ind = 0; ind<sizeof(joyReport.ejes); ind++){ //lectura secuencial de los ejes a traves del hcf4051
          PORTD = Selector [ind];            //selecciono el canal que voy a leer del 4051, me he cansado de tanto hcf...
          leejes = analogRead(A5);           //leo el canal
          leejes = (leejes<<6)>>6;              //limpio los 6 bits que no se con que estan llenos, la UNO tiene 10 bits de resolucion y 
                                                                    //estoy guardando en una variable de 16 bits
          joyReport.ejes[ind]=leejes;        //almaceno la lectura en su sitio
      }
      pinMode (A5, INPUT_PULLUP);    //preparo el pin A5 para volver a leerlo como parte del puerto C
      for(int ind=2; ind<8; ind++){
          pinMode (ind,INPUT_PULLUP);// vuelvo a dejar el puerto D como estaba
      }
    } 
  //organiza, compara y almacena en el reporte los estados de los toggles  
  void leetoggles (int ind)
    {
      switch (ind)
        {
          case 5:
            prereport = lectura;
            break;
          case 6:
            prereport += (lectura>>6);
            estadotoggle[(ind-6)]=(estadotoggle[(ind-6)]^prereport);      //comparo y conservo el estado de los toggles
            joyReport.botones [(ind-6)] = estadotoggle[(ind-6)];          //almaceno en el reporte el estado actual
            prereport = (lectura<<2);
            break;
          case 7:
            prereport += (lectura>>4);
            estadotoggle[(ind-6)]=(estadotoggle[(ind-6)]^prereport);      // comparo y conservo el estado de los toggles
            joyReport.botones [(ind-6)]=estadotoggle[(ind-6)];            //almaceno en el reporte el estado actual
            break;
        }
    }
    
    //lee los botones
  void leebotones (int ind)
    {
      switch (ind)
        {
          case 8:
            joyReport.botones [(ind-6)] = lectura;
            break;
          case 9:
            prereport = lectura;
            break;
          case 10:
            prereport += (lectura>>6);
            joyReport.botones [(ind-7)] = prereport;
            prereport = (lectura<<2);
          case 11:
            prereport += (lectura>>4);
            joyReport.botones [(ind-7)] = prereport;
            prereport = (lectura<<4);
            break;
          case 12:
            prereport = (lectura>>2);
            joyReport.botones [(ind-7)];
            break;
          case 13:
            joyReport.botones[(ind-7)]=lectura;
            break;
        }
    }  

void loop()
{
  int i;                    
  leeejes();                          
  for(i=5; i<14; i++){
      pinMode(i , INPUT);
      lectura = ~(PINC<<2);
      if (i<8){
          leetoggles(i);
      }
        else if (i>7){
            leebotones(i);
        }
      pinMode(i, INPUT_PULLUP);        
  }
  pinMode(A5,INPUT);                      //preparo al A5 para realizar las lecturas de los ejes
  sendJoyReport(&joyReport);
}