Bonjour,
Je rencontre encore un problème de compilation d'un calcul sur XC8. Peut-être que ce sujet serait mieux en programmation, mais vu que ça concerne un calcul de timer, je ne sais pas trop...
Je calcule un Timer2 en fonction d'un Tempo lu dans un fichier Midi. Le tempo est en µs/noire, redivisé par la variable DivisionTps.
Mon Timer doit générer une interruption toutes les Tempo/DivisionTps µs.
Un compteur (baseDelay) est utilisé si le Timer lui-n'est pas suffisant pour atteindre la durée recherchée.
Je fais des calculs pour rechercher la valeur la plus proche possible de l'objectif.
Le calcul en lui-même fonctionne très bien (j'obtiens bien les valeurs attendues et le Timer fonctionne très bien). J'ai lancé des simulations via le PicKit3 et tout fonctionne comme attendu.Code:#include <xc.h> #include <math.h> #define _XTAL_FREQ 16000000 #define MIN(x,y) x < y ? x : y #define MAX(x,y) x > y ? x : y void Config_Tmr(void) { float frequence, denominateur, presc = 0.25, postsc[3], base[3], limite[3], calcul[3]; char i = -1; frequence = _XTAL_FREQ / 4000000; do { // balayages des prescalers 1, 4 ou 16. presc *= 4; i++; // Calcul du Postscaler denominateur = 256 * presc * (long)DivisionTps; postsc[i] = MAX(0, MIN(16, round(Tempo * frequence / denominateur))); // Calcul du multiplicateur baseDelay denominateur *= postsc[i]; base[i] = ceil(Tempo * frequence / denominateur); // Calcul de la limite denominateur *= base[i] / 256; limite[i] = round (Tempo * frequence / denominateur); // Calcul de l'erreur calcul[i] = presc * postsc[i] * base[i] * limite[i] / frequence; calcul[i] = fabs((calcul[i] - (Tempo/(long)DivisionTps)) * (long)DivisionTps / Tempo); } while (calcul[i] > 0.0001 && presc < 16.0); // Recherche du plus petit if (presc > 4.0) { if (MAX(calcul[0],calcul[1]) == calcul[0]) { if (MAX(calcul[1],calcul[2]) == calcul[1]) i = 2; else i = 1; } else { if (MAX(calcul[0],calcul[2]) == calcul[0]) i = 2; else i = 0; } } else if (presc > 1.0) { if (MAX(calcul[0],calcul[1]) == calcul[0]) i = 1; else i = 0; } else i = 0; // Configuration finale T2CONbits.T2CKPS = i; T2CONbits.T2OUTPS = (int)postsc[i] - 1; baseDelay = (int)base[i]; PR2 = (int)limite[i] - 1; }
Mais XC8 me génère un warning :Savez-vous d'où peut venir cet avertissement ?warning: (1257) local variable "_Config_Tmr" is used but never given a value
-----