Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F688


svi67

Postări Recomandate

Fiind mai mic de 65535 = 2^16, are nevoie de doar 2 octeti (16 biti).

 

O bucata de cod pentru picc de la hi-tech ar fi:

void main (void){   unsigned char ucLsb = 0;   unsigned char ucMsb = 0;   int iNumarDeSalvat;   unsigned char ucAddrLsb = 0;   unsigned char ucAddrMsb = 1;   iNumarDeSalvat = 65362;   ucLsb = iNumarDeSalvat & 0xFF;   ucMsb = (iNumarDeSalvat >> 8) & 0xFF;     eeprom_write(ucAddrLsb, ucLsb);   eeprom_write(ucAddrMsb, ucMsb);}
La & 0xFF cred ca poti renunta, e numai asa, de impresie artistica.
Link spre comentariu
  • Răspunsuri 18
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • svi67

    12

  • Liviu M

    3

  • francezu

    3

  • puiu

    1

Top autori în acest subiect

Multumesc,Sa inteleg ca pot memora direct orice numar fara sa depasesc 255.Concret as vrea sa memorez numerele cu valoare aproximativa de 592 si 320 care vor proveni de la o setare si sa le pot citi mai tarziu pentru o comparare.Formula lui Liviu Meste valabila si pentru numerele acestea? Din formula reiese ca numarul este salvat in doua locatii eeprom_write(ucAddrLsb, ucLsb); si eeprom_write(ucAddrMsb, ucMsb); cum procedez cu al doilea numar si cum reconstiui numerele dupa citire? Nu ma-m prins inca de setarile eepromului dar am dedus ca daca aceste numere nu variaza foarte mult pot sa scad o valoare fixa din ele ,sa memorez diferenta iar la citire sa adaug ce am scazut din ele sau ma complic prea tare?Daca aceste numere vor varia intre 20 si 600 ideea mea nu mai este valabila.Mai am o nelamurire cu locatia in care se vor memora cele doua numere nu stiu cum sa procedez:EEPROM_Write(0,Numar1); si EEPROM_Write(1,Numar2);daca nu depasesc 255 este corect? Sau trebuie sa precizez locatia exacta cum ar fi EEPROM_Write(0x00,Numar1); si EEPROM_Write(0x01,Numar2);Dupa formula de mai sus locatiile 0 si 1 sunt deja ocupate cu primul numar si nu am idee cum sa continui.

Link spre comentariu

Sa inteleg ca pot memora direct orice numar fara sa depasesc 255.

Da.

Formula lui Liviu M este valabila si pentru numerele acestea?

Da

 

Din formula reiese ca numarul este salvat in doua locatii eeprom_write(ucAddrLsb, ucLsb);

si eeprom_write(ucAddrMsb, ucMsb); cum procedez cu al doilea numar si cum reconstiui numerele dupa citire?

ucAddrx sunt doar nume mai usor de folosit/mai sugestive decat numerele simple. Probabil e chiar mai bine sa folosesti #define-uri.

Daca vrei sa mai scrii alte numere in eeprom, folosesti alte adrese (variabile cu alte valori, define-uri, scrii adresele direct in apelul functiei...)

De exemplu

eeprom_write(ucAddrLsb+2, ucLsb2); eeprom_write(ucAddrMsb+2, ucMsb2);

Ca sa reconstituiesti valoarea salvata pe bucati in eeprom, faci operatia inversa - muti bitii din registrul MS la stanga cu 8 biti si-i adaugi al doilea registru (LS)

int iNumarRecuperat = 0;iNumarRecuperat = eeprom_read(ucAddrMsb) << 8;iNumarRecuperat += eeprom_read(ucAddrLsb) ;

EEPROM_Write(0,Numar1); si EEPROM_Write(1,Numar2)... Sau trebuie sa precizez locatia exacta cum ar fi EEPROM_Write(0x00,Numar1); si EEPROM_Write(0x01,Numar2)

Cele doua forme sunt echivalente. sunt doar scrise altfel (in zecimal, respectiv hexazecimal).

Dupa formula de mai sus locatiile 0 si 1 sunt deja ocupate cu primul numar si nu am idee cum sa continui.

cu 2, 3, 4... pana umplii memoria (cred ca ai 256 de locatii, da' nu-s sigur).

 

Restul intrebarilor nu le-am inteles.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări