Divisione per 4 quesito

Dal libro dei progetti di Arduino imparo come inviare informazioni tramite la connessione seriale. A un certo punto mi dice:

stai inviando solo valori compresi in questo intervallo dividi la lettura analogica per 4"

capisco. poi mi fa l'esempio

void setup(){ serial.begin(9600); }

void loop(){ serial.write(analogRead(A0)/4);

delay(1); }

E non dice altro riguardo l'argomento /4.

certezza che ho inviato un valore tra 0 e 255? Grazie per un chiarimento da parte vostra. Gab

Reply to
Gab
Loading thread data ...

1023. Il resto lo capisci da solo.
Reply to
Franco Af

Il 11/11/19 13:03, Franco Af ha scritto:

Pero` oggettivamente mi sembra un esempio assurdo... perche' detta cosi` potrebbe far intendere che via seriale sia del tutto impossibile far passare valori piu` grandi di 255... invece non e` che ogni valore lo si debba sempre segare per farlo passare per forza in otto bit :D

Diciamo che l'autore non ha voluto appesantire la trattazione per mantenerla a livello ultraprincipianti (immagino che in quel punto non poteva certo dire che il valore va scomposto in due byte alto e basso, che vanno trasmessi indipendentemente per essere poi ricombinati in ricezione nel valore a 16 bit originale... con la relativa necessita` di occuparsi anche della sincronizzazione del flusso dati... e sorvoliamo sul controllo errori).

Reply to
Claudio_F

Poi si possono trasformare valori di tutti i tipi in stringhe... Un passo alla volta :) Lo ha comprato ieri arduino

Reply to
Franco Af

Il 11/11/2019 14:10, Franco Af ha scritto:

momento, Claudio_F mi ha aperto un nuovo campo da studiare. Questa cosa

Ciao Grazie Gab

Reply to
Gab

Il 11/11/19 16:41, Gab ha scritto:

Sintesi: tutti i dati in memoria sono rappresentati con uno o piu` byte.

Indispensabile no. Utile se si vuole realizzare un'interfaccia su PC e non si conosce nessun altro linguaggio lato PC.

Reply to
Claudio_F

Il 11/11/2019 17:53, Claudio_F ha scritto:

Grazie davvero Gab

Reply to
Gab

Il 11/11/2019 17:53, Claudio_F ha scritto:

Aggiungo (parte prolissa):

(facciamola semplice)

- Con 1 byte si traferiscono valori compresi tra 0 e 255 (0 e 0xFF in HEX)

- Per trasferire un dato ADC, presumibilmente da 12 a 16bit, sono necessari due byte perche il valore sara' compreso tra 0 e 65535 Se suggerisce di dividere per 4, il valore ADC sara' un 12bit di valore compreso tra 0 e 1023 (0 e 0x3FF in HEX)

- Dividendo per 4, il valore si comprime tra 0 e 255 (0 e 0xFF), perdendo al massimo i 2 bit MENO significativi (LSB), pero' essendo un valore analogico ed essendo un dimostrativo, questo non compromette il risultato. Se fosse stato un dato di altra natura con molta probabilita' la perdita dei bit meno significativi sarebbe stata disastrosa.

- Ovviamente si puo' sempre inviare (come suggerito da altri) l' intero dato di 2 Byte trasmettendo due caratteri sulla seriale, in un ordine NOTO im modo da ricostruirlo esattamente alla ricezione, esempio (ordine little endian, si trasmette prima LSB):

1 byte = (Valore_adc & 0xFF) Parte meno significativa del dato 2 byte =( (Valore_adc >> 8)&0xFF) Shift a destra di 8bit, MSB 1 byte = 165 (0xA5) 2 byte = 3 Inviando un solo byte (diviso per 4) 1 byte = (933/4)=233 (0xE9)
Reply to
CortexA57

Il 12/11/2019 08:48, CortexA57 ha scritto:

Rientrato a casa infreddolito e bagnato dopo una giornata (ieri) trascorsa fuori trovo il msg di cortexA57 che mi ha fatto capire come la mia interpretazione della frase " dividendo per 4 mi da la certezza di aver inviato valori compresi fra 0 e 255" fosse completamente sbagliata. Ora capisco cosa intendeva l'autore di quella frase. L'avevo interpretata come una prova del nove o come si interpreta la divisione per 4 per trovare un anno bisestile. Sbagliavo della grossa. Grazie Cortex ora posso affrontare la cosa nella direzione giusta. La tua frase

"Se suggerisce di dividere per 4, il valore ADC sara' un 12bit di valore compreso tra 0 e 1023 (0 e 0x3FF in HEX)

- Dividendo per 4, il valore si comprime tra 0 e 255 (0 e 0xFF), perdendo al massimo i 2 bit MENO significativi (LSB), pero' essendo un valore analogico ed essendo un dimostrativo, questo non compromette

l'orizzonte. Alle volte basta una frase per capire che stai andando a sinistra mentre dovevi andare a destra. Grazie ancora Cortex. Gab

Reply to
Gab

Il 13/11/2019 09:44, Gab ha scritto:

a 1023, mentre analogWrite() accetta come massimo 255.

Reply to
Gab

Il 16/11/19 16:15, Gab ha scritto:

Si, ma il "problema" che l'autore dell'esempio fa passare inosservato e` appunto che dividendo per 4 perdi i due bit meno significativi, in sostanza riduci la risoluzione della misura da 1024 punti a 256, peggiorando di 4 volte la precisione della misura.

Tutto dipende se questo e` rilevante o meno. Per l'esempio in questione non lo e`, per uno strumento di misura invece lo sarebbe, e allora andrebbero trasmessi tanti byte quanti ne servono per rappresentare il valore completo e non azzoppato ;)

Reply to
Claudio_F

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.