aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/hardware/1wire-ds18s20.frt
blob: 95be0c11e0125c1ce49dd734ca70fd6d4d8d71a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
\ 2009-12-23  EW  ewlib/1w_ds18s20.fs
\ 2013-01-13  ported to amforth-5.0

\ --- Fam.10 DS18S20 thermometer -----------------------------

\ conversion + warten ist schon rum!
: 1w.rd.T ( addr[8] -- x1=Tl x2=Th x3 .. x9=crc )
  1w.reset drop \ fixme: if ... then
  \ device addressieren
  1w.cmd.matchrom &9 >1w
  1w.cmd.readdata &1 >1w
  &9 <1w
;

\ convert answer to physical units 1/100 C
: ds18s20.decode ( x1 .. x9=crc -- T*100 ok )
  7 0 do drop loop \ ignore crc
  8 lshift +       \ combine T_h T_l
  &100 &2 */       \ scale
  0                \ ok, because we ignore crc
;
: ds18s20.decode.check ( x1 .. x9=crc -- T*100 ok=0 | error=1 )
  7 pick >r 8 pick >r \ save data
  8 1w.crc8.rev? if   \ crc good?
    r> r> 8 lshift +
    &100 &2 */
    0 \ ok
  else
    r> r> drop drop
    1 \ error
  then
;