Go Down

Topic: sistema per memorizzare un numero grande 0-99999 (Read 3509 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.

gingardu

ALLORA, il codice l'ho aggiustato cosi visto che per il nostro progetto serve una cosa max 5 cifre da -99999 a 99999,

cosi fa quello che voglio ,   8)

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

long K = -99999;

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

long p;

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

 
    A = (K >> 24) & 0b11111111;
    B = (K >> 16) & 0b11111111;
    C = (K >> 8)  & 0b11111111;
    D = K & 0b11111111;

    EEPROM.write(1, A);
    EEPROM.write(2, B);
    EEPROM.write(3, C);
    EEPROM.write(4, 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(p);
}

void loop(){

}
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

m_ri

è vero che non cambia niente, ma perchè quando fai le letture da eeprom fai il cast a unsigned long e non a long?

leo72

2 piccole cose:

La prima:

è vero che non cambia niente, ma perchè quando fai le letture da eeprom fai il cast a unsigned long e non a long?

Se devi gestire numeri negativi, non serve fare il casting con l'unsigned.

La seconda:

ALLORA, il codice l'ho aggiustato (....) cosi fa quello che voglio ,   8)

Un "grazie" ci poteva anche stare, visto che te l'ho scritto io

m_ri

si appunto basta e avanza il casting a long..



ALLORA, il codice l'ho aggiustato (....) cosi fa quello che voglio ,   8)

Un "grazie" ci poteva anche stare, visto che te l'ho scritto io

dov'è il bottone "mi piace"? :smiley-yell:

gingardu



Un "grazie" ci poteva anche stare, visto che te l'ho scritto io


il grazie era  sottinteso   8)

anzi tu fai parte del progetto  (sei la seconda anima)  visto che sei sempre disponibile

e quasi completo manca solo qualche piccolo ritocco sia al codice   (tastini da premere che memorizzano)
che all'ardware

poi publichiamo tutto
magari prima faccio un video privato su youtube e sento la tua opinione
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

m_ri


leo72




Un "grazie" ci poteva anche stare, visto che te l'ho scritto io


il grazie era  sottinteso   8)

:D

Quote

anzi tu fai parte del progetto  (sei la seconda anima)  visto che sei sempre disponibile

Cos'è, un "abile: arruolato"? Di tempo non ne ho per i miei, di progetti...  :smiley-sweat:


Go Up