Hex Artifact Content
Not logged in

Artifact 7231cd59b098f8c30b70a95cd881fd08066ade00:


0000: 23 20 4c 69 62 72 61 72 79 20 66 6f 72 20 69 6e  # Library for in
0010: 74 65 72 66 61 63 69 6e 67 20 77 69 74 68 20 61  terfacing with a
0020: 20 44 53 31 36 32 31 20 74 65 6d 70 65 72 61 74   DS1621 temperat
0030: 75 72 65 20 73 65 6e 73 6f 72 0a 0a 6e 61 6d 65  ure sensor..name
0040: 73 70 61 63 65 20 65 76 61 6c 20 64 61 6c 6c 61  space eval dalla
0050: 73 20 7b 0a 20 20 20 20 70 61 63 6b 61 67 65 20  s {.    package 
0060: 72 65 71 75 69 72 65 20 70 69 69 6f 0a 20 20 20  require piio.   
0070: 20 6e 61 6d 65 73 70 61 63 65 20 70 61 74 68 20   namespace path 
0080: 3a 3a 74 77 6f 77 69 72 65 0a 0a 20 20 20 20 76  ::twowire..    v
0090: 61 72 69 61 62 6c 65 20 73 6c 61 76 65 61 64 64  ariable slaveadd
00a0: 72 20 30 78 34 38 0a 20 20 20 20 76 61 72 69 61  r 0x48.    varia
00b0: 62 6c 65 20 72 65 67 73 20 7b 0a 09 52 65 61 64  ble regs {..Read
00c0: 54 65 6d 70 20 30 78 61 61 20 41 63 63 65 73 73  Temp 0xaa Access
00d0: 54 48 20 30 78 61 31 20 41 63 63 65 73 73 54 4c  TH 0xa1 AccessTL
00e0: 20 30 78 61 32 20 41 63 63 65 73 73 43 66 67 20   0xa2 AccessCfg 
00f0: 30 78 61 63 0a 09 52 65 61 64 43 6e 74 20 30 78  0xac..ReadCnt 0x
0100: 61 38 20 52 65 61 64 53 6c 6f 70 65 20 30 78 61  a8 ReadSlope 0xa
0110: 39 20 53 74 61 72 74 43 6f 6e 76 54 20 30 78 65  9 StartConvT 0xe
0120: 65 20 53 74 6f 70 43 6f 6e 76 54 20 30 78 32 32  e StopConvT 0x22
0130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 61 6d 65  .    }..    name
0140: 73 70 61 63 65 20 65 6e 73 65 6d 62 6c 65 20 63  space ensemble c
0150: 72 65 61 74 65 20 2d 73 75 62 63 6f 6d 6d 61 6e  reate -subcomman
0160: 64 73 20 7b 0a 09 64 73 31 36 32 31 20 63 6f 6e  ds {..ds1621 con
0170: 76 65 72 74 20 74 65 6d 70 65 72 61 74 75 72 65  vert temperature
0180: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 43 6f  .    }..    # Co
0190: 6e 6e 65 63 74 20 77 69 74 68 20 74 68 65 20 64  nnect with the d
01a0: 65 76 69 63 65 0a 20 20 20 20 70 72 6f 63 20 64  evice.    proc d
01b0: 73 31 36 32 31 20 7b 62 75 73 20 7b 6e 75 6d 20  s1621 {bus {num 
01c0: 30 7d 7d 20 7b 0a 09 76 61 72 69 61 62 6c 65 20  0}} {..variable 
01d0: 73 6c 61 76 65 61 64 64 72 0a 09 72 65 74 75 72  slaveaddr..retur
01e0: 6e 20 5b 74 77 6f 77 69 72 65 20 24 62 75 73 20  n [twowire $bus 
01f0: 5b 65 78 70 72 20 7b 24 73 6c 61 76 65 61 64 64  [expr {$slaveadd
0200: 72 20 2b 20 24 6e 75 6d 7d 5d 5d 0a 20 20 20 20  r + $num}]].    
0210: 7d 0a 0a 20 20 20 20 23 20 53 74 61 72 74 20 61  }..    # Start a
0220: 20 74 65 6d 70 65 72 61 74 75 72 65 20 6d 65 61   temperature mea
0230: 73 75 72 65 6d 65 6e 74 0a 20 20 20 20 70 72 6f  surement.    pro
0240: 63 20 63 6f 6e 76 65 72 74 20 7b 66 64 7d 20 7b  c convert {fd} {
0250: 0a 09 76 61 72 69 61 62 6c 65 20 72 65 67 73 0a  ..variable regs.
0260: 09 69 66 20 7b 28 5b 72 65 61 64 72 65 67 62 79  .if {([readregby
0270: 74 65 20 24 66 64 20 5b 64 69 63 74 20 67 65 74  te $fd [dict get
0280: 20 24 72 65 67 73 20 41 63 63 65 73 73 43 66 67   $regs AccessCfg
0290: 5d 5d 20 26 20 30 78 31 29 20 3d 3d 20 30 7d 20  ]] & 0x1) == 0} 
02a0: 7b 0a 09 20 20 20 20 23 20 53 65 74 20 74 6f 20  {..    # Set to 
02b0: 6f 6e 65 73 68 6f 74 20 6f 70 65 72 61 74 69 6f  oneshot operatio
02c0: 6e 0a 09 20 20 20 20 77 72 69 74 65 72 65 67 62  n..    writeregb
02d0: 79 74 65 20 24 66 64 20 5b 64 69 63 74 20 67 65  yte $fd [dict ge
02e0: 74 20 24 72 65 67 73 20 41 63 63 65 73 73 43 66  t $regs AccessCf
02f0: 67 5d 20 31 0a 09 7d 0a 09 77 72 69 74 65 62 79  g] 1..}..writeby
0300: 74 65 20 24 66 64 20 5b 64 69 63 74 20 67 65 74  te $fd [dict get
0310: 20 24 72 65 67 73 20 53 74 61 72 74 43 6f 6e 76   $regs StartConv
0320: 54 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  T].    }..    # 
0330: 4f 62 74 61 69 6e 20 74 68 65 20 6d 65 61 73 75  Obtain the measu
0340: 72 65 6d 65 6e 74 20 72 65 73 75 6c 74 73 0a 20  rement results. 
0350: 20 20 20 70 72 6f 63 20 74 65 6d 70 65 72 61 74     proc temperat
0360: 75 72 65 20 7b 66 64 7d 20 7b 0a 09 76 61 72 69  ure {fd} {..vari
0370: 61 62 6c 65 20 72 65 67 73 0a 09 77 68 69 6c 65  able regs..while
0380: 20 7b 28 5b 72 65 61 64 72 65 67 62 79 74 65 20   {([readregbyte 
0390: 24 66 64 20 5b 64 69 63 74 20 67 65 74 20 24 72  $fd [dict get $r
03a0: 65 67 73 20 41 63 63 65 73 73 43 66 67 5d 5d 20  egs AccessCfg]] 
03b0: 26 20 30 78 38 30 29 20 3d 3d 20 30 7d 20 7b 0a  & 0x80) == 0} {.
03c0: 09 20 20 20 20 61 66 74 65 72 20 35 30 0a 09 7d  .    after 50..}
03d0: 0a 09 73 65 74 20 64 61 74 61 20 5b 72 65 61 64  ..set data [read
03e0: 72 65 67 77 6f 72 64 20 24 66 64 20 5b 64 69 63  regword $fd [dic
03f0: 74 20 67 65 74 20 24 72 65 67 73 20 52 65 61 64  t get $regs Read
0400: 54 65 6d 70 5d 5d 0a 09 62 69 6e 61 72 79 20 73  Temp]]..binary s
0410: 63 61 6e 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  can [binary form
0420: 61 74 20 73 20 24 64 61 74 61 5d 20 53 20 72 65  at s $data] S re
0430: 73 75 6c 74 0a 09 73 65 74 20 72 65 6d 20 5b 72  sult..set rem [r
0440: 65 61 64 72 65 67 62 79 74 65 20 24 66 64 20 5b  eadregbyte $fd [
0450: 64 69 63 74 20 67 65 74 20 24 72 65 67 73 20 52  dict get $regs R
0460: 65 61 64 43 6e 74 5d 5d 0a 09 73 65 74 20 6e 75  eadCnt]]..set nu
0470: 6d 20 5b 72 65 61 64 72 65 67 62 79 74 65 20 24  m [readregbyte $
0480: 66 64 20 5b 64 69 63 74 20 67 65 74 20 24 72 65  fd [dict get $re
0490: 67 73 20 52 65 61 64 53 6c 6f 70 65 5d 5d 0a 09  gs ReadSlope]]..
04a0: 72 65 74 75 72 6e 20 5b 66 6f 72 6d 61 74 20 25  return [format %
04b0: 2e 31 66 20 5c 0a 09 20 20 5b 65 78 70 72 20 7b  .1f \..  [expr {
04c0: 28 24 72 65 73 75 6c 74 20 2f 20 32 35 36 29 20  ($result / 256) 
04d0: 2d 20 30 2e 32 35 20 2b 20 64 6f 75 62 6c 65 28  - 0.25 + double(
04e0: 24 6e 75 6d 20 2d 20 24 72 65 6d 29 20 2f 20 24  $num - $rem) / $
04f0: 6e 75 6d 7d 5d 5d 0a 20 20 20 20 7d 0a 7d 0a     num}]].    }.}.