Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Negare una digitalWrite (...)

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Negare una digitalWrite (...)

Messaggioda Foto Utenteaduri » 15 feb 2022, 17:29

Buongiorno a tutti,
vorrei fare il negato di questa funzione:
digitalWrite (f4, (HIGH&&(f & B1000)));

ho provato:

digitalWrite (~(f4, (HIGH &&(f & B1000))));
~ digitalWrite (f4, (HIGH &&(f & B1000)));
digitalWrite ~(f4, (HIGH &&(f & B1000)));

ma mi da sempre errore.

qualcuno sa darmi qualche dritta?

ciao e grazie
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 11
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[2] Re: Negare una digitalWrite (...)

Messaggioda Foto Utentedjnz » 15 feb 2022, 18:22

L'unica espressione in quella riga è:

Codice: Seleziona tutto
HIGH && (f & B1000)

siccome HIGH vale sempre 1, da 1 && qualcosa si ottiene la booleanità (1 o 0) di quel qualcosa, e in questo caso il qualcosa è:

Codice: Seleziona tutto
f & B1000

cioè il valore della variabile 'f' con tutti i bit azzerati tranne il bit3.

Per me in questo contesto è difficile capire cosa esattamente vorresti negare.

Il livello in uscita ottenuto con quella digitalWrite?
E poi, negazione a livello di bit (operatore ~), oppure negazione logica (operatore !) ?

Probabilmente è il secondo caso, e allora bastava negare la booleanità dell'espressione:

Codice: Seleziona tutto
!(HIGH &&(f & B1000)))
Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52

0
voti

[3] Re: Negare una digitalWrite (...)

Messaggioda Foto UtenteIlGuru » 15 feb 2022, 18:23

aduri ha scritto:vorrei fare il negato di questa funzione:
digitalWrite (f4, (HIGH&&(f & B1000)));

~ digitalWrite (f4, (HIGH &&(f & B1000)));


Sarebbe possibile, se la funzione restituisse un valore che andrebbe comunque assegnato ad una variabile di tipo opportuno.

aduri ha scritto:digitalWrite (~(f4, (HIGH &&(f & B1000))));


Sarebbe possibile, se la funzione accettasse un valore e non due.

aduri ha scritto:digitalWrite ~(f4, (HIGH &&(f & B1000)));

ma mi da sempre errore.


Ovviamente, le chiamate alle funzione in C prevedono le ( dopo il nome della funzione

aduri ha scritto:qualcuno sa darmi qualche dritta?


Prima studiare la documentazione di digitalWrite:

Poi negare l'unico argomento della funzione che ha senso negare.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[4] Re: Negare una digitalWrite (...)

Messaggioda Foto Utenteaduri » 15 feb 2022, 19:22

Grazie delle risposte,
comunque io vorrei ottenere una negazione bit a bit
se ho 1010 vorrei ottenere 0101.

ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 11
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[5] Re: Negare una digitalWrite (...)

Messaggioda Foto Utenteaduri » 15 feb 2022, 19:53

Ho risolto cosi':

digitalWrite (f1, !(HIGH &&(f & B0010)));

se puo' essere utile a qualcuno.

ciao e grazie
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 11
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[6] Re: Negare una digitalWrite (...)

Messaggioda Foto UtenteGioArca67 » 15 feb 2022, 20:46

Stai scrivendo cose senza senso.
HIGH && (f & B1000) passato come secondo parametro alla digitalWrite fa inutilmente 2 casting, il primo di (f & B1000) da intero a booleano per poter fare && ed il secondo da booleano a uint8_t che è il tipo del secondo parametro della digitalWrite.
HIGH e true (come false e LOW) son cose diverse, anche se di solito hanno lo stesso valore.
A che serve fare HIGH && qualsiasicosa?
comunque qualsiasicosa, per poter essere data in pasto a &&, deve poter essere trasformata in bool, HIGH viene "trasformato" in true e && true non cambia nulla.
Puoi quindi passare direttamente (f & B1000) oppure il nuovo (f & B0010) alla digitalWrite che al suo interno poi lo confronterà con LOW.

B1000 e B0010 sono costanti diverse: prima fai riferimento ad una poi all'altra, non che sia in sé un problema, ma l'importante è che le usi bene per quel che ti serve.


Inoltre prima chiedi un not bitwise, poi usi il not booleano.... Perché?
Avatar utente
Foto UtenteGioArca67
4.565 4 6 9
Master EY
Master EY
 
Messaggi: 4588
Iscritto il: 12 mar 2021, 9:36

0
voti

[7] Re: Negare una digitalWrite (...)

Messaggioda Foto Utentedjnz » 16 feb 2022, 22:23

GioArca67 ha scritto:Inoltre prima chiedi un not bitwise, poi usi il not booleano.... Perché?

Probabilmente vuole scrivere un bit (o il suo contrario) di una variabile sull'uscita. E probabilmente l'inversione bitwise che serve in questo caso è uno xor (^) sul singolo bit, e non un'inversione dei bit dell'intera variabile (~). In alternativa con la negazione logica (!) sul risultato dell'espressione si ottiene lo stesso effetto finale.

Considerando che la digitalWrite applica un implicito cast a boolean (falso se zero, vero se diverso da zero), entrambi questi modi andavano bene:

Codice: Seleziona tutto
digitalWrite(pin_uscita, !(variabile & B0010));

Codice: Seleziona tutto
digitalWrite(pin_uscita, (variabile ^ B0010) & B0010);
Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52

1
voti

[8] Re: Negare una digitalWrite (...)

Messaggioda Foto UtenteGioArca67 » 16 feb 2022, 22:40

djnz ha scritto:Considerando che la digitalWrite applica un implicito cast a boolean (falso se zero, vero se diverso da zero),


Questa la digitalWrite()

Codice: Seleziona tutto
void digitalWrite(uint8_t pin, uint8_t val)
{
        uint8_t timer = digitalPinToTimer(pin);
        uint8_t bit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        volatile uint8_t *out;

        if (port == NOT_A_PIN) return;

        // If the pin that support PWM output, we need to turn it off
        // before doing a digital write.
        if (timer != NOT_ON_TIMER) turnOffPWM(timer);

        out = portOutputRegister(port);

        uint8_t oldSREG = SREG;
        cli();

        if (val == LOW) {
                *out &= ~bit;
        } else {
                *out |= bit;
        }

        SREG = oldSREG;
}



Non fa cast a boolean in ingresso, ma accetta uint8_t, che poi usa nel confronto con LOW
Avatar utente
Foto UtenteGioArca67
4.565 4 6 9
Master EY
Master EY
 
Messaggi: 4588
Iscritto il: 12 mar 2021, 9:36

0
voti

[9] Re: Negare una digitalWrite (...)

Messaggioda Foto Utentedjnz » 20 mar 2022, 17:47

Grazie per la precisazione, non effettua tecnicamente un cast, ma ottiene lo stesso risultato: scrive zero sul pin se il valore è zero (LOW), e uno se diverso da zero.
Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 708
Iscritto il: 26 lug 2020, 14:52


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti