 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Sergej Član

Pridružen-a: Tor 29 Avg 2006 19:43 Prispevkov: 280 Aktiv.: 1.22
|
Objavljeno: Pet Nov 03, 2006 5:27 pm Naslov sporočila: |
|
|
Sicer že nekaj let ne spremljam več to podričje. Zame je še vedno 99% tehnika, 99,9% laboratorij in 99,99% teorija. Dopuščam možnost, da je bil na tem področju narejen velik korak naprej. Vendar sem vseeno skeptičen glede digitalnega multimetra razreda 0,02 - že zaradi kontaktov.
Sicer mi digitalci niso bili nikoli všeč. Mogoče zato, ker sem za pol metra dolgim displejem vedno našel sliko osla. |
|
Nazaj na vrh |
|
 |
arksi Član

Pridružen-a: Sre 03 Sep 2008 10:19 Prispevkov: 748 Aktiv.: 3.65 Kraj: Dolenjska
|
Objavljeno: Tor Mar 06, 2012 10:21 pm Naslov sporočila: |
|
|
".....Čez nekaj let....."
Imam senzor DS18B20, ki ima 12 bitno vzorčenje temperature. Rad bi prikazal na LCD desetinke stopije celzija. Izmerjeno vrednost temperature DS18B20 prikažem na LCD, vendar kaže kar neko temp. cca 20 stopinj premalo.
Sem gledal datasheet, ampak nekako ne "pokapiram" kako pravilno prikazati temperaturo. Pri DS18S20 senzorju sem, po primerih od Vilkota S., samo izmerjeno vrednost delil z 2 in že sem imel temperaturo na pol stopinje natančno.
Poizkusil sem množiti izmerjeno vrednost z 0.0625, ampak ne kaže prave temperature.
Vem, da DS18X20 odstopajo za pol stopinje ali še več, ampak pustimo zdaj to.
Torej: kako pravilno prikazati stopinje in desetinke celzija. No, ali pa vsaj polovičke stopinje .
LP |
|
Nazaj na vrh |
|
 |
MarkoM Član

Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 12.34 Kraj: Lovrenc na P.
|
Objavljeno: Sre Mar 07, 2012 12:13 am Naslov sporočila: |
|
|
Karkoli delaš s tem senzorjem, ko ne boš dobil natančnosti temp. na desetinko. Prikažeš na zaslonu pa lahko na poljubno število decimalk. |
|
Nazaj na vrh |
|
 |
arksi Član

Pridružen-a: Sre 03 Sep 2008 10:19 Prispevkov: 748 Aktiv.: 3.65 Kraj: Dolenjska
|
Objavljeno: Sre Mar 07, 2012 6:56 am Naslov sporočila: |
|
|
@MarkoM, vem kako je z natančnostjo........in po kakšnem postopku prikažem na LCD temperaturo na decimalko natančno? Tega mi nisi povedal.
Sprašujem ravno to, kakšen je prostopek pri DS18B20, da iz senzorja prikažem temperaturo na desetinko stopinje? Postopek branja temperature iz DS18B20 ni isti kot pri DS18S20. Iz DS18S20 znam na LCD prikazati temperaturo.
LP |
|
Nazaj na vrh |
|
 |
xfce Član

Pridružen-a: Čet 28 Jul 2011 8:06 Prispevkov: 521 Aktiv.: 3.07
|
Objavljeno: Sre Mar 07, 2012 8:31 am Naslov sporočila: |
|
|
V pdfju so primeri pretvorbe.
recimo:
Citiram: |
0000 0001 1001 0001 +25.0625 |
Sam sem naredil tako, verjetno je še elegantnejši način. Zadnje štiri mesta pomenijo decimalko. V tem primeru je 0001, kar je desetiško 1, to pomnožim s 625 in dobim 625.
Srednja štiri mesta je pa ravno signed char, kar je 25.
To se pravi 25 + (625 * 0.0001) = 25.0625
Ampak je sigurno še lažja varijanta. Možno je, da lahko kar v floating point porineš zadevo. Ne vem. |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Sre Mar 07, 2012 8:33 am Naslov sporočila: |
|
|
Postopek branja je enak, le rezultat je malce drugače podan. Poglej sliko 2 in tabelo 1 v obeh datasheetih... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
dule26 Član

Pridružen-a: Tor 28 Sep 2010 7:30 Prispevkov: 26 Aktiv.: 0.14 Kraj: Murska Sobota
|
Objavljeno: Sre Mar 07, 2012 11:18 am Naslov sporočila: |
|
|
Jaz bi naredil po naslednjem postopku.
Iz senzorja dobiš dva podatka: LS BYTE in MS BYTE, razvidno iz slike 2.
Nato podatke pretvoriš v celo število in decimalno število:
Programska koda bi lahko izgledala takole:
unsigned int celo;
unsigned int decimalno;
celo = ((LS_BYTE&0xF0>>4)) | ((MS_BYTE&0x07) << 4);
decimalno = ((LS_BYTE&0x08)*5000) + ((LS_BYTE&0x04)*2500) + ((LS_BYTE&0x02)*1250) + ((LS_BYTE&0x01)*625);
Na LCD izpišeš najprej celo, izpišeš piko in nato še decimalno število. |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Sre Mar 07, 2012 11:27 am Naslov sporočila: |
|
|
unsigned?
Temperatura je lahko tudi negativna... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Mar 07, 2012 12:12 pm Naslov sporočila: |
|
|
Ahh...
Komplicirate!
Integer vrednost senzorja pretvoriš v float in jo deliš s 16.
Primer:
Vrenost binarno 0000 0001 1001 0001 = 401 desetiško, ko jo deli s 16 dobiš 25.0625.
Lahko pa 401 pomnožiš z 10 nakar deliš z 16, zaokrožiš rezultat in dobiš 251 desetink celzija, vrednost izpišeš na zaslon in postaviš decimalno piko.
LP GJ
Nazadnje urejal/a GJ Sre Mar 07, 2012 12:14 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Sre Mar 07, 2012 12:14 pm Naslov sporočila: |
|
|
float? resno?
 _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Mar 07, 2012 12:18 pm Naslov sporočila: |
|
|
gumby je napisal/a: |
float? resno?
 |
Zakaj pa ne?
Matematika s plavajočo vejico ti recimo na PIC16xxx vzame manj kot 512 code wordov.
LP GJ |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.36
|
Objavljeno: Sre Mar 07, 2012 12:38 pm Naslov sporočila: |
|
|
Spodnji 4 biti predstavljajo decimalni del temperature v 1/16 stopinj. To cifro lahko množiš z 100 in deliš z 16 (ki je v celoštevilčni aritmetiki shift za 4 bite) in imaš rezulzat v stotinkah. Celi del temperature je pa tudi samo shift za 4 bite...
Ti se kar igraj z float, če hočeš... nihče ti ne brani. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Mar 07, 2012 12:44 pm Naslov sporočila: |
|
|
Kompliciraš...
No, če nimaš knjižnice s plavajočo vejico ali pa, da ti je procesorski čas zelo pomemben potem narediš takole:
1)Preveriš predznak temperature, če je negativen si predznak zapomniš, da ga kasneje izpišeš nakar vrednost temperature negiraš.
2)Pretvoriš najvišjih 8 bitov (pravzaprav 7, zadnji je vedno 0) v decimalno število in ga izpišeš na LCD.
Pretvorbo lahko narediš z deljenjem z deset, nakar izpišeš rezultat in ostanek deljenja ali pa uporabiš tabelo, ki ti preslika binarno vrednost byta v desetiško.
3)Za zadnje štiri bite torej decimalno mesto, lahko zopet vzameš 16 byte-no tabelo.
0 = 0 (0/16)
1 = 0 (1/16)
2 = 1 (2/16)
3 = 2 (3/16)
4 = 3 (4/16)
5 = 3 (5/16)
...
14 = 9 (14/16)
15 = 9 (15/16) |
|
Nazaj na vrh |
|
 |
dule26 Član

Pridružen-a: Tor 28 Sep 2010 7:30 Prispevkov: 26 Aktiv.: 0.14 Kraj: Murska Sobota
|
Objavljeno: Sre Mar 07, 2012 12:52 pm Naslov sporočila: |
|
|
Citiram: |
unsigned?
Temperatura je lahko tudi negativna... |
Vem da je temeperatura lahko tudi negativna, podal sem samo primer, lahko pa samo preveriš predznak v podatku MS_BYTE in naprej delaš z unsigned, pač malo logike, kjer vse pretvoriš.
Citiram: |
To cifro lahko množiš z 100 in deliš z 16 (ki je v celoštevilčni aritmetiki shift za 4 bite) in imaš rezulzat v stotinkah. |
Zakaj pa nebi množil samo z 16 in bi dobil enak rezultat. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Sre Mar 07, 2012 1:49 pm Naslov sporočila: |
|
|
dule26 je napisal/a: |
Zakaj pa nebi množil samo z 16 in bi dobil enak rezultat. |
Zato ker je 100 /16 = 6.25!
LP GJ |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|