Compatibilité arduino mega et arduino micro

Bonjour !

Voila j'ai réalisé un programme avec une grande partie électronique
sur mon prototype ça fonctionnait très bien avec une arduino MEGA 2560

Ensuite sur le 2eme prototype on a remplacé l'arduino MEGA par une arduino micro avec un AT32U4

j'ai essayé un des morceaux du programme important mais rien ne se passe, il y a absolument que la carte qui change.
Si vous pouviez regarder si qu'il va pas ça me serai d'une aide énorme !
Voici le programme :

 void loop()
 {

   ADCSRA = 0x87;
   // turn on adc, freq = 1/128 , 125 kHz.  
   ADMUX = 0x61;
   //Bit 5 – ADLAR: ADC Left Adjust Result
   ADCSRA |= (1<<ADSC);
 
   while(!(ADCSRA & 0x10));

   for(i=0; i<N; i++ ) {
     ADCSRA |= (1<<ADSC);
     //    while((ADCSRA&(1<<ADIF)) == 0);
     while(!(ADCSRA & 0x10));

     x[i] = ADCL;
     x[i] += (ADCH << 8);  
   }  

   ADCSRA = 0x00;

   for (i=0; i<N; i++){
     x[i] -=  sdvig;
     if (i & 0x01)
       fx[(N+i)>>1] = x[i] ;
     else
       fx[i>>1] = x[i] ;
   }  



   fix_fftr( fx, log2N );

 // Calculation of the magnitude:

   for (i=0; i<N/2; i++)
   {
     fx[i] = sqrt((long)fx[i] * (long)fx[i] + (long)fx[i+N/2] * (long)fx[i+N/2]);
     Serial.println(fx[i]);
   }

     if(fx[1]>500){
     
      analogWrite(13,255);
     }
     else
      analogWrite(13,0);
      
     if(fx[2]>500){
     
      analogWrite(13,200);
     }
     else
      analogWrite(13,0);
     
     if(fx[3]>500){
     
      analogWrite(13,150);
     }
     else
      analogWrite(13,0);
     
     if(fx[4]>500){
     
      analogWrite(12,250);
     }
     else
      analogWrite(12,0);
     if(fx[5]>500){
     
      analogWrite(12,200);
     }
     else
      analogWrite(12,0);
    if(fx[6]>500){
     
      analogWrite(12,150);
     }
     else
      analogWrite(12,0);
      
     if(fx[7]>500){
     
      analogWrite(11,255);
     }
     else
      analogWrite(11,0);
     
     if(fx[8]>500){
     
      analogWrite(11,200);
     }
     else
      analogWrite(11,0);
     
     if(fx[9]>500){
     
      analogWrite(11,150);
     }
     else
      analogWrite(11,0);
     if(fx[10]>500){
     
      analogWrite(11,255);
     }
     else
      analogWrite(11,0);

Bonsoir,
Mes ton programme avec les balises code (#) et la lecture sera plus facile pour tout le monde.
Merci et @+

Voila merci pour le conseil :wink:

Sinon pas d'idée?

Je pense que le problème vient d'ici :

    ADCSRA = 0x87;
   // turn on adc, freq = 1/128 , 125 kHz.  
   ADMUX = 0x60;
   //Bit 5 – ADLAR: ADC Left Adjust Result
   ADCSRA |= (1<<ADSC);
   //    while((ADCSRA&(1<<ADIF)) == 0); //Discard first conversion result.
   while(!(ADCSRA & 0x10));

   for(i=0; i<N; i++ ) {
     ADCSRA |= (1<<ADSC);
     //    while((ADCSRA&(1<<ADIF)) == 0);
     while(!(ADCSRA & 0x10));

     x[i] = ADCL;
     x[i] += (ADCH << 8);  
   }  

   ADCSRA = 0x00;

   for (i=0; i<N; i++){
     x[i] -=  sdvig;
     if (i & 0x01)
       fx[(N+i)>>1] = x[i] ;
     else
       fx[i>>1] = x[i] ;
   }

Il faudrait comparer la doc de l'ATmega32U4 et de l'ATmega2560 pour voir si les registres sont identiques.

En même temps coder en accédant directement aux registres c'est justement prendre le risque de ne plus être indépendant de la cible. Donc il ne faut pas trop t'étonner.

Bonjour,

mamacdou:
j'ai essayé un des morceaux du programme important mais rien ne se passe, il y a absolument que la carte qui change.

Je reformule ta phrase en utilisant un exemple plus convaincant :
"J'ai essayé ma démo pour carte graphique ATI sur mon PC avec une carte NVIDIA, mais rien ne se passe, pourtant les deux sont des cartes graphiques."

Arduino mega2560 = processeur ATmega2560
Arduino Micro = processeur ATmega32U4
Pas la même carte, pas le même processeur, pas les même registres et surtout pas les même capacités hardware.
Ça fait beaucoup de changement tu ne trouve pas ?

Quand on code en bas niveau avec les registres on ne change pas de gamme de processeur, sinon ça marche plus et il faut tout reprendre.

Ton problème vient de la partie d’échantillonnage analogique au début de loop, les registres de l'ATmega2560 et ceux de l'ATmega32U4 ne sont pas les mêmes. Voila ce que ça donne de copier coller bêtement un code d'exemple de Fix_FFT :wink:
Prend le datasheet de l'ATmega2560 et celui de l'ATmega32u4 puis compare les bits de chaque registre utilisés, tu devrais trouver le problème assez rapidement.