Go Down

Topic: sistema per memorizzare un numero grande 0-99999 (Read 3 times) previous topic - next topic

leo72

Leggi il mio mega post, è tutto scritto lì.
Per scomporre un numero di 4 byte (32 bit) devi usare diversi AND a livello di bit.
1) Prendi il numero e fai un AND con 255 (binario 0b11111111): ottieni i primo 8 bit a destra;
2) sposti il numero di 8 bit a destra (operazione numero>>8) e poi fai un altro AND con 255: ottieni i secondi 8 bit ecc...
3) ogni volta ottieni un byte (8 bit) e lo salvi in una cella

gingardu

ho scritto questo breve codice
guardando i serial print  quello che ricompone senza passare per la memoria (Z) da valore corretto
invece quello che prende i dati dalla memoria   (P)  da valore sbagliato
=(


Code: [Select]
#include <EEPROM.h>


long K = 444456699;

long A;
long B;
long C;
long D;

long Z;

long p;

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

A=   (K >> 24) & 0b11111111;
B=   (K >> 16) & 0b11111111;
B=   (K >> 8)  & 0b11111111;
D=    K        & 0b11111111;
    EEPROM.write(1, A);
    EEPROM.write(2, B);
    EEPROM.write(3, C);
    EEPROM.write(4, D);

}

void loop(){


Z = (A << 24) | (B  <<16) | ( B <<8) | D;

p = (EEPROM.read(1)<<24) | (EEPROM.read(2)<<16) | (EEPROM.read(3)<<8) | EEPROM.read(4);

Serial.println (Z);
Serial.println (p);
}
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

Intanto fai assegnazione a A-B-B-D e non ad A-B-C-D  ;)
Perché poi dichiari A, B, C e D di tipo long? Esse devono contenere 8 bit, quindi devono essere di tipo byte.

gingardu

:smiley-eek-blue:

azz   che svista la doppia B  domani "aggiusto" e riprovo
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

Ho riguardato il tuo codice, non ti funzionava anche per via del casting dei tipi. Questo funziona.
Code: [Select]

#include <EEPROM.h>


unsigned long K = 0xA0B0C0D0;

byte A;
byte B;
byte C;
byte D;

unsigned long Z;

unsigned long p;

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

    A = (K >> 24) & 0b11111111;
    B = (K >> 16) & 0b11111111;
    C = (K >> 8)  & 0b11111111;
    D = K & 0b11111111;
    Serial.println(A, HEX);
    Serial.println(B, HEX);
    Serial.println(C, HEX);
    Serial.println(D, HEX);
    EEPROM.write(1, A);
    EEPROM.write(2, B);
    EEPROM.write(3, C);
    EEPROM.write(4, D);
    Z = ((unsigned long)(A) << 24) | ((unsigned long)(B) << 16) | ((unsigned long)(C) << 8) | (unsigned long)(D);
    p = ((unsigned long)(EEPROM.read(1)) << 24) | ((unsigned long)(EEPROM.read(2)) << 16) | ((unsigned long)(EEPROM.read(3)) << 8) | (unsigned long)(EEPROM.read(4));

    Serial.println(Z, HEX);
    Serial.println(p, HEX);
}

void loop(){

}

Te l'ho messo in esadecimale così vedi come vengono scomposte le variabili.

Go Up