Go Down

Topic: Invio Byte per configurare OUTPUT sul server (Read 10105 times) previous topic - next topic

leo72

Farne più "versioni" avrebbe comportato un aggravio di codice.
Inoltre i numeri possono crescere di valore con le potenze, anche da sfondare il limite dei 32 bit. Con un float puoi in teoria salire di più, perdendo però precisione.
Questo è ovviamente IMHO.


Tornando al tuo problema, sostituisci pow con power, ed includi la funzione nel tuo codice.

lollo1100

#31
Feb 27, 2013, 10:40 am Last Edit: Feb 27, 2013, 10:47 am by lollo1100 Reason: 1
si e il confronto è con 1 non con '1' giusto ? :) altrimenti non sarebbe mai vero  ...ecco perchè ora mi da 00 :) come maskA in HEX stampata su telnet :)

stavo leggendo la tua funzione power. Nel mio caso potrei passare banalmente 2 interi come parametri e farmi restituire un intero ? giusto cioè i miei casi vanno da 0 a 8 giusto 2 alla 0, 2 alla 1, 2 alla 2, 2 alla 3 quindi posso modificarla con il tipo di dati passati :)

Grazie mille Leo fortuna che ci siete voi :)

lollo1100

#32
Feb 27, 2013, 10:53 am Last Edit: Feb 27, 2013, 11:02 am by lollo1100 Reason: 1
asp ti posto un pò di codice almeno proviamo a capire dove sbaglio :)

Code: [Select]

#include <SPI.h>                                                 //  IMPORTA LIBRERIA SPI
#include <Ethernet.h>                                         //  IMPORTA LIBRERIA ETHERNET

int maskA1 = 0;
int maskA2 = 0;

char maskA11;
char maskA21;

byte maskA[] = {
 0, 0, 0, 0, 0, 1, 0, 0 };                       //  MASK A DEFAULT

void loop(){
   for (int i = 0; i < 4; i++){
   if ( maskA[i] == 1 )
     maskA1 += power( 2, i );
 }
   maskA11 = switchCase(maskA1);
 for (int i = 4; i < 8; i++){
   if ( maskA[i] == 1 )
     maskA2 += power( 2, (i-4) );
 }
   maskA21 = switchCase(maskA2);
// questo per stamparlo su Telnet

 client.print("          MASK A IN HEX : ");
     client.print(maskA11);
     client.println(maskA21);
}

char switchCase (int var){
 char var2;
 switch(var){    
 case 0:
   var2 = '0';
   break;
 case 1:
   var2 = '1';
   break;
 case 2:
   var2 = '2';
   break;
 case 3:
   var2 = '3';
   break;
 case 4:
   var2 = '4';
   break;
 case 5:
   var2 = '5';
   break;
 case 6:
   var2 = '6';
   break;
 case 7:
   var2 = '7';
   break;
 case 8:
   var2 = '8';
   break;
 case 9:
   var2 = '9';
   break;
 case 10:
   var2 = 'A';
   break;
 case 11:
   var2 = 'B';
   break;
 case 12:
   var2 = 'C';
   break;
 case 13:
   var2 = 'D';
   break;
 case 14:
   var2 = 'E';
   break;
 case 15:
   var2 = 'F';
   break;
      default:
      break;
 }
 return var2;
}
int power (int  tempNum, int tempMul) {
   if (tempMul == 0) {
       return 1; //N^0=1
   }
   int tempRes = 1;
   while (tempMul) {
       tempRes *= tempNum;
       tempMul--;
   }
   return tempRes;
}

sul confronto
 if ( maskA == 1 ) ci ho messo
 if ( maskA == byte(1) )

ma così facendo mi restituisce ogni volta un carattere diverso sulla configurazione del telnet invece io vorrei i due caratteri esadecimali 04H ovvero 04

leo72

Perché se converti in char poi fai restituire alla funzione switchCase un int?

PS:
non ti seguo più, mi sto intrecciando...  :smiley-sweat:

lollo1100

Leo e a tutto il forum stavo pensando una scorciatoia...se io convertissi la mia matrice da binario a DEC (ovviamente non mi riesce questa funzione) e poi lo stampassi come client.print(numDec,HEX); però c'è un piccolo problema lui potrebbe inviare un solo carattere ovvero se client.print(0,HEX); invia solo 0 io vorrei però una formattazione sempre a 2 caratteri esadecimali ovvero client.print(0,HEX) deve stampare 00h tipo poi a quel punto il problema rimarrebbe convertire la mia matrice di 8 bit(byte) in un numero decimale  :smiley-mr-green:

lollo1100


Perché se converti in char poi fai restituire alla funzione switchCase un int?

PS:
non ti seguo più, mi sto intrecciando...  :smiley-sweat:


no la mia idea era quella di passare un intero alla funzione switchCase in particolare gli passavo la conversione decimale ( che non va bene ) al mio switchCase e questo metodo implementato da me mi restituiva il carattere corrispondente esempio switchCase(10) = 'A'  :) volevo far questo ma a quanto pare non funziona e a quanto pare il problema sta su quel ciclo for quello in cui converto la mia array di 1/0 nel numero decimale corrispondente a sto punto pensavo che per stampare FF o 00 bastava fare
client.print(numeroDecimale,HEX) ovviamente questo metodo è un pò strano xk c'è rischio che mi tronca un carattere esadecimale il MSB x intendersi giusto ?

leo72

Dai retta a me. Raggruppa i vari byte delle tue letture in 2 byte con la funzione bitSet che ti avevo illustrato in precedenza, così eviti le potenze.
Poi non fare lo switch per convertire in esadecimale, ma prova stampando con client.print(mask1, HEX).

lollo1100

#37
Feb 27, 2013, 11:52 am Last Edit: Feb 27, 2013, 11:57 am by lollo1100 Reason: 1
scusa tu partendo da qui

byte maskA[] = {
 0, 0, 0, 0, 0, 1, 0, 1 };                       //  MASK A DEFAULT

come procederesti faresti bitSet() su maskA io in pratica dovrei inviare 05 in HEX mo stavo provando a convertire con una botta sola con queste ma faccio un casino clamoroso http://arduino.cc/en/Reference/HomePage  di Conversion passando l'intera matrice come parametro provavo a convertire in int o in byte ma probabilmente non fanno la funzione che voglio io :(

Io sto ancora nella fase primordiale ovvero ho quella maschera voglio mandare 1 byte due caratteri ad esempio FF tutti i led sono comandati 00 nessun led è stato comandato e i casi intermedi di alcuni led comandati dovrei passare da quella maskA ad inviare 2 caratteri esadecimali che siano coerenti con quanto scritto in binario nella maschera purtroppo la maschera è binaria x modo di dire da quello che ho capito ogni 0 o 1 dentro a maskA è un byte a sua volta composto da 0 bit che formano il numero del codice ascii corrispondente giusto?

leo72

Tipo così, riprendendo il tuo codice
Code: [Select]
for (int i = 0; i < 4; i++) {
    if ( maskA[i] == 1 )
        bitSet(maskA1, i);
}

lollo1100

#39
Feb 27, 2013, 12:04 pm Last Edit: Feb 27, 2013, 12:06 pm by lollo1100 Reason: 1

Tipo così, riprendendo il tuo codice
Code: [Select]
for (int i = 0; i < 4; i++) {
   if ( maskA[i] == 1 )
       bitSet(maskA1, i);
}



scusa ma maskA1 così facendo sarebbe di nuovo un byte di caratteri binari? questo vorresti fare? xk almeno dopo si converte al volo? giusto???
scusa ancora l'ignoranza io l'avevo pensata così ma

if ( maskA == 1 )
che farebbe? cioè in teoria x come la vedo io dovrebbe prendere l'iesimo byte di maskA e verificare se sia uguale a 1 giusto? in questo caso se è vera che fa con l'istruzione di sotto ? bitSet ancora non l' ho capita bene nonostante l'ho letta e riletta come funzione. Grazie

lollo1100

Scusa Leo se insisto ...ma maskA è un Byte giusto quando vado a fare il confronto nell'if succede questo se scrivo if(mask==1) ogni volta ne conta un numero differente infatti mi stampa ogni volta un numero diverso (quindi non va bene) se scrivo if(maskA == '1') mi scrive sempre 0 come se questo non fosse mai uguale a '1' e questo mi può andare bene se scrivo if(maskA == 49); continua a darmi valori a cavolo ogni volta diversi come devo procedere al confronto dei singoli (byte) o bit della maschera? sto diventando matto :(

pablos71

#41
Feb 27, 2013, 12:47 pm Last Edit: Feb 27, 2013, 12:49 pm by pablos Reason: 1
io ci provo ancora una volta, forse non ho capito cosa vuoi fare.
Nel byte che mandi c'e' già scritto se il pin deve commutare a 1 o a 0, l'assegnazione degli 8 pin lo fai sul server, perchè devi per forza mandarne 2, comunque guarda questo vedi se ti è chiaro

Code: [Select]
byte server_pin[] = {40,41,42,43,44,45,46,47};  //pin del server che devo comandare

void setup() {
 Serial.begin(9600);
 
//-------------simulo il client che prepara un dato da spedire al server -----------
 byte dato_da_spedire;
 
 dato_da_spedire += 1; // dico accendi il pin 40
 dato_da_spedire += 2;  // dico accendi il pin 41
 //dato_da_spedire += 4;  // dico accendi il pin 42  
 //dato_da_spedire += 8;  // dico accendi il pin 43
 //dato_da_spedire += 16;   // dico accendi il pin 44
 dato_da_spedire += 32;   // dico accendi il pin 45
 //dato_da_spedire += 64;   // dico accendi il pin 46
 dato_da_spedire += 128;   // dico accendi il pin 47
//----------------------------------------------------------------------------------  

byte dato_ricevuto = dato_da_spedire;

//----------------il server legge il byte ricevuto---------------------------------
 for (byte i=0; i < 8; i++) pinMode(server_pin[i], OUTPUT);
 
      for ( byte i=0; i < 8; i++) {            
             byte mio_bit = bitRead(dato_ricevuto, i);  
             Serial.println("bit posizione " + (String)i + "  " +  (String)mio_bit); //debug
             digitalWrite(server_pin[i], mio_bit);
       }    
}
//----------------------------------------------------------------------------------
void loop() {}
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

lollo1100

#42
Feb 27, 2013, 12:53 pm Last Edit: Feb 27, 2013, 12:55 pm by lollo1100 Reason: 1

io ci provo ancora una volta, forse non ho capito cosa vuoi fare.
Nel byte che mandi c'e' già scritto se il pin deve commutare a 1 o a 0, l'assegnazione degli 8 pin lo fai sul server, perchè devi per forza mandarne 2, comunque guarda questo vedi se ti è chiaro

Code: [Select]
byte server_pin[] = {40,41,42,43,44,45,46,47};  //pin del server che devo comandare

void setup() {
 Serial.begin(9600);
 
//-------------simulo il client che prepara un dato da spedire al server -----------
 byte dato_da_spedire;
 
 dato_da_spedire += 1; // dico accendi il pin 40
 dato_da_spedire += 2;  // dico accendi il pin 41
 //dato_da_spedire += 4;  // dico accendi il pin 42  
 //dato_da_spedire += 8;  // dico accendi il pin 43
 //dato_da_spedire += 16;   // dico accendi il pin 44
 dato_da_spedire += 32;   // dico accendi il pin 45
 //dato_da_spedire += 64;   // dico accendi il pin 46
 dato_da_spedire += 128;   // dico accendi il pin 47
//----------------------------------------------------------------------------------  

byte dato_ricevuto = dato_da_spedire;

//----------------il server legge il byte ricevuto---------------------------------
 for (byte i=0; i < 8; i++) pinMode(server_pin[i], OUTPUT);
 
      for ( byte i=0; i < 8; i++) {            
             byte mio_bit = bitRead(dato_ricevuto, i);  
             Serial.println("bit posizione " + (String)i + "  " +  (String)mio_bit); //debug
             digitalWrite(server_pin[i], mio_bit);
      }    
}
//----------------------------------------------------------------------------------
void loop() {}



pablos ho cercato di capire il tuo codice il mio problema è un altro. In fase di configurazione del client la maschera potrebbe cambiare a quel punto il codice di invio byte deve sorreggere questo mutamento e dovrebbe inviarmi i caratteri esadecimali corrispondenti alla nuova maschera + ovviamente (ora li stavo tralasciando) il comando di accensione e spegnimento dopo sul lato server (dove stanno i led/relay) per intendersi deve essere decriptata la coppia di caratteri HEX anche di una eventuale nuova maschera e verranno configurati attivi solo i pin in cui c'è 1 :) forse ora ho spiegato meglio il mio problema.

lollo1100

#43
Feb 27, 2013, 02:56 pm Last Edit: Feb 27, 2013, 03:26 pm by lollo1100 Reason: 1

Tipo così, riprendendo il tuo codice
Code: [Select]
for (int i = 0; i < 4; i++) {
   if ( maskA[i] == 1 )
       bitSet(maskA1, i);
}



Leo è perfetto solo un ultimo dubbio la maschera per come è intesa lo 0 è il MSB come posso gestire if bitSet o che altro x fare una corrispondenza nella notazione normale ovvero lo 0 è MSB e sarà considerato MSB anche nella lettura mi spiego meglio se mask è

00000101 per lui questo è 160 invece che 5 sarebbe 128+32
come posso ovviare a questo maledetto fraintendimento mo stavo considerando la lettura senza nibble ma tanto anche x il nibble è lo stesso problema

Code: [Select]
for (int i = 7; i < 4; i++) {
   if ( maskA[i] == 1 )
       bitSet(maskA1, i);
}

leo72


Leo è perfetto solo un ultimo dubbio la maschera per come è intesa lo 0 è il MSB come posso gestire if bitSet o che altro x fare una corrispondenza nella notazione normale ovvero lo 0 è MSB e sarà considerato MSB anche nella lettura mi spiego meglio se mask è

00000101 per lui questo è 160 invece che 5 sarebbe 128+32
come posso ovviare a questo maledetto fraintendimento mo stavo considerando la lettura senza nibble ma tanto anche x il nibble è lo stesso problema

Ribalta il for. Invece che fare il for da 0 a 3 e poi da 4 a 7, fai da 7 a 4 e poi da 3 a 0.

Go Up