Pages: 1 [2] 3   Go Down
Author Topic: Seriale con pochi bit  (Read 1476 times)
0 Members and 1 Guest are viewing this topic.
Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Una cosa del genere per il trasmettitore:

Code:
int pin4 = digitalRead(4) * 1;
int pin5 = digitalRead(5) * 2;
int pin6 = digitalRead(6) * 4;

int toSend = pin4 + pin5 + pin6;

oppure come dice leo:

Code:
byte toSend = 0;

if ( digitalRead(4) == HIGH )
bitSet(toSend, 0);

if ( digitalRead(5) == HIGH )
bitSet(toSend, 1);

if ( digitalRead(6) == HIGH )
bitSet(toSend, 2);
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9678
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Una cosa del genere per il trasmettitore:

Code:
int pin4 = digitalRead(4) * 1;
int pin5 = digitalRead(5) * 2;
int pin6 = digitalRead(6) * 4;

int toSend = pin4 + pin5 + pin6;

Esatto.
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok ora devo capire come decodificare  smiley-sad-blue
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quindi dovrebbe essere una cosa del genere:

Code:
byte input=7;    // input da seriale

int pin4 = input % 2;
int next = input / 2;

int pin5 = next % 2;
next = next /2;

int pin6 = next % 2;

digitalWrite(4, pin4):
digitalWrite(5, pin5):
digitalWrite(6, pin6):

o nella versione di leo:

Code:
byte input = 7; // input da seriale

digitalWrite(4, bitRead(input, 0)):
digitalWrite(5, bitRead(input, 1)):
digitalWrite(6, bitRead(input, 2)):

« Last Edit: October 22, 2012, 09:27:46 am by erpomata » Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Speravo in una conferma/smentita  smiley-cry
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21849
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non ho capito, vuoi una conferma o una smentita   smiley-wink smiley-wink smiley-wink smiley-wink

Sul serio: sí é giusto.
Ciao Uwe
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7183
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10497
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il miglior sistema che ho trovato per comprimre i dati nel minor numero di byte è il seguente:
conta il numero di simboli che ti servono, mettiamo che hai 3 valori da inviare, con un numero di simboli ognuno A, B e C

a questo punto moltiplichi la variabile per il numero di simboli elevato alla posizione relativa
esempio:
val1*A^0+val2*B^1+val3*C^2 etc..

per smontare invece devi usare un ciclo, ed estrarre i valori al contrario attraverso delle divisioni.

ma se ti servono esattamente 4bit, e per non impazzire con la mateatica (e perder cicli macchina, il sismetema precedente è assai lento) allora tanto vale che ogni Write sulla serial unisci due letture

edit: rileggendo le risposte, la prima soluzione è una generalizzazione del sistema proposto da astro
Quote
In pratica non devi fare altro che leggere lo stato dei pin, moltiplicarlo per 1, 2, 4  a seconda del pin e sommare questi valori tra loro, il valore ottenuto è il byte da inviare, in ricezione devi fare il procedimento opposto.
, che dire, mi frega sempre smiley
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Infatti mi sto orientando su quello ma, per ora, non ho avuto il tempo di farlo.

Grazie a tutti
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9678
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il miglior sistema che ho trovato per comprimre i dati nel minor numero di byte è il seguente:

Il sistema migliore in assoluto è utilizzare una union, sia in ricezione che in trasmissione, però se non le conosce è inutile confondergli le idee.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10497
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se mi link qualcosa sono interessato, trovo solo union del C, ma direi che centrano poco visto
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

nono posta, tanto ora il meccanismo l'ho capito.
considerando che era roba di scuola e l'ho dovuta rispolverare è stato abbastanza semplice.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9678
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le unioni, come le strutture, sono uno strumento del C che permette di creare nuovi tipi dati partendo dai tipi standard, nel nostro caso serve una unione che contiene un unsigned char e una struttura bitfield.

Code:

// definizione della struttura
union RTX_b
{
 unsigned char RTByte;
 struct PinStato
 {
    unsigned char Bit1:1;
    unsigned char Bit2:1;
    unsigned char Bit3:1;
    unsigned char Bit4:1;
    unsigned char Bit5:1;
    unsigned char Bit6:1;
    unsigned char Bit7:1;
    unsigned char Bit8:1;
  } Bits;
} RTX_data;

void setup() {
   Serial.begin(9600);

  RTX_data.Bits.Bit1 = 1;
  RTX_data.Bits.Bit2 = 0;
  RTX_data.Bits.Bit3 = 1;
  RTX_data.Bits.Bit4 = 1;
  
  Serial.println(RTX_data.RTByte, DEC);
  
}

void loop()
{
}

Nel codice di esempio creiamo la unione RTX_b che contiene un unsigned char RTByte e una struttura bitfield PinStato, assegnando i vari bit alla struttura, ovvero i utilizzando i nomi  RTX_data.Bits.Bitx ove x è un numero da 1 a 8 che identifica i bit, setto singolarmente i singoli bit che compongono RTByte, la cosa è bidirezionale perché se carico un valore su RTByte i singoli  RTX_data.Bits.Bitx vengono posti a 1 o 0 in accordo con la codifica in binario del numero.
In pratica sulla parte trasmittente basta assegnare il valore letto da un pin a  RTX_data.Bits.Bitx, fino a otto pin diversi, e poi inviare sulla seriale RTX_data.RTByte, sulla parte ricevente basta copiare il valore ricevuto su RTX_data.RTByte e assegnare ai pin i valori dei RTX_data.Bits.Bitx.
Il tutto viene tradotto in una manciata di righe assembly che richiedono pochissimi cicli macchina.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10497
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lavorare con il sistema di potenze o con le union è la stessa cosa (a livello di uso di memoria) se i valori validi sono solo 2 o potenze, ma non nel caso di altri numeri arbitrari. Però in questi casi "speciali" la union è sicuramente molto più performante a livello di calcolo
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Fico.
Comodissimo.

Grazie mille.
Logged


Pages: 1 [2] 3   Go Up
Jump to: