Buongiorno a tutti stò sperimentando un trasmettitore apricancello a 433Mhz e, siccome mi piace complicarmi la vita, vorrei predisporre, nel programma, la sequenza dei bit 0 1 della codifica. Ora la domanda supponiamo di avere una variabile binaria di 12 bit vorrei in quanche modo fare uno shift ed analizzare l'ultimo bit se 0 fare un'operazione e se 1 farne un'altra. Questo mi consentirebbe di modificare la sequenza della codifica direttamente nel programma abbastanza facilmente.
Grazie a tutti e spero di aver espresso il mio dubbio in maniera comprensiva.
Ciao, Luigi
Per sapere se l'ultimo bit è 0 o 1 basta fare una divisione per 2 e prendere il resto, che è l'LSB. Puoi farlo con una sola operazione, usando l'operatore modulo, %.
Per esempio: 5%2=1; 6%2=0.
Grazie per la tempestività della risposta però a me serve analizzare tutti i 12 bit della sequenza per esempio se fosse 110010100011 devo fargli fare l'operazione a seconda di ogni bit. avevo pensato di fare un ciclo for usando la formula
for (int i = 0; i < 11; i++);
int bitout = (val1 >> i++);
la variabile val1 contiene la codifica.
int bitout = (val1 >> i);
Inoltre, devi fare &1 per leggere solo il bit a destra:
byte bitout=(val1>>i)&1;
&1 è molto più veloce del modulo.
grazie per la risposta
Altra domandina per dichiarare una variabile binaria uso
int val1 = '001101001101'
sono giusto?
avevo pure pensato di utilizzare
Int bitout = val1
usando l'array val1[] {0, 1, 0, 1,...}
Scusate ma non sono troppo ferrato col linguaggio di programmazione.
Una variabile non è "binaria" o altro. Si distinguono solo per dimensioni e con o senza segno. Se usi la notazione binaria, devi scrivere 0bxxxxxxxx:
int pippo=0b1101001000100101; // fino a 16 bit
byte pluto=0b11010010; // fino a 8 bit
Perfetto, grazie, mi perdo in qualche punto basilare secondo te sarebbe meglio usare gli array
Int bitout = val1
usando l'array val1[] {0, 1, 0, 1,...}
o non conviene?
Secondo me dipende da cosa vuoi fare con quel numero...
Se devi solo controllare i singoli bit forse è più intuitivo con un array, però occupa più memoria.
Se lo devi usare anche come numero intero allora conviene e la variabile singola. Non puoi usare un array come fossero bit di un numero binario e assegnarlo in blocco ad un'altra variabile.
Ma perchè non usi variabili int, long, ecc. e poi leggi i singoli bit con bitRead() ?
Da quel che ho visto stavi appunto provando così, quindi un int ti dovrebbe bastare.
Solo che, riprendendo il tuo esempio, lo devi inizializzare così:
int val1 = B001101001101;
cioè con il prefisso B se quel che segue è in notazione binaria, O se ottale e 0x se esadecimale.
Quindi per inizializzare a 255 fai:
int A = 0B11111111; // Lo 0 iniziale dovrebbe essere opzionale.
int B = 0377;
int C = 0xFF;
Qui il reference per le inizializzazioni appena descritte.
Se poi devi modificare un bit puoi usare bitSet() o bitWrite()
Maurizio
ok ci provo
il codice sarebbe questo
int val1 = 0b0101010101010101;
int val2 = 0b0000000000000011;
int val3 = 0b0000000000000010;
int val4 = 0b0000000000000000;
int Uscita = 1;
int Valore = 0;
int i = 0;
int bituot = 0;
void setup() {
// put your setup code here, to run once:
pinMode(Uscita, OUTPUT);
}
void loop()
{
Valore = analogRead(A1); // effettuo lettura su pin analogico A1 e memorizzo il valore nella variabile valore_letto
digitalWrite (Uscita, LOW);
// Pulsante 4
if (Valore >= 0 && Valore <= 200)
{
delayMicroseconds(11520); //Pausa di Reset
{
for (int i = 0; i < 11; i++);
int bitout = (val1 >> i) & 1;
{
if (bitout == 0)
{
delayMicroseconds(330);
digitalWrite(Uscita, HIGH);
delayMicroseconds(660);
digitalWrite(Uscita, LOW);
}
else
{
delayMicroseconds(660);
digitalWrite(Uscita, HIGH);
delayMicroseconds(330);
digitalWrite(Uscita, LOW);
}
}
}
}
}
per le graffe non mi da problemi sulla compilazione ma probabilmente sbaglio io qualcosa
Con bituot non funzionerà mai...
Inoltre, anche digitalWrite non è una buona scelta per fare temporizzazioni precise.
Era meglio correggere il primo post...
Il for scritto così non fa nulla (a parte incrementare da 0 a 11 la variabile i).
Credo che tutto il blocco sotto il for vada dentro il for.
Prima di andare avanti, metti il codice del messaggio #9 nei tag!
fratt:
Era meglio correggere il primo post...
... visto che NON era conforme al regolamento e il OP non lo ha corretto ... l'ho direttamente eliminato, tanto, l'ha riproposto nel post #9.
>gigi_rbc: ti rammento che, in conformità al regolamento, punto 7, il codice deve essere SEMPRE (... fosse anche una sola riga) racchiuso tra i TAG CODE ... mi raccomando per il futuro. Grazie.
Guglielmo
Datman:
Con bituot non funzionerà mai...
Grazie soluzione?
Datman:
Inoltre, anche digitalWrite non è una buona scelta per fare temporizzazioni precise.
Per fortuna non è tanto necessario avere una temporizzazione precisa. I ricevitori a 433Mhz hanno delle tolleranze abbastanza ampie.
Riguardo la variabile bitout c'è un doppio errore che si compensa... il secondo annulla il primo...
Riguardo la digitalWrite, non ne capisco molto di implementazione a basso livello e temporizzazioni, ma anni fa ho fatto un progettino che genera un'onda quadra con digitalWrite e funziona da anni senza problemi.
fratt:
Riguardo la variabile bitout c'è un doppio errore che si compensa... il secondo annulla il primo...
Riguardo la digitalWrite, non ne capisco molto di implementazione a basso livello e temporizzazioni, ma anni fa ho fatto un progettino che genera un'onda quadra con digitalWrite e funziona da anni senza problemi.
Ok il digitalWrite serve effettivamente per generare un'onda quadra con caratteristiche specifiche. In metito alla variabile bituot potresti essere un pochino più preciso così per capire l'errore?
L'hai dichiarata globale all'inizio sbagliando però a scrivere (hai scritto bituot).
Poi dentro il loop() la dichiari anche locale (se metti il tipo davanti al nome della variabile è una dichiarazione), questa volta scritta giusta.
O elimini la variabile globale, oppure la scrivi giusta e togli l'int dentro al loop().
In ogni caso, il problema secondo me è nel for (vedi mio post #12).
Messo così non serve a nulla. Togli il punto e virgola finale e aggiusta le graffe.