Pagina 1 di 5

AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 29 nov 2021, 14:33
da gvee
Ciao a tutti,

Avrei bisogno di implementare una operazione con floating point in un ATmega328P, concretamente una moltiplicazione tra uint32_t e float:

\Delta_\phi = f_\text{out} \times 23.86

e prima di usare definitivamente il microcontrollore in questione, vorrei rassicurarmi in qualche modo che tale operazione non sia troppo "complicata" e dia risultati troppo sbagliati. La velocità di esecuzione non è un fattore critico.

Purtroppo non posso effettuare un debug in runtime perché uso un ISP MK2 quindi al momento non so bene come evaluarlo se non rappresentando byte a byte sui GPIO e verificare con l'oscilloscopio pin a pin con una schedina di test (un analizzatore logico sarebbe molto comodo a questo scopo). È un procedimento un po' macchinoso e scomodo, ma se necessario...

Da quanto leggo qui, qualche problema si può avere, ma nel mio caso essendo solo una operazione non mi aspetto grandi problemi, ma non si sà mai...

Non ho mai usato micro a 8 bit con emulazione FPU SW, negli ultimi anni ho sempre usato micro a 32 bit con FPU HW...

Qualcuno ha usato la emulazione FPU per operazioni simili con questo micro ?
In tal caso, ci sono stati problemi ?

L'uso di una variabile a 32 bit non mi preoccupa molto, immagino che il compilatore la gestisca bene..

Ringrazio in anticipo.

O_/

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 0:29
da GuidoB
Ciao Foto Utentegvee, non capisco bene il tuo problema.
È vero che molti numeri che hanno una parte decimale finita, in binario ce l'hanno illimitata periodica e quindi c'è un errore di arrotondamento. Se si fanno più operazioni di seguito, questo piccolo errore può accumularsi.

Non capisco se è il tuo caso.

In alternativa, non potresti farlo in "virgola fissa"?
Nel tuo caso, moltiplicare per il numero intero 2386 e ricordarti che il risultato è in centesimi.

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 10:59
da gvee
Ciao Foto UtenteGuidoB,

Grazie per il tuo interesse.

La conversione lo devo fare perché devo programmare una tuning word di un DDS.

La prova più veloce che posso fare è quello di scrivere un piccolo firmware e restituire il valore calcolato sulla seriale byte a byte, e leggerli opportunamente con un piccolo programmino seriale in C, python o Octave...

Dato che ho aperto il post, posterò qui i risultati, il tutto appena avrò un po' di tempo libero.

O_/

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 14:16
da boiler
Il risultato è un integer?
Se sì, \frac{f_{out} \cdot 1527}{64} dovrebbe fornirti un'approssimazione non malaccio ;-)
Se sia accettabile, dipende dall'applicazione.

Boiler

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 14:24
da boiler
Oppure ovviamente, puoi moltipicare per 2386 e poi dividere per 100.
Non ho dimestichezza con l'architettura AVR8, ma probabilmente non fa differenza dividere per 100 o per una potenza di 2.

Ciao, Boiler

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 14:46
da MarcoD
Per delle considerazioni mirate, occorrerebbe conoscere la
- la massima risoluzione del DDS (minimo intervallo di frequenza)
- la massima frequenza che si vuole impostare

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 15:13
da fairyvilje
boiler ha scritto:Non ho dimestichezza con l'architettura AVR8, ma probabilmente non fa differenza dividere per 100 o per una potenza di 2.

Credo di si. La potenza di 2 si riduce ad uno shift register, mentre la divisione arbitraria va implementata via software dal momento che l'ATmega328P non ha FPU, supporto per le divisioni, e nemmeno un supporto nativo per la codifica BCD. Almeno a quanto ricordo.

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 15:19
da IlGuru
In alternativa invece che moltiplicare per 23,86 * 100 = 2386 e poi dividere per 100, potresti moltiplicare per 23,86 * 128 = circa 3054 (3054,08) e poi shiftare a destra 7 bit

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 15:25
da dadduni
Mi sembra che il risultato migliore si ottenga moltiplicando per 1527 e poi dividendo il risultato per 2^6.

Questo porta un errore di approssimazione di soli 0.04 e non di 0.08 come nel caso di 2^7.

Davide

Re: AVR 8 bit: unsigned integer e FPU SW emulation

MessaggioInviato: 30 nov 2021, 15:31
da IlGuru
Giusto e si risparmia anche uno shift