Visualizza messaggio singolo
Vecchio 01 dicembre 18, 00:42   #25 (permalink)  Top
Minestrone
User
 
L'avatar di Minestrone
 
Data registr.: 13-09-2012
Messaggi: 4.687
Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
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.

Grazie mille ElNonino, come noterai sono al livello dell' ABC e non voglio tediarti più del dovuto con lezioni di base di programmazione. Vedrò di approfondire. Però mi rimane il problema che il programma, così come è, stabilizza il risultato della media in 4 o 5 secondi quando il tempo di ciclo è attorno agli 80ms, il motivo è certamente il numero di valori contenuti nell'array. La soluzione è, come suggerisci tu, diminuire enormemente il tempo di ciclo oppure diminuire di molto il numero di valori nell'array della media. Proverò con entrambi.
Minestrone non è collegato   Rispondi citando