Mihai Popa Postat Iunie 21, 2011 Partajează Postat Iunie 21, 2011 Buna ziua.Va rog sa ma ajutati cu urmatoarea problema: as dori sa extrag 2 sau mai multi biti dint-un word. De exemplu:word=0000000011011011Ma intereseaza sa extrag biti de pe ultimele 4 pozitii, apoi de pe urmatoarele doua s.a.m.d.Concret, este vorba de citirea temperaturii unui senzor DS18B20 si interpretarea acesteia.Microcontrolerul este PIC16F628A iar afisarea este pe 4x7 segmente.Compilatorul este MikroBasic.Va multumesc anticipat. Link spre comentariu
vasile eugen Postat Iunie 21, 2011 Partajează Postat Iunie 21, 2011 nu stiu in ce este facut dar poate te ajuta.. Link spre comentariu
Mihai Popa Postat Iunie 21, 2011 Autor Partajează Postat Iunie 21, 2011 Multumesc. Schema o am, o voi posta maine, deoarece o am pe PC-ul de la munca.Problema mea este ca nu inteleg cum se face extragerea unor biti din diverse pozitii ale unui word. Link spre comentariu
Liviu M Postat Iunie 21, 2011 Partajează Postat Iunie 21, 2011 Buna ziua.Va rog sa ma ajutati cu urmatoarea problema: as dori sa extrag 2 sau mai multi biti dint-un word. De exemplu: word=0000000011011011 Ma intereseaza sa extrag biti de pe ultimele 4 pozitii, W = 00000000 11011011 ultimele_4_W = 0x000F apoi de pe urmatoarele doua W = 00000000 11011011 urmatoarele_2_W = (W>>4) & 0x0003 Compilatorul este MikroBasic. Din pacate ce am zis mai sus e in C; nu stiu basic, am vazut in timp ce postam ultima "cerinta"... LE Daca in basic nu exista operatia de deplasare (>>4 de mai sus), poti imparti cu 2^x, unde x e numarul de biti "de deplasare". Link spre comentariu
francezu Postat Iunie 21, 2011 Partajează Postat Iunie 21, 2011 Metoda propusa de Liviu M este corecta si se bazeaza pe mascarea bitilor nefolositori. Se face SI logic intre variabila de intrare si o constanta ce are setati doar bitii ce dorim sa-i extragem. Pt a veni in completarea celor spuse de Liviu, in mikrobasic avem : -pt a extrage primii 4 biti(jumatatea inferioara din LSB ) ai unei variabile de tip word scriem nibble= Lo(_word) and 0x0F ' Lo() selecteaza byte-ul inferior din _word- pt urmatorii 4 biti nibble= Swap(Lo(_word) and 0xF0) ' Swap() inverseaza cele doua jumatati ale byte-ului - in continuare nibble=Hi(word) and 0x0F ' Hi() selecteaza byte-ul superior din _word si, nibble=Swap(Hi(word) and 0xF0)nibble este de tip byte Link spre comentariu
10vid Postat Iunie 21, 2011 Partajează Postat Iunie 21, 2011 De ce trebuie extrasi toti bitii aia? Nu sunt cu compilatoarele dar oare nu exista rutine care sa afiseze numere float pe 7seg? Astfel totul devine prea simplu: temperatura = word / 16 // rezultat gata pentru afisare in variabila de tip float Link spre comentariu
kit Postat Iunie 22, 2011 Partajează Postat Iunie 22, 2011 ds18b20... temperatura, impreuna cu semnul ei, se stocheaza pe doi octeti, LS si MS.modalitatea de lucru este cea indicata de liviu, cred, nu am habar de basic, dar in C am facut asa:pentru a obtine partea fractionara a temperaturii se mascheaza (and) ls byte cu 0x0f;pentru a obtine valoarea intreaga:- se face shift pana la bitul 4, adica impartirea ls byte cu 16 (>>4);- se mascheaza (and) ms byte cu 0x03, apoi se inmulteste cu 64 (<<6); ar merge si inmultit direct, fara mascare;- se aduna cele doua rezultate.pentru a obtine semnul se mascheaza (and) cu 0xfc, iar daca rezultatul este 0xfc atunci am temperatura negativa, altfel (0x00) am temperatura pozitiva. Link spre comentariu
Liviu M Postat Iunie 22, 2011 Partajează Postat Iunie 22, 2011 - se face shift pana la bitul 4, adica impartirea ls byte cu 16 (>>4);- se mascheaza (and) ms byte cu 0x03, apoi se inmulteste cu 64 (<<6); ar merge si inmultit direct, fara mascare;Nu-i mai simplu mascare cu 0x0030 si shiftarea stanga cu 2 biti? Link spre comentariu
Mihai Popa Postat Iunie 22, 2011 Autor Partajează Postat Iunie 22, 2011 Va multumesc pentru raspunsuri.Sincer, nu prea am inteles cum sta treaba.Am gasit in exemplele compilatorului MikroBasic urmatorul cod: Onewire (il postez ca atasament). Acest cod functioneaza in Proteus, insa temperatura este afisata pe un LCD 2x20 caractere.Pe mine ma intereseaza afisarea pe 4x7 segmente.Am modificat codul respectiv astfel: Term cu 628A segments v2 (in atasament).Schema este urmatoarea: Term cu 628A segments.pdf.Ideea este ca programul original functioneaza corect simulat in Proteus.Cel modificat, imi afiseaza pe segmentele 2,3 si 4 cifra"7.", indiferent de modificarea temperaturii senzorului, si nu ma prind de ce. Link spre comentariu
nico_2010 Postat Iunie 22, 2011 Partajează Postat Iunie 22, 2011 Incearca asta.Vei vedea ca merge. Link spre comentariu
francezu Postat Iunie 22, 2011 Partajează Postat Iunie 22, 2011 Leaga pin-ul MCLR la VDD, daca n-ai dezactivat MCLRE din soft. Pe bus-ul OneWire este suficienta o singura rezistenta de pull-up de 1-5kohmi. In serie cu display-ul 7-seg trebuie sa pui rezistente de limitare a curentului, leaga ceva in jurul a 100- 470 ohmi pe liniile a-g ale display-ului. Digitii trebuie sa-i comanzi cu tranzistori, pic-ul nu tine curentul unui digit aprins full. Pt display cu anozii comuni folosesti PNP, pt catozi comuni folosesti NPN, ambele variante in montaj emitor comun. Despre cod : 1.Aprinzi digitii facand port-ul pic-ului iesire, si ii stingi facand port-ul intrare, dar nu initializezi port-ul cu valorile potrivite. Mai usor este sa lasi port-ul ca iesire si sa pui pe 1/0 logic iesirea corespunzatoare. Citesti temperatura la ~200ms dar senzorul are timp de conversie de ~750ms. 2. Faci conversia digitilor din binar in ASCII ( +48), dar nu mai este necesar pt ca nu mai afisezi pe lcd. 3. Faci multiplexarea display-ului in linie cu celelalte task-uri, nu e cea mai buna solutie, mai corect ar fi cu intreruperi. Vezi AICI cum se face multiplexarea unui display 7-seg. Link spre comentariu
Mihai Popa Postat Iunie 22, 2011 Autor Partajează Postat Iunie 22, 2011 nico_2010, in arhiva nu este codul sursa, cu extensia .mbas. Link spre comentariu
nico_2010 Postat Iunie 22, 2011 Partajează Postat Iunie 22, 2011 Scuze!Il atasez din nou. Link spre comentariu
Mihai Popa Postat Iunie 29, 2011 Autor Partajează Postat Iunie 29, 2011 Salutare.Imi pare rau de intarziere cu raspunsul. Am reusit si am realizat termometrul. Aveam o problema in sensul ca foloseam senzorul DS18B20P PAR, care merge doar in mod parasit. Ideea este ca la acest senzor, dupa comanda de incepere a conversiei, trebuie tinut portul DQ la 5v pentru 750ms. Si in configuratia mea, imi clopoceau rau ledurile din afisaj.Asa ca am cumparat un DS18B20 si am realizat montajul.Voi incerca si varianta cu DS18B20P insa cu un afisaj LCD.Atasez intregul proiect, poare este cineva interesat de asa ceva.Va multumesc pentru ajutor. Link spre comentariu
Stefan Postat Iunie 29, 2011 Partajează Postat Iunie 29, 2011 offtopic: la mine cum a mers sa scriu 628-ul cu pickit2? 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