Jump to content
ELFORUM - Forumul electronistilor

Scriere / citire EEPROM in MicroCode Studio


Recommended Posts

Va salut ,

 

Ajutati-ma cu ceva sfaturi , daca puteti si vreti !

Am un display cu leduri pe care deplasez un text scris intr-o memorie I2C . Doresc sa sa scriu la o adresa oarecare temperatura citita cu un senzor DS 1820 , pe care apoi sa o citesc si sa o afisez pe display ...dar nu reusesc .

Textul scris initial il citeste caracter cu caracter in cod ASCI , pe care-l "tranform " apoi in leduri aprinse corespunzatoare caracterului respectiv . Nu stiu cum sa inserez in textul respectiv rezultatul masuratorii senzorului pentru a fi citit tot in cod ASCI cifra cu cifra .

 

Va multumec !

Link to comment
  • Replies 5
  • Created
  • Last Reply

Top Posters In This Topic

In general, asta inseamna "conversie binary-BCD" apoi tabela de look-up pentru conversia BCD-afisaj.

Daca programul "stie" ASCII, atunci de la BCD la ASCII e un drum simplu: ASCII=30H+BCD

Sa traiesti Burel ,

 

Eu scriu la inceput asa :

 

 

for adr = 0 to 40

lookup adr,[" TEMPERATURA ESTE DE 00,00 " ],C

 

I2cwrite I2CDAT , I2CCLK , $A0,ADR,[C]

 

pause 5

next adr

Mai tarziu in program vin si suprascriu ( mai corect spus incerc sa supra scriu ) in loc de 00,00 temperatura citita de senzor .

 

adr = 22

I2cwrite I2CDAT , I2CCLK , $A0,ADR,[????????????] .Te rog , spune-mi concret ce trebuie sa scriu aici pentru a functiona .

 

Iti multumesc !

Link to comment

Hmmm, ma pui pe studiat... Una la mana, nu stiu MicroCode (MC) :) asa ca nu o sa ma bag prea mult in... detaliiDS1820Deci da temperatura pe 2 bytes- cel mai semnificativ (byte1) e semnul 0x00 + / 0xFF - deci (nu e in MC, ci intr-un fel de pseudo):if byte1=0x00 then semn=0x20 else semn=0x2C ; blank (0x20) pentru + si minus (0x2C) pentru -- cel mai putin semnificativ este temperatura in pasi de jumatati de grad; in plus pentru temperaturi negative valoarea este complementata binar; ca sa scoti modulul faci:byte0 = (byte0 XOR byte1) + 1- deoarece rezolutia e de juma de grad, primul bit al lui byte0 iti va arata daca e vorba de o temperatura XX,00 sau XX,50if byte0(0) = 0 then digit1 = 0x30 else digit(1) = 0x35 ; cifra 0 in ASCII e 0x30, iar 5 e 0x35- evident cadigit0 = 0x30 ; te poti gandi sa muti "punctul zecimal" XXX,X, macar pentru ca DS masoara pana la 125 grade :)- acum trebuie sa scapam de zecimala:byte0 = byte0 / 2 ; avem un numar in binar, reprezentat pe un octet (de fapt 7 biti), pe care trebuie sa-l scriem ca 3 cifre zecimale; deci daca e vorba de 00100011 (35), va trebui sa scoatem digit2 = 0x35 si digit3 = 0x33; daca MC nu are functii de tip bin2bcd, atunci va trebui sa faci tu conversia; algoritmii ii gasesti pe net; dupa conversie vei avea, de exempludigit2 = 5digit3 = 3ultimul pas va fi:digit2 = digit2 + 0x30digit3 = digit3 + 0x30Sper sa te ajute.

Link to comment

Hmmm, ma pui pe studiat... Una la mana, nu stiu MicroCode (MC) :) asa ca nu o sa ma bag prea mult in... detaliiDS1820Deci da temperatura pe 2 bytes...................................................Sper sa te ajute.

Iti multumesc mult pentru incercarea de a ma ajuta . Uite mai jos un tabel cu ce da senzorul :TEMPERATURE/DATA RELATIONSHIP TEMPERATURE DIGITAL OUTPUT DIGITAL OUTPUT_______________(Binary) ____________(Hex)+85.0°C* 0000 0000 1010 1010 00AAh+25.0°C 0000 0000 0011 0010 0032h+0.5°C 0000 0000 0000 0001 0001h0°C 0000 0000 0000 0000 0000h-0.5°C 1111 1111 1111 1111 FFFFh-25.0°C 1111 1111 1100 1110 FFCEh-55.0°C 1111 1111 1001 0010 FF92h deci numai byte -ul din dreapta e de folos , pe cel din stanga il pun intr-o formula ca atunci cand e "ffh sa-mi scrie semnul minus . Nu stiu cum sa convertesc din binar / hexa in zecimal . Daca reusesc asta , scriu zecimal , care zecimal fiind intre ghilimele il citeste ca ASCI ...si gata ( sper ) . Daca nu gasesc o regula de transformare in zecimal , o sa incerc sa-mi fac o subrutina pentru asta . In ce priveste ce este dupa virgula , exista un registru " COUNT REMAIN " tot de un byte pe care o sa-l convertesc si o sa-l pun dupa virgula . Am facut asa ceva pentru afisarea pe un LCD , si merge OK ! Cu stima ,
Link to comment
  • 4 weeks later...

Raspunsul e urmatorul...

 

Am definit variabilele :

 

temperature Var word ' Temperature storage

count_remain Var Byte ' Count remaining

count_per_c Var Byte ' Count per degree C

tem var word ' partea zecimala a masuratorii

 

zecimi VAR BYTE

sutimi var byte

mii VAR BYTE

sute VAR BYTE

zeci VAR BYTE

unitati VAR BYTE

 

Stabilesc relatiile :

 

TEMPERATURE = (temperature.LOWBYTE)/2

tem = 100- (100/16)*(count_remain)

 

sute = 48 +(temperature // 1000/100)

zeci = 48+(temperature //100/10)

unitati = 48+(temperature // 10)

zecimi = 48+(tem/10 )

sutimi = 48+(tem//10)

 

 

Apoi scriu in memorie :

 

adr= adresa unde vreau eu sa scriu datele

i2cwrite I2CDAT, I2CCLK, $A0, adr,[zeci,unitati,".",zecimi,sutimi,"gr.C"]

 

SI ....GATA !

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines