Info su digitalread

Salve a tutti, perdonate la mia ignoranza ma sono un neofita.
Leggendo lo sketch di un progetto arduino mi ritrovo questa stringa

digitalWrite (DIR2, ~val < 1);

quello che non mi è chiaro è la seconda parte, ovvero ~val <1.
Io ho letto finora che quel valore può essere imppostato come HIGH o LOW, potreste illuminarmi?

Grazie mille

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

... tutti i post sono stati rimossi.

Mi aspetto che venga, prima di tutto, rispettato il REGOLAMENTO ... incluso il racchiudere il codice nei tag CODE ! Grazie a tutti per la collaborazione.

Guglielmo

tino85:
... Io ho letto finora che quel valore può essere imppostato come HIGH o LOW, potreste illuminarmi?

Primo, grazie per la presentazione, mi raccomando la lettura del REGOLAMENTO così evitiamo ulteriori problemi, poi, passando alla tua domanda ...

... se ti dico che nel "core" ci sono queste definizioni:

#define HIGH 0x1
#define LOW  0x0

... trovi la risposta ? :slight_smile:

Guglielmo

Leggi prima frase, e vediamo se é più chiaro. Boolean=0/1 o falso/vero o LOW/HIGH

Quanto all'uso di ~ nel nome di variabile non so cosa voglia dire o se ha un senso. Personalmente userei solo caratteri alfanumerici

Come si era già detto in uno dei messaggi cancellati da Guglielmo, la tilde inverte il risultato della disequazione.
Se val è minore di 1, "val<1" è vero, quindi la disequazione vale 1.
Credo, però, che servano delle parentesi:

~(val<1)

In quale sketch hai trovato questa "perla di leggibilità"? :confused:

~ è l'operatore di negazione bit a bit (complemento a uno), ovvero inverte tutti i bit. La cosa è apparentemente poco utile, ma equivale a fare 255 - val (se val è un byte, ecc ecc).

@Datman: Ti sbagli, quello che dici tu è l'operatore di negazione LOGICA, ovvero "!". Questo è l'operatore di negazione BIT A BIT (bitwise).

Uhmm... Sì, ma la disequazione "val<1" quanto vale se val è minore di 1? Se è come una variabile booleana e vale 1, cioè HIGH, ~1=0... No?

Occhio che se è veramente scritto come ha scritto l'OP "~val < 1", per la precedenza degli operatori, viene prima fatto il NOT di ogni singolo bit di val, dopo di che viene fatto il confronto con 1 e, se val vale meno di 1 il risulato è TRUE altrimenti è FALSE.

Quello che occorre sapere è ... come è definito val (signed o unsigned) e cosa contiene quando si arriva li ...

Guglielmo

Se val vale 0, la disequazione "val < 1" è vera", ma la disequazione "~val < 1" è falsa, perché ~val vale 255.

Questo è concettualmente diverso da dire !(val < 1), per quanto sembri simile in questo caso.

Comunque scrivere una riga del genere è una schifezza.

Forse non dobbiamo dare per scontato che tutto ciò che è scritto in quel "progetto Arduino" sia corretto! :slight_smile:
Purtroppo, neanche Google è stato capace di trovare quella "cosa" in tutto l'Internet mondiale! :slight_smile:

... continuate a chiacchierare ignorando il fatto che NON conoscete come è dichiarato val e che valori contiene ... ::slight_smile:

Guglielmo

Se val fosse booleana, la negazione sarebbe del singolo bit di cui è composta la variabile, vero?

E' sempre e comunque la negazione di ogni singolo bit ... ~ è l'operatore bitwise NOT che inverte ogni singolo bit di una variabile.

Guglielmo

Se val valesse zero, ~val di un unsigned vale 255, ~val di un signed vale -1 e ... in un caso è > 1 nell'altro è < 1 :wink:

Guglielmo

Se val è booleana, può valere solo 0 o 1: in tal caso,
con val=1 si ha ~val=0
e con val=0 si ha ~val=1.

E' corretto?

Il problema è che una variabile booleana non è rappresentata su un singolo bit in C, ma su un intero byte, per cui ~1 = 254, che è sempre TRUE. Per questo bisogna sempre usare la negazione logica con le variabili booleane. La negazione bitwise ha senso in pochi contesti.

SukkoPera:
Se val vale 0, la disequazione "val < 1" è vera", ma la disequazione "~val < 1" è falsa, perché ~val vale 255.

Questo è concettualmente diverso da dire !(val < 1), per quanto sembri simile in questo caso.

Comunque scrivere una riga del genere è una schifezza.

Mai stato così d'accordo.
Che io sappia, la programmazione viene usata per SEMPLIFICARE tutte le cose che altrimenti sarebbero complicate: usare quell'obbrorio significa complicare cose che sarebbero semplici in altri modi...

**>Datman: **NO, dipende dall'implementazione del tipo "boolean" (più corretto "bool") in Arduino ...
... normalmente se 0 = false, se !=0 true quindi ... non è affatto detto che applicando l'operatore ~ su un bool tu, all'interno, abbia 0 e 1 ... potresti avere 0 e 255 che sempre false e true sono :wink:

Guglielmo