Bird Postat Octombrie 16, 2008 Partajează Postat Octombrie 16, 2008 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 spre comentariu
Abram Burel Postat Octombrie 17, 2008 Partajează Postat Octombrie 17, 2008 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 Link spre comentariu
Bird Postat Octombrie 17, 2008 Autor Partajează Postat Octombrie 17, 2008 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 spre comentariu
Abram Burel Postat Octombrie 18, 2008 Partajează Postat Octombrie 18, 2008 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 spre comentariu
Bird Postat Octombrie 18, 2008 Autor Partajează Postat Octombrie 18, 2008 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 spre comentariu
Bird Postat Noiembrie 15, 2008 Autor Partajează Postat Noiembrie 15, 2008 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 spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum