Pages: 1 [2]   Go Down
Author Topic: sistema per memorizzare un numero grande 0-99999  (Read 2708 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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>>smiley-cool 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
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 smiley-cry


Code:
#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);
}
Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-eek-blue

azz   che svista la doppia B  domani "aggiusto" e riprovo
Logged


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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho riguardato il tuo codice, non ti funzionava anche per via del casting dei tipi. Questo funziona.
Code:
#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.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ,   smiley-cool

Code:
#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(){

}
Logged


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

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ,   smiley-cool
Un "grazie" ci poteva anche stare, visto che te l'ho scritto io
Logged


Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si appunto basta e avanza il casting a long..

ALLORA, il codice l'ho aggiustato (....) cosi fa quello che voglio ,   smiley-cool
Un "grazie" ci poteva anche stare, visto che te l'ho scritto io
dov'è il bottone "mi piace"? smiley-yell
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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

il grazie era  sottinteso   smiley-cool

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
Logged


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

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

che progetto stai facendo,tra l'altro?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


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

il grazie era  sottinteso   smiley-cool
smiley-grin

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

Logged


Pages: 1 [2]   Go Up
Jump to: