» »

Termometer na USB vodilu (načrt, vezja, izkušnje in slike) :P

Termometer na USB vodilu (načrt, vezja, izkušnje in slike) :P

«
1
2 3
...
5

TheHijacker ::

Že v naprej se opravičujem za s/z člene, da ne bo komentarjev na to... :D
********************
Po uspešni izdelavi USB IR sprejemnika sem poln elana in navdušenja, ker mi je nekaj uspelo sestavi, šel googlat za novimi načrti, ki bi jih celo sam zmožen bil sestavit.

Bodisi so prekomplicirani ali pa uporabljajo čudne čipe (vse kar ni od Atmela ;)). Ustavil pa sem se na neki strani napisani v ruščini in v grabljicah, kjer se je malce nižje od začetka strani bohotila slika vezja s slavnim AT90S2313 čipom, ki je starejši brat čipa AT90S2323, kar sem uporabil v načrtu ir sprejemnika. Stran g. Denis Nechitailov lahko tusi sami preberete tukaj oziroma v šlampasti angleščini googlovega prevoda. Denis si je ustvari lasten USB termometer, ga zvezal na USB vodilo in kolikor sem razbral ga uporabil v programu za CB postaje (radioamaterstvo?). Nimam pojma zakaj. Verjetno iz istega razloga kot jaz... iz firbca če deluje.

Vzel je kodo mjoy naprave, za priklop lastne igralne naprave na USB vodilo, jo priredil, napisal svoj program in vse skupaj v ruskem jeziku objavil na svoji strani. Tudi kodo in firmware, boste dobili tam.

Iz sledeče skice:



sem izdelal svojo, glede na zmožnost postavitve elementov na testno ploščico in nastalo je sledeče vezje:



Sestavljeno zadeva izgleda takole:

Spredaj:


Zadaj:


V škatli spredaj:



V škatli zadaj:


Postopek izdelave je bil sledeč:

Najprej sem šel v nakup elementov. Na Denisovi strani piše, da naj bi zadeva delovala tudi s ATTiny čipi in ker nisem dobil nikjer več starega AT90S2313 lčipa sem vzel čip ATTiny2313-20PU, ki je tudi cenejši in skoraj identičen. Drugi glavni element vezja pa je temperaturni senzor. Denis pravi da naj bi delovalo vezje s DS18B20 ali DS18S20 senzorjem (objavil je tudi dva firmwara, glede na senzor). Ker DS18S20 nisem nikjer našel, sem kupil starejši model DS18B20. Ostali elementi so standardni.

Stroški:

1x DS18B20 temperatorni senzor (ali DS18S20) (2.34€)
1x Atmel ATTiny2313-20PU mikrokontroler (2.36€)
2x podnožje 20 pin (1x za programator) (0.30€)
1x 1.5k upor (0.03€)
1x 4.7k upor (0.03€)
2x kvarz 12Mhz (1x za programator) (0.8€)
2x 15 pF kondenzator (0.1€)
1x 100 nF kondenzator (0.05€)
1x 10 uF kondenzator (0.05€)
************************************
Skupaj: 6.06€

Veliko ceneje kot 28€ za komercialni produkt. Temperaturni senzor sem kupil v IC, ostalo pri HTE. Vse preko interneta, tako da na to ceno je treba dat še precej poštnine. Ampak če ste kje blizu doma, boste brez poštnine pa še zmigali se boste.

Programator:
Enako kot pri IR sprejemniku sem naredil najbolj enostaven programator. Na linije čipa gredo sledeče LPT žičke:

vcc = 2, 3, 4, 5
reset = 7
sck = 8
mosi = 9
miso = 10

Sestavljeno zadeva izgleda takole:

Spredaj:


Zadaj:


Vse povezave je treba 3x preverit! Napačna vezava lahko uniči LPT port ali v najslabšem primeru osnovno ploščo! Vsaj tako piše avtor na svoji strani. Piše tudi, da je treba dat neke upore vmes. No. Jaz jih nisem in isto deluje >:D
Zoper sem programiral s programom AVRDude in sicer s tole vrstico (ZA ATTINY2313 MODEL!!!):

avrdude.exe -p t2313 -c bsd -U flash:w:usbthermb.hex:i -U lfuse:w:0xcf:m

Če imate original AT90S2313 čip potem naj bi bil dovolj samo ta ukaz:

avrdude.exe -p t2313 -c bsd -U flash:w:usbthermb.hex:i

V kolikor imate DS18S20 čip potem zamenjajte HEX datoteko s usbtherms.hex.

Pri ATTiny2313 so zelo pomembne FUSE nastavitve bitov, ki določajo kako naj čip deluje. Nevešč in z mislijo da je treba probat, da vidiš če deluje sem z napačno nastavitvijo fuse bitov zaklenil čip, tako da ga ne morem več sprogramirat oziroma mi ga programatar sploh ne najde. Zato pazljivo glede tega! K sreči sem zopet vse kupoval dvojno. Tudi temperaturni senzor, ki sem ga po murphiju narobe priklopil in sem ob prvi priključitvi vezja na USB videl lep temen dim in čudovito aromo po sežigaju plastike.>:D Zato pazljivo pogledat kakšna je prava razporeditev nogic na teh senzorjih!

Po iskanju pravih nastavitev (hvala VolkD in pa google) sem ob priklopu doživel, da je Windows našel novo napravo (Termometer) in... NI vprašal za gonilnike. To pa zato, ker je program v čipu napisan tako, da izkorišča HID USB tehnologijo, kot jo izkoriščajo miške, joysticki, tipkovnice,... Kar pomeni da ne potrebuješ nobenih gonilnikov. Ko je napravo našel sem zagnal Denisov program in dobil tole:



Uspeh!

Ker sem programer sem šel gledat kako ta program deluje. Koda je vzeta iz nekega drugega USB termometra zato je precej nametana, ker ja Denis samo dodajal svoje stvari. Najbolj me moti to, da naj bi senzor zaznal do 0.5 natačno, njegov program pa prikazuje samo cele številke. Poleg tega ima lep pogoj, da naj ne izpiše temperaturje, če je manjša od nič. Sam bi rad postavil senzor zunaj in ko bom prižgal PC mi bo izpisal zunanjo temperaturo.

Zato sem že v polnem zagonu, da napišem program od začetka v C++ Builderju, kjer najraje programiram. Bomo videli kako bo šlo. Bom pa kodo objavil tu, če me ne bo kdo prehitel.

Njegov program si beleži temperaturo v txt datoteko, ampak ob spremembi prepiše vrednost. Sam bi rad, da mi logira vsako spremembo in to log datoteko, lahko potem uporabim kje drugje (PHP in izdelava grafa, itd.)

Kakšno vprašanje?
http://www.google.si
  • zavaroval slike: Azrael ()

zcetrt ::

Le nekaj bolj ali manj nekoristnih opomb: 18b20 oz ekvivalent 1822 merita na 0.0625 stopinje C natančno. (če imaš možnost, poglej program v Atmelu, kje zaokroža oz. ali sploh upošteva teh podatkeov)

Dallas Maxim pošilja sample (zelo v kratkem času dobiš) zastonj.

Koliko stane pa ohišje oz. kje ga kupiš?
4.

TheHijacker ::

Hmm. Če te prav razumem zaokroža čip in ne njegov program? Zanimivo. Se ravnokar matram s programom in vedno dobim ven dva bajta. Npr.:

2A 01 -> 42 + (01 manjše/manjše 8) = 42 + 256 = 298 - 273 = 25 stopinj

manjše/manjše je kolikor vem shift left. Zakaj to naredi ne vem. In zakaj končnemu rezultatu odšteje 273 tudi nimam pojma. Ampak tako dela njegov program in zaenkrat sem identično naredil še v mojem. Zaenkrat izgleda zadeva takole:



S TChartom se še precej lovim. Če ga kdo obvlada naj me kontaktira na privat.

Glede samplov. Sem jih naročil par tednov nazaj pa jih še nisem dobil. 2x B in S model torej skupaj štiri. Zato sem jih šel kupit v IC.

Ohišje sem kupil pri HTE. Stane 0,69€. Odlično se prilega vezju. Istega sem uporabil že pri IR sprejemniku. Samo luknji zvrtam na obeh straneh.

Če je kdo tu, ki bi mi lahko pomagal pri preprogramiranju, tako da bi lahko v polno izkoristil natančnost senzorja, naj se mi prosim javi.
http://www.google.si

Zgodovina sprememb…

  • zavaroval slike: Azrael ()

MadMax ::

In zakaj končnemu rezultatu odšteje 273 tudi nimam pojma.

Morda zato, ker po defoltu senzor poda temperaturo v kelvinih?
Stvari so preproste, le ljudje smo neverjetni mojstri, da jih zakompliciramo.

TheHijacker ::

Aha! Imaš prav. Sam sem iskal povezavo s fahrenheiti :\. Še vedno pa bi se rad prepričal zakaj je programsko natančen samo na 1.0 namesto v decimalke, kot je senzor zmogljiv.
http://www.google.si

Shifty ::

Super stvarca mogoce se pa celo lotim tega:D Zanima me ce je mozno sprogramirat da bi mi v nekem okencu kazalo to temperaturu in se temperaturo procesorja in graficne (speedfan in atitool), bi bilo tezko? Ker nimam pojma o programiranju:D
AMD X3 720 Black@3200
Sapphire 790GX

TheHijacker ::

Verjetno se da. Rabiš samo implementirat HID. Tule je ena zanimiva stran glede tega.
http://www.google.si

zcetrt ::

Že sam 1822 senzor (oz. njemu slični) naredi konverzijo temperature in mikrokontrolerju pošlje digitalni signal, ki je dolg 16b, a 5 MSB bitov je neizkoriščenih (razen za predznak). DS ne podaja temperature v kelvinih. Signal za 0 stopinj je 0000 0000 0000 0000, za -0.0625 pa 1111 1111 1111 1110. Če seveda zadnje 4 bite zanemariš (jih ne prebereš oz. upoštevaš) dobiš resolucijo le 1 stopinjo, in ker prvi štirje nimajo pol tiča veze z rezultatom konverzije, tako prideš le na en bajt podatkov. Kar bi lahko bil vzrok, da je program spisan tako, kot je. Tu imam v mislih predvsem program v mikrokontrolerju, kaj se dogaja naprej, ne vem.

Poglej si morda datasheet senzorja na Dallas Maximovi strani. Atmelov ne poznam, uporabljam PICe in imam tudi programator zanje. Programiram v assemblerju in c-ju, ampak pod Windowsi nisem še nič naredil (le v DOSu z Borlandovimi prevajalniki in za mikrokontrolerje). Bi mi lahko svetoval, katero orodje je primerno za narediti kakšen takle USB vmesnik v Windowsih, ki potem recimo prikazuje temperaturo v oknu in mogoče še kakšen tutorial? Predvidevam, da driverji so že spisano za USB, ali pač ne...
4.

TheHijacker ::

zcetr:

Kontaktiral sem avtorja vezja in dobil sledeči odgovor:

I have made a 1 degree resolution just to fit into the standard HID
thermometer specification. Ideally, any software that can read data
from the HID thermometer can work with my device. But there is no such
a software! ;-)

You may re-write the HID descriptor table to pass any data in a
non-standard format.


To da takšnega softwarja nima prav, ker sem ga enostavno sam spisal. So dve variatni kako priti do HID naprav. Preko DDK header fajlov (to kar on uporablja) ali s posebnim dodatkom (za Delphi in C++ Builder) imenovanim Human Interface Device controller suite. Slednje sem tudi sam uporabil in rezultat je tista slikca programa. Ampak trenutne vrednosti so identične, ki ji jih dobim tudi s njegovo kodo, torej zaokrožene in pa kot kaže v kelvinih. Izvorno kodo bom objavil, samo da porihtam, da mi pravilno riše graf. Je zelo zelo kratka 8-).

zcetrt: Če se kaj spoznaš na assembler, bi mi bil pripravljem pomagat spremenit firmware kodo, tako da bi podatki iz senzorja ostali nespremenjeni in bi jih potem programsko sam pretvarjal? Če je čip tega zmožen, ne vem zakaj ga ne bi izkoristil :\.
http://www.google.si

link_up ::

jaz bi zacel z delphi in Visual Studio(C#). Tam se da lepo pisat programcke za usb/serial/firewire...

lahko pa kdo namesto atmela proba TUSB3410 8051 procesor :) Stvar ze ima vgrajen rs-232/uart->usb vmesnik :) 1wire komunikacijo za dallaske pa tudi ni tako tezko napisat(prej enosatvno). Le s programatorjem zna biti malce kriz...

ps: zadnje case mi je pa ST vsec zaradi teh projektov ;) Da ni vedno overclocking in overkill :)
In and Out

zcetrt ::

V tem delu se potrjujejo moje zle slutnje o neupoštevanju dela informacije o izmerjeni temeraturi.

andi temp0, 0b11110000
andi temp1, 0b00000111
or temp0, temp1
swap temp0

Z maskami ubije nekaj bitkov, podatek pa nato stlači v en bajt. O delu kode, ki je napisan zgolj zaradi USB komunikacije nimam pojma, saj je preobširna, da bi se poglabljal vanjo in še spisana za mikrokontroler, ki ga ne poznam. O HID-u si bom prebral link, zaenkrat ne vem za kaj se gre... Iz kode pa sklepam (nekaj komentarjev in imen spremenljivk), da se device predstavi kot joystick. Kateri podatki in kako se torej pošiljajo preko USB-ja ne vem, zato kode ne znam spremeniti tako, da bi bila resolucija večja. Poslati bi moral namreč 2 bajta podatkov, tu pa se očitno pošlje le en bajt, ki nosi informacijo o temperaturi. Se bom pa spravil pisati to aplikacijo s PICem, ki ima USB podporo. Ampak ne pričakujte prav kmalu, saj nimam pojma o okenskem programiranju.

Visual Studio torej. Kaj pa Visual Basic?
4.

Ch4N93 ::

tudi Atmel ima USB mikrokontrolerje. Podajam še nekaj povezav:

A Firmware-Only USB Driver for Atmel AVR Microcontrollers na strani je USB firmware spisan v C-ju

uporaba USB driverja iz prejšnega linka

Še link na AVR Freaks, kjer imajo res dober forum. Objavljenih je tudi veliko projektov.
Ni nam lahko...

TheHijacker ::

Imaš prav. Tu se začne branje in je različno glede na senzor (B ali S model).

; Read

rcall Reset1Wire
ldi temp2, 0xCC ; Skip ROM
rcall ReadWrite1Wire
ldi temp2, 0xBE ; Read
rcall ReadWrite1Wire

ldi temp2, 0xFF
rcall ReadWrite1Wire
mov temp3,temp2

ldi temp2, 0xFF
rcall ReadWrite1Wire

.ifdef DS18B20

; 12-bit resolution

subi temp3, low(-0b00001000) ; add 0.5
sbci temp2, high(-0b00001000)

andi temp3, 0b11110000
andi temp2, 0b00001111
or temp3, temp2
swap temp3


ldi temp2, 0
sbrc temp3, 7
ldi temp2, 255
.else

; 8-bit resolution

subi temp3, low(-1) ; add 0.5
sbci temp2, high(-1)

lsr temp3
bst temp2,0
bld temp3,7

.endif

subi temp3, low(-273)
sts JoyVal, temp3
sbci temp2, high(-273)
sts JoyVal+1, temp2


Jao. Tole ni niti približno podobno X86 tehnologiji >:D. Verjetno tu tudi prišteje 273, ki jih potem v programu odšteje. Se komu kaj več sanja, kako popravit ta del, da pusti LSB in MSB pri miru, ter pošlje naprej takšen kot je?

Za dostop do HID naprav preko Visual Basica si poglej to povezavo.
http://www.google.si

TheHijacker ::

Tako bi lahko izgledal program v C-ji, ki dekodira kodo iz senzorja, v kolikor je koda nespremenjena:

#include "stdio.h"

main(void)
{
unsigned int temp;
unsigned int msb, lsb;
int neg = 1;

// Primeri bitov iz dokumentacije
/*
temp = 0x07D0; // +125
temp = 0x0550; // +85
temp = 0x0191; // +25.0625
temp = 0x00A2; // +10.125
temp = 0x0008; // +0.5
temp = 0x0000; // +0
temp = 0xFFF8; // -0.5
temp = 0xFF5E; // -10.125
temp = 0xFE6F; // -25.0625
*/
temp = 0xFC90; // -55

// Izluscim LSB
lsb = temp & 0x00FF;

// Izluscim MSB
msb = (temp & 0xFF00) >> 8;

printf("MSB: %02X\nLSB: %02X\n", msb, lsb);

// Zdruzim nazaj (za vajo :))
printf("ZDRUZENO: %04X\n", (msb (manjše manjše) 8) + lsb);

// Negativna stevilka, preverim prve stiri bajte
if (((unsigned int)temp >> 12) == 0x0F)
{
// Obrnem bite (+1?)
temp = (temp ^ 0xFFFF) + 1;

// Izluscim LSB
lsb = (temp & 0x00FF);

// Izluscim MSB
msb = (temp & 0xFF00) >> 8;

// Negiram neg variablo, s katero se končna vrednost mnozi
neg *= -1;
printf("NEGATIVNA: %04X\n", temp+1);

} else
{
neg = 1;
}

printf("TEMPERATURA: %.4f\n", ( ((msb (manjše manjše) 8) + lsb) * 0.0625) * neg);

}


Malce sem se še igral s izluščenjem posameznih bitov tako da je pol kode viška. Tudi pri negativni temparaturi sem se malce lovil. Ni mi jasno zakoj moram dat +1 ko obrnem bite. Sedaj rabimo samo še nekako popravit firmware, da naj ne spreminja začetnih dobljene bitov iz senzorja.

Pe PDF dokument specifikacije temperaturnega senzorja, če koga zanima kaj proizvajalec piše o branju temperature.

Vsakršne ideje in pomoč bo več kot dobrodošla :)).
http://www.google.si

PaX_MaN ::

+1 -> eniški in/ali dvojiški kompliment (ne vem na pamet, pa bi moral:8) )

link_up ::

Klik ;) v c

in
Klik :) bascom, ki je preglednejsi za pregled bitov :)
In and Out

Zgodovina sprememb…

  • spremenilo: link_up ()

TheHijacker ::

Oba bereta direktno iz senzorja in pri obeh ni nikjer source od firmwara, ki se ga naloži na Atmel čip. Problem pri meni pa je, da v tem vezju senzor javlja atmel čipu, ki naredi čira čara in potem to posreduje dalje. Vse kar bi radil poštudirat, je to da se čira čara (pravilno) odstrani in pusti oba bita tako kot sta. Nesprememnjena bi že sam potem obdelal, kot sem pokazal v prejšni C kodi.

Drugače pa zelo zanimivo branje. Da. Tile AVR čipi so res ratali popularni.
http://www.google.si

zcetrt ::

Pri assemblerski kodi je žal pogosto tako, da je bolje vse spisati na novo, kot pa popravljati kodo drugega avtorja... Razen, če je res vse razumljivo. Da ne bi delal čira čara bi še šlo, ampak kako pošilja oz. da bi poslal dva bajta in da bi driverji to razumeli...

Sem pa razmišljal, da sploh ne rabiš nič periferije (no ja, 4k7 upor in še kakšnega za zaščito mamaplate), če bi šel delati z LPT vmesnikom. Samo senzor vtakneš notri in ustrezno komuniciraš z njim. Potem pa sem po krajšem iskanju našel tole: grabljice in slikica.

Ti senzorji pa omogočajo, da jih vzporedno na dve žički obesiš več in potem kličeš posamezne zakomunikacijo, tako da bi ob ustrezno napisanem programu za dostop do lpt v le-tega vtaknil le dve žički in nato komuniciral s potencialno tudi več kot 50 senzorji. Cena bi bila še nižja:)
4.

Ch4N93 ::

meni ni jasno, kaj čara tule:
subi temp3, low(-273)
od 8 bitnega registra namreč odšteva vrednost večjo (manjšo:) od samega registra
tudi tisti "low" ne vem kaj počne. Operacija na spodnjem nibble-u mogoče? samo potem še je bolj nesmiselno odštevanje 273

drugače pa se vidi v programu, da je najprej poskusil brez tega čira čara, potem pa je stvar zakomentiral, ter napisal čarovnijo.
Ni nam lahko...

link_up ::

kaj? Kako to mislis, da rabis firmware? Kakor te razumem bi ti rad popravljam assembler kodo. V zgornjih primerih imas samo naveden postopek branja in pisanja bitov. Vse je tudi lepo napisano v datasheetu za ds18b20. Tocnost je se vedno 0,5C, medtem ko lahko natancnost saltas. To pride prav, ko ne rabis meriti na celi skali ampak le kaksne 10 stopinj razlike.

Ukaz 0x44 ti torej vrne temperaturo in nekaj kontrolnih bitov. Potem vzames prave bite in jih preracunas po formuli, ki je navedea v pdfju. Tako dobis temp brez vseh decimalnih mest. Vsaj meni je tako delalo. Je pa cisto vseeno v katerem jeziku pises...princip je enak :)
In and Out

link_up ::

ps:

Tukaj ti bodo sigurno se najbolj pomagali ;)
In and Out

zcetrt ::

Nak, 1822 in 18b20 ti vrneta 16 bitov podatka o temperaturi, LSB je vreden 0.0625 stopinje. Formula za preračunavanje je pa pri npr. DS1821, ki ima 8 biten output.

Ampak tisto odštevanje 273 mi pa res ni jasno... Tudi drugačna sintaksa kot pri MPLABu.
4.

Ch4N93 ::

ti vrneta 16 bitov ja, registri pa so 8-bitni.
zato pa potem maskira zgornje in spodnje 4 (registra r17 in r18 - temp3, temp2), nato z operacijo or spravi vse v en register, na koncu pa zamenja nibble-a tega registra (spodnje in zgornje 4 bite). To je že tako nekdo prej razložil. Zakaj potem vpiše 0 oz. 255 v temp2 v odvisnosti od 7 bita v temp3 je že vprašanje.
Tisto odštevanje, pa je že znanstvena fantastika...
Ni nam lahko...

zcetrt ::

Kakšno informacijo ti prejmeš po USB-ju? Koliko bajtov?

Še malo sem vrgel uč na program in vidim, da je vse skupaj nekakšna mineštra, saj program dejansko je napisan za jozstick in lahko pošlje več kot le en bajt podatkov. Če prejmeš več bajtov in nekaterih na PC'-ju ne upoštevaš, bi bila modifikacija celo izvedljiva. Če pa prejmeš le en bajt, pa le s pomočjo crne magije, saj je spremenljivk, ki se tičejo komunikacije preko USB vodila malo morje.
4.

TheHijacker ::

Prejmem tri bajte. Ko naredim read dobim sledeče bajte v bufferju:

00 2C 01

oziroma v moje programu samo dva. Recimo

2C 01

in potem čira čara (funkcija za branje in pretvorbo):

AnsiString str;
char *ch;

ch = (char *) Data;

temp = (short)ch[0]+ ((short)ch[1] (manjse manjse) 8) - 273;
str.sprintf("%i °C", temp);

if (temp > 0)
Temp->Font->Color = clRed;
else if (temp < 0)
Temp->Font->Color = clBlue;
else
Temp->Font->Color = clGray;

Temp->Caption = str;


Torej je 2C 01 = 27°C

In kolikor vidim dobim dva bajta! Točno toliko kolikor naj bi senzor vrnil.
http://www.google.si

vuego ::

Tole čiračaro ti lahko js razložim:

če imaš 2C 01, pol pomeni izraz
temp = (short)ch[0]+ ((short)ch[1] (manjse manjse) 8) - 273;

naslednje:

vzameš ch[0], ki je enako 2C (44) in prišteješ c[1],ki ga prestaviš za en byte gor (shl 8)
se pravi, da sta tvoja temperatura v kelvinih v bistvu obrnjena bajta -> 01 2C hex = 300 K

300 -273 = 27 °C

Posledično bi znalo bit, da je prvi od treh bajtov (če imaš tri), tvoja decimalka

Zgodovina sprememb…

  • spremenil: vuego ()

TheHijacker ::

Vem ja, ker to je koda iz mojega programa ;).

Prvi dobljeni bajt je vedno nula. V bistvu dobim samo dva prava s vrednostjo.
http://www.google.si

zcetrt ::

Evo ga!

lds temp3, JoyVal
sts JoystickBufferBegin+2, temp3
lds temp3, JoyVal+1
sts JoystickBufferBegin+3, temp3

Tu ti naloži vrednosti za pošiljanje. In če sedaj pobrišeš magijo in modificiraš pošiljanje podatkov, je rutina ProcJoystickRequest morda takšna:



ProcJoystickRequest:

; clear ready flag to avoid data conflict
mov temp0, JoystickFlags
ldi temp0,0xFF
andi temp0,~JoystickDataReady
andi temp0,~JoystickDataRequest ; clear request flag to avoid call on next cycle
and JoystickFlags,temp0


; simulate call to AddCRCOut
; simply push point of return onto stack
ldi temp0, low(AddCRCOutReturn) ;ROMpointer to descriptor
push temp0
ldi temp0, high(AddCRCOutReturn)
push temp0

;sbi DDRD,5
;sbi PORTD,5

; Check

ldi temp2, 0xFF
rcall ReadWrite1Wire
or temp2, temp2
breq no_temp

; Read

rcall Reset1Wire
ldi temp2, 0xCC ; Skip ROM
rcall ReadWrite1Wire
ldi temp2, 0xBE ; Read
rcall ReadWrite1Wire

ldi temp2, 0xFF
rcall ReadWrite1Wire
mov temp3,temp2

ldi temp2, 0xFF
rcall ReadWrite1Wire

.ifdef DS18B20

; 12-bit resolution

nop
.else

; 8-bit resolution

nop

.endif

sts JoyVal, temp3
sts JoyVal+1, temp2

; Start

rcall Reset1Wire
ldi temp2, 0xCC ; Skip ROM
rcall ReadWrite1Wire
ldi temp2, 0x44 ; Start conversion
rcall ReadWrite1Wire


; rcall Reset1Wire

; sts JoyVal+1, temp2

; lds temp0, JoyVal
; lds temp1, JoyVal+1
;
; andi temp0, 0b11110000
; andi temp1, 0b00000111
; or temp0, temp1
; swap temp0


no_temp:

lds temp3, JoyVal
sts JoystickBufferBegin+2, temp3
lds temp2, JoyVal+1
sts JoystickBufferBegin+3, temp3


;cbi PORTD,5


ldi USBBufptrY,JoystickBufferBegin
ldi ByteCount,2+2 ;length of output buffer (only SOP and PID) + 2=length of report

push USBBufptrY
push ByteCount
rjmp AddCRCOut_2 ;addition of CRC to buffer

;***************************************************88



Zdaj boš mogoče celo dobil surove podatke, ki jih pošlje DS18b20. Lahko, da bosta bajta zamenjana. Temperaturo naj bi sedaj določil s pomočja datasheeta DS-ja.
4.

TheHijacker ::

Zelo, zelo, zelo blizu!

Bajti ki jih sedaj dobim se menjajo če samo dihnem na senzor. Edini problem je ker sta oba bajta enaka. Npr:

< 00 BE BE 00
< 00 C3 C3 00
< 00 C3 C3 00
< 00 C8 C8 00
< 00 C8 C8 00
< 00 C8 C8 00
< 00 CE CE 00
< 00 CE CE 00
< 00 D2 D2 00
< 00 D2 D2 00

Kar mi pomeni, da en bajt v redu pošlje, drugi pa se nekje izgubi oziroma prepiše s prvim. Še kakšna ideja? Sem pripravljen vse probat :D
http://www.google.si

zcetrt ::

ProcJoystickRequest:

; clear ready flag to avoid data conflict
mov temp0, JoystickFlags
ldi temp0,0xFF
andi temp0,~JoystickDataReady
andi temp0,~JoystickDataRequest ; clear request flag to avoid call on next cycle
and JoystickFlags,temp0


; simulate call to AddCRCOut
; simply push point of return onto stack
ldi temp0, low(AddCRCOutReturn) ;ROMpointer to descriptor
push temp0
ldi temp0, high(AddCRCOutReturn)
push temp0

;sbi DDRD,5
;sbi PORTD,5

; Check

ldi temp2, 0xFF
rcall ReadWrite1Wire
or temp2, temp2
breq no_temp

; Read

rcall Reset1Wire
ldi temp2, 0xCC ; Skip ROM
rcall ReadWrite1Wire
ldi temp2, 0xBE ; Read
rcall ReadWrite1Wire

ldi temp2, 0xFF
rcall ReadWrite1Wire
mov temp3,temp2

ldi temp2, 0xFF
rcall ReadWrite1Wire

.ifdef DS18B20

; 12-bit resolution

nop
.else

; 8-bit resolution

nop

.endif

sts JoyVal, temp3
sts JoyVal+1, temp2

; Start

rcall Reset1Wire
ldi temp2, 0xCC ; Skip ROM
rcall ReadWrite1Wire
ldi temp2, 0x44 ; Start conversion
rcall ReadWrite1Wire

no_temp:

lds temp3, JoyVal
sts JoystickBufferBegin+2, temp3
lds temp2, JoyVal+1
sts JoystickBufferBegin+3, temp2


;cbi PORTD,5


ldi USBBufptrY,JoystickBufferBegin
ldi ByteCount,2+2 ;length of output buffer (only SOP and PID) + 2=length of report

push USBBufptrY
push ByteCount
rjmp AddCRCOut_2 ;addition of CRC to buffer

;***************************************************88
4.

TheHijacker ::





Neverjetno ampak kot kaže deluje! Trenutno sem zadevo napeljal skozi okno ven, ampak ni dovolj hladno, da bi prišel do negativne vrednosti. S tem izračunom mi sedaj izračuna temperaturo:

temp = (((ch[1] & 0xFF) (manjše/manjše) 8) + (ch[0] & 0xFF)) * 0.0625;

Na žalost mi laptop ne zazna naprave. Po moje zaradi prenizke napetosti USB-ja v laptopu. Imam pa doma vse dele za izdelavo drugega senzorja, le še senzor mi fali in iskreno upam, da mi jih bodo poslali kot sample. Bom pa dodal na obe USB liniji 68 ohmska upora. Nekje sem bral, da sta zelo pomembna pri tem, da ti PC spozna napravo in mogoče mi zato laptop ne prepozna zadeve. Torej bo novo vezje sledeče:



Če se bo obneslo bom videl, ko dobim senzorje. Me pa matra. In to toliko, da bi kar danes že naročil senzor pri IC :D. Če mi zadeva zadela na laptopu, grem lahko kamorkoli in zmerim temperaturo.

Če se bo kdo lotil tega vezja naj proba najprej po tem novem vezju s 68 upori na obeh data linijah USB-ja. Kvečemu lahko izboljša napravo.

PS: Kako naj naredi, da mi pokaže 2x znak manjše? Forum mi ne pusti.

Trenutno mi kaže:



Še link do nove firmware datoteke v HEX formatu.
http://www.google.si

Zgodovina sprememb…

  • zavaroval slike: Azrael ()

Ch4N93 ::

lepo da ste porihtali zadevo.
kar se pa tiče laptop-a pa je pomoje prej kot prenizka napetost, problem v previsoki napetosti, ki jo pošilja Atmel na USB port. Specifikacija USB-ja namreč predvideva podatkovne linija cca. 3,3 V. Sicer standard garantira 5 V kot dopustno napetost (torej da ne uniči port-a), ne garantira pa delovanja. Poskusi vezati 3,3 V zener diodo od podatkovne linije na maso, (v zaporni smeri) pa poskusi na laptopu. Verjetno pa bi že upora morala poštimati zadevo.

Vsekakor delaš na lastno odgovornost!

Pa kje si našel 18b20 na IC strani, sam nikakor ne najdem tega senzorja. Sem pa včeraj naredil eno večjo naročilo pri HTE, tako da se bom kmalu pridružil igranju. :D
Ni nam lahko...

link_up ::

no vidis, pa imas cel scratchpad :D super narejeno ;)

@channel
probaj se pri svet elektronike. Kakor vem so jih tam imeli(vsaj S verzijo). Drugace pa kar sample narocilo na maxim. Dobis v cca. 10 dneh po posti v nabiralnik. Vsaj jaz sem ze tako dobil precej robe :)
In and Out

TheHijacker ::

Z diodami nimam izkušenj. Bom raje probal s upori. V vezju za IR sprejemnik sem dal oba 68 ohmska upora in mi deluje tudi na laptopu. S tem dvemi upori bo vezje skoraj identično, samo da bo namesto IR senzorja temperaturni senzor. Ter seveda drugi firmware.

Glede DS18B20, pa sem tudi sam že izpolnil na njihovi strani in naj bi dobil 2x B in 2x S modela ampak, ker nisem potrpežljiv sem poslal email na IC če imajo S model. V odgovor sem dobil, naj pustim številko. Dal sem jim mobitel in čez pol urce me je klical g. Župan, ter rekel, da S modela nimajo imajo pa B model. Zato sem hitro naročil dva. Skupaj s poštnino me je prišlo 10.38€. VEČ KOT SAMO VEZJE! No. Enega sem kmalu skuril, ker sem gledal pine iz vrha, namesto iz spodaj, ter tako zamešal + in -. Drugi kot vidite deluje zelo precizno >:D.

Me pa zanima, koliko sta B in S model enaka in če bo ista koda delovala z obema. Denis je, kot sem lahko videl, malce spremenil kodo za B in S model.

Imam že čisto vse elemente za novo drugo vezje v katerega bom dal še dva 68 upora na data linije USB-ja. Manjka mi samo še senzor, ki pa upam, da ga bom dobil vsaj enkrat drug teden, predno se preveč otopli, ker bi rad šel stran od izoliranje hiše in upam, da pokaže tudi negativne vrednosti. Bom pa sestavil s S modelom, da preverim če bo delovala ista koda.

The more the merrier :P.

Sedaj mi ostane samo še dopolnitev programa z ogromno funkcijami. V planu imam:

- graf (če mi bo rata naštudirat TGraph)
- logiranje v datoteko
- ini datoteka za shranjevanje nastavitev (zaokroževanje, prikaz grafa, skrij v traj)
- mnogo ostalih idej...

Trenutno alpha verzija programa je na voljo tukaj. Graf sploh ne deluje. Kaže pa točno temperaturo na 4 decimalke, ampak pogoj je tisti drugi firmware. Z originalnim bo kazal čisto napačno.

Objavljena bo seveda tudi izvorna koda, če bo kdo želel prevesti v drugem prevajalniku, ali pa kaj dodat. Imam pa tudi načrt narediti PHP skripto, ki bo dobljeno log datoteko pretvorila v grafe (dnevni, mesečni, letni,...). Velik projekt in bomo videlo koliko bom kaj s časem. Danes ga imam precej, ker imam skoraj 40 stopinj vročine in zato nisem šel v službo >:D
http://www.google.si

Zgodovina sprememb…

link_up ::

probaj tukaj dobit malce vec informacij o programiranju kvazi vremenske postaje ;)

Klik
In and Out

Ch4N93 ::

Danes ga imam precej, ker imam skoraj 40 stopinj vročine in zato nisem šel v službo
Merjeno s senzorjem ali medicinskim termometrom? :D

Drugače pa: B in S model se razlikujeta po ločljivosti rezultata, ki ga podata mikrokrmilniku. S model tako omogoča samo 9-bitno, B model pa 9-12-bitno ločljivost (default 12). Od tod tudi razlog tiste if zanke ter čaranja v originalni kodi. Glede firmware-a mislim da na rabiš nič spreminjat, saj se v obeh primerih preneseta 2 byte-a (za B in S model). Sprememba bo samo v računalniškem programu, kjer boš namesto s 0.0625 množil z 0.5, ker je pač ločljivost samo 9 bitna.
Ni nam lahko...

gumby ::

btw ima smisla rezultat prikazovat na 4 decimalke?

absolutna tocnost senzorja je itak ranga +-0.5 sotpinj
my brain hurts

zcetrt ::

Firmware se ne spreminja glede na senzor 18b20, 18s20 ali 1822, ki je enak 18b20 (razen napake, se mi zdi).

Smiselno pa je zaokroževanje na 0.1 stopinjo celzija. Vsaj tako imam jaz izvedeno na termostatu in termometru.
4.

TheHijacker ::

Saj sem napisal, da bom v program dodal možnost zaokroževanja na 1-4 decimalke. ;)
http://www.google.si

maticm ::

Jaz imam pa željo, da naredim program, ki bi mi pobiral podatke s serijskega porta (kamor imam priključen brezžični termometer s PICem)in jih na vsake toliko časa tudi shranjeval v neko datoteko.
Podatki so oblike +19.9375C to se da pa tudi štelat, če bi hotu kakšno drugo obliko...

TheHijacker ::

Na žalost se na COM port prav nič se spoznam. Mogoče ti bo kdo drug znal pomagat.
http://www.google.si

TheHijacker ::

Danes sem dobil po pošti sample od Maxima in sicer 2x B in 2xS model. S je žvohnej, zato sem naredil še eno vezje s B ampak tu sem sedaj dodal na data linije usb-ja še dva 68 upora. Na žalost zadeve še vedno ne deluje na mojem laptopu. Kot kaže res rabi 3.6 V in je zanj 5V preveč. Bom probal nekje dobit še dve 3.6V zener diodi.
http://www.google.si

neoto ::

Kako to misliš, da je S švohnej?

TheHijacker ::

Nekdo je napisal, da je S model natančen na 0.5, medtem ko je B model natančen na 0.0625.
http://www.google.si

neoto ::

Ni čisto res. Je pa res, da je treba po temperaturo iti na scratchpad, kjer se najde še dodatek 4 bitov za boljšo natančnost. B ima pa že privzeto 12 bitov za podatek o temperaturi.
Sam sem napisal kodo tako, da najprej preberem družino senzorja (tudi piše v scrathpadu), nato se pa pač primeren postopek za branje temperature izvede.

link_up ::

za koga je 5V prevec ? Za ds18b20?? Ce pa v datasheetu pise, da je do 5.5V in meni cisto normalno deluje na 4.95V :)
In and Out

TheHijacker ::

neoto: No to pa nisem vedel. Še vedno je potem B boljši, ker drugače bi morali popravljat firmware, kot ga je prvotno avtor.

link_up: Narobe si prebral. Težave so s priklopom zadeve na laptop. Tole si preberi (pod hardware).
http://www.google.si

AGENT007 ::

kaj si v iskalnik napisal (pri IC spletni trgovini) da je našel senzor DS18B20, k jest ga sploh ne najdem.:O
sej je IC elektronik (www.ic-elect.si) prava trgovina, a je ša kakšna druga?

LP

AGENT007 ::

lahko bi si samo senzor dal na daljši kabel, tako da bi lahko dostopal do težko dostopnih kotičkov npr. v PC-ju, in bi na meritev vplivalo samo tiso kar želiš in ne še drugo kot npr. škatlica

wifi4all ::

se je mogoce kdo ze lotil UTP termometra in merjenja vlage?

Malo sem gledal na internetu za te nacrte, vendar mi ni uspelo dobiti nic kaj uporabnega...
Under Water Hockey
http://www.phljubljana.si/
«
1
2 3
...
5


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

LCD-TERMOMETER

Oddelek: Elektrotehnika in elektronika
244140 (3681) Voluharr
»

USB IR Sprejemnik za amaterje (IgorPlug-USB) (strani: 1 2 3 )

Oddelek: Elektrotehnika in elektronika
12128269 (11513) eVro
»

temp data logger

Oddelek: Elektrotehnika in elektronika
323311 (2731) maticm
»

Merjetnje zunanje temperature in prikaz na PCju

Oddelek: Elektrotehnika in elektronika
143086 (2609) Cuoresportivo

Več podobnih tem