您当前的位置:五五电子网电子知识单片机-工控设备DSP/FPGA技术用MAXQ3210构建1-Wire温度记录仪 正文
用MAXQ3210构建1-Wire温度记录仪

用MAXQ3210构建1-Wire温度记录仪

点击数:7407 次   录入时间:03-04 11:36:20   整理:http://www.55dianzi.com   DSP/FPGA技术

  注意:当构建的1-Wire网络传输距离较远或连接的从机数量较多时,还需要注意其他事项。更多信息请参考以下应用笔记。

  AN148:1-Wire网络可靠设计指南
AN570:Tech Brief 1 : 1-Wire Net Design Guide
AN937:Book of iButton Standards

  用DS1822测量温度

  尽管MAXQ3210可以使用上面的代码与大多数1-Wire从机器件 通信 ,在本应用中我们将主要考虑与DS1822通信。DS1822是一个1-Wire从机器件,可实现9到12位的摄氏温度测量,测量结果可被1-Wire主机读取。与多数1-Wire从机一样,DS1822可以完全由1-Wire总线供电,我们称之为寄生供电。

  DS1822的测量范围可达-55°C至+125°C,适用于多数的室内外温度测量应用。温度分辨率在9位下为0.5°C,12位下0.0625°C。进行一次温度转换所需时间在低分辨率下约为94ms,在最高分辨率下约为750ms。由于这是一个简单应用,我们选择9位分辨率,并忽略最低位(0.5°C)。这样就可使整个8位带符号温度数据与MAXQ3210的8位累加器匹配。

  所有的1-Wire从机器件都支持一个通用指令集,从而使得主机可以判断总线上的从机数目,读取ROM ID,并且可以与某一个从机或一组从机进行通信。一旦某个1-Wire从机被激活,主机可以针对该从机类型向其发送特殊指令。其它所有未被激活的从机均处于等待状态,直到下一个复位脉冲出现,才开始再次监测1-Wire总线。

  由于在我们的应用中总线上仅有一个1-Wire器件,我们可以使用最简单的指令集访问从机器件,不需要读取从机的ROM ID。当总线上有多个从机器件时,ROM ID被用来区分不同的从机器件。我们的程序中也读取了一次DS1822的ROM ID,但仅是为了演示。

  我们将使用下面的1-Wire指令集,DS1822支持的其它指令请参考其数据资料。

  Read ROM [33h]。这一指令假设1-Wire总线上只有一个从机器件。1-Wire 从机收到该指令后将其8字节的ROM ID发回1-Wire主机。这个ID包括48位序列号,8位CRC,8位家族码。家族码代表器件类型。DS1822的家族码为22h。收到Read ROM指令后,1-Wire从机被激活,并响应后续与该从机器件相关的指令。

  Skip ROM [CCh]。1-Wire总线上有一个或多个从机器件时都可以使用这一指令

www.55dianzi.com 。这条指令激活总线上的所有从机,与从机的ROM ID无关。当总线上只有一个从机时,可利用这条指令不读取从机ID而激活从机,使其接收后续相关指令。当总线上有多个从机时,如果使用这条指令,则必须保证后面的指令不会造成从机向主机发送数据。因为从机可能发送不同的数据而造成数据冲突。

  Write Scratchpad [4Eh]。这是DS1822专用的指令,之前先用Read ROM 或Skip ROM指令激活器件。在该指令后 1-Wire 主机发送3字节的配置数据用来配置DS1822,包括温度转换的位分辨率。更多详情请参考DS1822的数据资料。

  Read Scratchpad [BEh]。这也是DS1822专用的指令,该指令允许主机从DS1822读取最多9字节数据。这些数据包括通过Write Scratchpad指令设置的配置寄存器值,以及最近的温度转换结果。更多详情请参考DS1822的数据资料。我们的应用仅需要最开始的两个字节,这两个字节就是最近的温度转换结果。

  Convert Temperature [44h]。这是DS1822专用的指令。DS1822收到该指令后开始测量温度,并将其按指定位分辨率转换成数字量。结果存储到两个内部寄存器中,1-Wire主机可以通过Read Scratchpad读取。

  当执行Convert Temperature指令时,DS1822需要消耗更多的电流(最多1.5mA),可能超过1-Wire总线弱上拉所能提供的电流。因此,一旦主机发出这一指令,必须对1-Wire总线进行强上拉,直至温度转换结束。在此期间,1-Wire总线上不能有任何 通信 发生。MAXQ3210简单地通过将P1.6端口从弱上拉切换成输出高电平来满足此要求。MAXQ3210端口驱动器能够输出足够DS1822工作所需的电流。

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Function : ConvertAndReadTemp
;; Description : Sends commands to measure temperature and read
;; scratchpad from the DS1822.
;; Inputs : None.
;; Outputs : GRL - 8-bit signed temperature value, in degrees C.
;; Destroys : PSF, AP, APC, A[0], A[1], A[2], LC[0], LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  ConvertAndReadTemp:
call Reset1Wire ; Reset the DS1822

  move GRL, #OW_SKIP_ROM ; Select the DS1822
call Write1Wire
move GRL, #OW_CONVERT ; Send temp convert command
call Write1Wire

  move OWDIR, #1 ; Turn on strong pullup for draw current
move OWOUT, #1

  move LC[0], #55 ; About a second
delay:
move LC[1], #0
djnz LC[1], $
djnz LC[0], delay

  call Reset1Wire ; Conversion completed; reset again

  move GRL, #OW_SKIP_ROM ; Select again
call Write1Wire
move GRL, #OW_RD_SCRATCH ; Read the scratchpad values
call Write1Wire

  call Read1Wire
move A[1], GRL ; Temp LSB 3210xxxx
call Read1Wire
move A[2], GRL ; Temp MSB sssss654

  move ACC, A[1] ; 3210xxxx
and #0F0h ; 3210----
xchn ; ----3210
move A[1], Acc
move Acc, A[2] ; sssss654
and #00Fh ; ----s654
xchn ; s654----
or A[1] ; s6543210

  move GRL, Acc
ret

  
 &nb

www.55dianzi.com sp;     将测量结果存储在数据EEPROM中

       为防止 1-Wire 总线偶然出现数据错误,演示代码每次测量都执行三次温度转换(A,B和C),并从中选择一个结果存储,选择的依据为:
如果所有数据相同,则存储该数据。

  如果三个中有两个数据相同(A = B,B = C或A = C),则选择相同的数据存储。
如果没有数据相同,则取中间值存储。例如,如果(A > B > C),则存储B。

  被选中的值被写入数据EEPROM的一个字中。由于采样结果为一个字节,每个字的高字节被用来指示该记录(也就是字)是否为空。如果高字节为0,该记录/字为空,如果高字节非0,则低字节为有效温度数据。这样就能区分空记录和存储数据为0°C的有效数据。

  ;; Two out of three majority vote, or failing that, the measurement
;; in the middle of the three.

  move ACC, A[4]
cmp A[5]
jump E, recordTempA ; If (A==B), use that value
cmp A[6]
jump E, recordTempA ; If (A==C), use that value

  move Acc, A[5]
cmp A[6]
jump E, recordTempB ; If (B==C), use that value

  move Acc, A[4]
sub A[5]
jump S, B_greaterThan_A ; Sign is set if (A-B) is negative

  ;; If (A > B) {
;; If (C > A) record A (C > A > B)
;; If (B > C) record B, (A > B > C)
;; else record C (A > C > B)

  A_greaterThan_B:
move Acc, A[4]
sub A[6] ; A-C
jump S, recordTempA ; Sign is set if (A-C) is negative
move Acc, A[5]
sub A[6] ; B-C
jump S, recordTempC ; Sign is set if (B-C) is negative
jump recordTempB

  ;; If (B > A) {
;; If (C > B) record B (C > B > A)
;; If (A > C) record B, (A > B > C)
;; else record C (B > C > A)

  B_greaterThan_A:
move Acc, A[5]
sub A[6] ; B-C
jump S, recordTempB ; Sign is set if (B-C) is negative
move Acc, A[4]
sub A[6] ; A-C
jump S, recordTempC ; Sign is set if (A-C) is negative
jump recordTempB

  recordTempA:
move GRL, A[4]
jump recordTemp

  recordTempB:
move GRL, A[5]
jump recordTemp

  recordTempC:
move GRL, A[6]
jump recordTemp

  recordTemp:
move A[15], GRL

  move GRL, #'@'
call TxCharBB
move GR, DP[0]
move GRL, GRH
call TxHexByteBB
move GRL, DP[0]
call TxHexByteBB

  move GRL, #' '
call TxCharBB
move GRL, #'W'
call TxCharBB

  move GRL, A[15]
call TxHexByteBB

  move GRL, A[15] ; Low byte contains temp data
move GRH, #055h ; High byte marks nonzero entry
lcall UROM_loadData ; Write entry to data EEPROM

  call IncDP0_EE ; Move to the

www.55dianzi.com next entry position
move GR, #0000h ; Erase any data that exists
lcall UROM_loadData ; Erase the oldest entry

  记录采用循环方式,从数据EEPROM地址020h开始到05Fh结束,然后再回到开始处。之后每写入一个新记录,将擦除一个最旧的记录。当通过串行接口向外发送数据时,应用程序通过查找前面是否又有空记录的方式定位最旧的记录数据。

  
       节省功耗

  由于本应用每分钟仅记录一次温度数据,而读取DS1822数据并将其存储到EEPROM中仅需几秒钟。多数时间应用都在等待一分钟的延时结束。根据应用的要求,不需更改太多代码即可将温度记录间隔拉长,比如到五分钟、十分钟或三十分钟。为了减少等待期间对电池的消耗,应尽可能降低功耗。

上一页  [1] [2] [3]  下一页


本文关键字:记录仪  DSP/FPGA技术单片机-工控设备 - DSP/FPGA技术