Loading...
Pages: 1 [2]   Go Down
Author Topic: sistema per memorizzare un numero grande 0-99999  (Read 969 times)
0 Members and 1 Guest are viewing this topic.
Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16461
Don't know what I do
View Profile
 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: 6
Posts: 541
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...

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16461
Don't know what I do
View Profile
 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: 6
Posts: 541
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...

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16461
Don't know what I do
View Profile
 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: 6
Posts: 541
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
Sr. Member
****
Karma: 6
Posts: 462
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

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16461
Don't know what I do
View Profile
 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
Sr. Member
****
Karma: 6
Posts: 462
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: 6
Posts: 541
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
Sr. Member
****
Karma: 6
Posts: 462
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

che progetto stai facendo,tra l'altro?
Logged

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16461
Don't know what I do
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
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
Print
 
Jump to: