ci sono alcune differenze fra i due sistemi, la principale è che io uso una variabile u32Acc_P_T che è un accumulatore, cioè contiene ad ogni loop la somma attuale degli n valori compionati ed inseriti nell' array, e quando viene divisa per 16 in u16P_T mi trovo aggiornata ad ogni loop la media reale.
Esattamente come faccio io, se sto capendo bene (e non ne sono sicuro). La mia variabile sommadegMPU_0 è l'accumulatore.
Poi ti spiego alcuni trucchi:
- usare una variabile di appoggio (u16App_ADC) dove memorizzare la lettura del sensore aiuta molto nel debug e velocizza il loop,
Ok, questa l'ho capita
- usare "u8PunMMV = (++u8PunMMV & 15)" anzichè "i++; if (i==k) {i=0;}" è più veloce, un & richiede in genere un solo ciclo di clock un if ne usa di più. quando un contatore incrementale ad 8 bit super 255 ritorna a 0 quindi con un & adatto ottieni automaticamente i valori da 0 a n. Chiaramente funziona se la dimensione dell'array è potenza di 2, cosa peraltro assai consigliabile.
Questa invece non l'ho capita, sto cercando di documentarmi ma non ho ancora ben capito cosa cercare.
- il motivo per cui la tua routine è lenta e sicuramente occupa anche tanta memoria è che usi tutto in floating point e se il micro non ha una FPU ci mette un secolo a fare quei calcoli, inoltre per la velocità sarebbe meglio usare un #def 180 180.0 perchè il compilatore ne è felice...
Sul discorso della lentezza dei calcoli convariabili reali ci sono. Sul #def 180 180.0 no
Se tu lavorassi con interi poi potresti usare un >> per la divisione (sempre se con esponenti di 2) che è enormemente più veloce di un / fra floating.
Queste sono operazioni con i bit. Ho sempre evitato di approfondire per semplificarmi la vita
In ultimo se usi una printf per stampare (o mettere in una stringa) un valore floating un micro ad 8 bit ci passa la notte....
Ok, anche qui ci sono. Però la cosa non mi preoccupa perchè una volta messo a punto il codice tutto il debug, ovvero tutte le printf verranno eliminate, infatti ho notato anche io che aggiungendo o diminuendo due o 3 valori con virgola al debug il tempo di ciclo saliva o scendeva enormemente.
Vedo di riesumare la mia routine per leggere l'elevazione dei pannelli FV completa di tabella di linearizzazione e poi la pubblico, girava su un PIC16F877 .
Nei sistemi embedded è una regola d'oro usare sempre interi e convertirli in floating una sola volta, se possibile.