实时时钟为微控制器系统增加了精确的计时功能

描述

MAXQ610微控制器不包括电池备份的实时时钟(RTC),但1-Wire®网络的灵活性使得可以在任何基于MAXQ1904的应用中直接添加DS610 RTC i按钮®。与DS1904通信、设置时钟和控制值以及与原始秒数之间的时间值转换,都可以在MAXQ610的能力范围内,即使使用汇编语言也是如此。本应用笔记说明如何在基于MAXQ610的应用中增加RTC功能。显示了实现此应用程序的演示代码。本文的原理和技术同样适用于其它基于MAXQ®的微控制器,该微控制器具有能够驱动1-Wire通信协议的通用I/O (GPIO)引脚。

介绍

许多微控制器包括定时器电路,但只有少数微控制器包括电池备份实时时钟(RTC)。然而,许多应用需要RTC,使用1-Wire网络可以轻松添加RTC。本文介绍如何将支持1-Wire协议的RTC添加到基于微控制器的系统中。包含必要的代码。本文解释了同样适用于通用I/O (GPIO)引脚能够驱动1-Wire通信协议的微控制器的原理和技术。

设计目标

本演示展示了如何使用1-Wire接口实现以下操作的方法:

读取所选 RTC 的 64 位 ROM ID

启动和停止 RTC

读取 RTC 的当前值

将 RTC 设置为新值

该演示还将以可读格式显示当前 RTC 值,即从原始秒转换为年/月/日/时间格式。它将允许用户通过增加各种转换值(例如,年,月,日)来修改时钟值,而不是计算并输入秒的新值。

对于存储日期/时间值秒数的任何应用程序,我们必须选择一个零基线。对于此应用程序,该基线是 1 年 2000 月 12 日上午 00:00:00000000,其原始秒数为零 (<>h)。

系统设置

1-Wire接口是本文的基础。它允许您将支持1-Wire协议的RTC添加到任何微控制器中。本例将使用DS1904 RTC i按钮®。该应用使用MAXQ610微控制器,因为它可以很容易地与RTC通信,设置时钟和控制值,并在原始秒和相应的日历日期之间进行转换,即使使用汇编语言也是如此。

低功耗MAXQ610非常适合便携式应用,但缺少电池供电的RTC。但是,您可以使用其GPIO引脚之一将此微控制器连接到专用RTC。微控制器的演示代码是使用基于汇编的MAX-IDE环境编写的。设计工作在Maxim评估(EV)板MAXQ610-KIT上。源代码、项目文件和其他文档均可下载。

运行应用程序

您需要以下硬件来运行演示代码:

MAXQ610评估板

5V 直流电源

串行到JTAG或USB到JTAG接口板

JTAG编程电缆(2×5带状电缆,带0.100in引脚连接器)

直通 DB9 串行接口电缆

具有可用 COM 端口或 USB 转串行适配器的电脑

DS1904L-F5# RTC i按钮

DS9094F+ 通孔安装 i按钮夹

代码在MAXQ610评估板上运行。原型设计区域安装了一个 i 按钮夹 (DS9094F+),在 i 按钮夹中插入了一个 DS1904L-F5# RTC i按钮。然后从 i按钮夹进行连接:

将i按钮夹的接地引脚(与DS1904背面/未标记侧接触的夹顶侧标有“+”的引脚)连接到MAXQ610评估板上的GND测试点之一。

将iButton夹子的数据引脚(夹子内侧接触DS1904正面/标记侧的引脚)连接到MAXQ2评估板上的端口引脚P0.3 (接头引脚P1.610)。

您还需要以下软件:

MAX-IDE汇编语言开发环境,用于MAXQ微控制器

微控制器工具包 (MTK) 或其他具有“哑终端”模式的终端仿真器

MAX-IDE环境的最新安装包和文档可在MAXQ RISC微控制器页面找到。

RTC的数据通过1-Wire协议串行传输;只需要一个数据引线和一个接地回路。该 RTC 包含一个唯一的 64 位 ID,在 ROM 中出厂光刻,以及一个作为二进制计数器实现的 RTC/日历。它位于耐用的MicroCan包装中,可防尘,防潮和防震。该封装几乎可以安装在任何表面上,包括印刷电路板 (PCB) 和塑料钥匙扣。运行时,RTC 为使用微控制器的任何电子设备或嵌入式应用添加日历日期、时间和日期戳、秒表、小时计、间隔计时器和日志功能。

RTC 包含一个分辨率为 32 秒的 1 位计数器,可提供大约 136 年的范围。保持时钟运行所需的所有硬件,包括32kHz晶体和电池,都密封在内部。所得器件的使用寿命超过 10 年,在室温为 +2°C 时,时钟精度约为每月 ±25 分钟。 工作模式(停止或运行)和时钟计数器的值可通过1-Wire接口读取或写入。

驱动1-Wire网络

1-Wire接口通过单线和单接地回路提供电源和通信。这意味着单个端口引脚使微控制器能够与1-Wire传感器通信。为在1-Wire网络上工作开发了各种传感器和其他组件。

1-Wire网络采用单主机和多个从机,采用多点配置。时序要求非常灵活,允许所有从站以高达16kbps的通信速度与主站同步。每个1-Wire传感器都有一个全球唯一的64位ROM ID,因此1-Wire主站可以单独、精确地选择从机,无论它们在网络上的物理位置如何。

1-Wire线路以漏极开路模式工作:主站(以及从机,当需要输出时)通过将线路拉至地来指示“零”,或者通过让线路浮高来指示“一”。此操作通常通过线路和V之间连接的分立上拉电阻来实现抄送.端口引脚具有弱上拉模式的微控制器(如MAXQ610)可以简单地将端口引脚切换回该模式,让线路高悬;无需外部电阻。由于主机和从机将线路拉低且从不主动拉高,因此1-Wire网络以有线OR配置工作。这种方法可防止多个从站同时尝试在1-Wire总线上传输时发生线路冲突。

为了驱动1-Wire网络,微控制器使用软件在单个引脚上生成时隙。所有时隙均由1-Wire主机启动,因此当1-Wire线路未与从器件通信时,微控制器无需监控<>-Wire线路。

复位时隙宽约为 1ms。在前半段时段,主机(MAXQ610)将1-Wire线保持在低电平。时隙进行到一半时,它释放1-Wire线并使其漂浮在高处。线路上存在的任何1-Wire从站都会在后半段通过复位并拉下线路来响应。然后,从站产生存在脉冲,向主站指示一个或多个从站存在并准备通信。

写入时隙的宽度为60μs至120μs,由主机用于将位(0或1)传输到一个或多个从机。两种类型的写入时隙都从主站将线路拉低至少一微秒开始。为了传输 1,主站随后在剩余的时间段内释放线路(让它高浮动)。为了传输 0,主站将线路保持低电平,直到时隙结束。

读取时隙的宽度为60μs至120μs,由主机用于从从器件读取位(0或1)。时隙从主站将线路拉低至少一微秒开始。然后,主机释放线路,允许从机将其保持在低电平(0)或使其浮动到高处(1)。在时隙的中途,主机对线路进行采样,以从从机读取位值。

MAXQ610在12MHz频率下以每微秒约12个指令周期运行,因此在软件中使用端口引脚(P1.2)即可轻松执行标准的0-Wire协议。它以类似的方式实现读取时隙。注意,1-Wire总线上的所有数据字节首先传输最低有效位(LSB)。

1-Wire总线上的上拉电阻值根据网络上的器件数量而变化,但通常额定值为4kΩ至5kΩ。相反,MAXQ610端口引脚上的弱上拉电阻在15kΩ至40kΩ之间变化,取决于工作电压。为了避免1-Wire总线从低电平状态高电平浮动时出现过长的时间间隔,该代码会短暂驱动具有正常高电平状态的总线(通过P2.0),在将P2.0设置为正常的弱上拉模式之前,将总线“捕捉”到高电平状态。此操作不会对1-Wire总线造成中断,前提是避免了从机可能尝试将总线拉低的时间间隔。或者,您可以在1-Wire总线上放置一个物理外部上拉电阻,然后在标准低电平模式下驱动端口引脚(对于零状态),将端口引脚驱动至三态模式(对于高状态)。

启动、停止和设置时钟

由于1-Wire总线上可能存在多个1-Wire器件,因此与这些器件的通信分两个阶段进行。总线主控器首先选择一个1-Wire器件进行通信,然后发出通信信号²总线主控器发送复位脉冲后,1-Wire总线上的所有从器件将返回到默认的未选中状态。然后,总线主站可以使用几个命令来选择将在第二阶段与之通信的设备。以下命令使用与每个从设备关联的 64 位 ROM ID。所有1-Wire器件都支持这些命令。

跳过 ROM [CCh]

此单字节命令激活总线上的所有从设备。如果只有一个1-Wire器件,或者总线主控器需要向总线上的所有1-Wire器件发送相同的命令,则此功能非常有用。上述应用总线上只有一个器件(例如DS1904 RTC),因此总线主控器(例如MAXQ610微控制器)在读取或写入RTC之前始终使用此命令激活RTC。

读取只读存储器 [33小时]

此单字节命令激活总线上的所有从设备,并使它们将其64位ROM ID值传输回总线主站。由于它激活所有从设备,因此只能用于单从系统。否则,多个从设备在尝试同时传输其ROM ID时将导致数据冲突。由于总线上只有一个器件(DS1904),MAXQ610在开始时使用此命令读取DS1904的ROM ID。

匹配光盘 [55h]

此命令从1-Wire总线上的多个从机中选择一个从机。总线主站传输此命令后,通过传输要选择的从设备的64位ROM ID进行跟进。具有匹配ROM ID的器件通过进入活动状态进行响应,而总线上的所有其他器件进入非活动状态,等待总线主站的下一次1-Wire复位。(此处描述的应用程序中未使用此命令。

搜索 ROM [F0h]

此命令允许总线主站使用迭代发现过程来确定1-Wire总线上一个或多个从器件的ROM ID值³(此处描述的应用中未使用此命令。

读取和写入时钟和控制值

当总线主站使用跳过ROM或读取ROM命令选择1-Wire从器件(即RTC、DS1904)时,该器件即可接受特定于它的1-Wire命令。这些命令(图 1)详述如下:

读取时钟 [66h]

该命令允许总线主站读取DS1904的器件控制字节和4字节(32位)RTC值。器件控制字节确定驱动RTC的32kHz振荡器是运行还是停止。如下面的代码所示,只有一个命令同时读取设备控制字节和时钟值。即使不需要这两个值,也必须在设备输出时钟数据之前读取设备控制字节。

写入时钟 [99h]

作为读取时钟的补充,该命令允许总线主机为器件控制字节和DS1904 4字节时钟计数器设置新值。请注意,在新值生效之前,必须写入全部5个字节并发送一个1-Wire复位脉冲。上述应用代码包括单独设置器件控制字节和时钟值的例程,首先从DS5读取1904字节数据(1字节器件控制加上4字节时钟计数器),然后写回数据并进行适当的更改。

电池


图1.这些DS1904时钟功能命令取自数据资料。

转换时间和日期值

若要将原始秒数转换为可打印形式,应用程序将分别确定每个日期和时间字段(年、月、日、小时、分钟和秒)的值,从最大的字段(年)开始向下工作:

秒≥(每年秒数),从秒数中减去(每年秒数)并增加年份。

秒≥(每月秒数),从秒数中减去(每月秒数)并增加月。

秒数≥(每天秒数),从秒数中减去(每天秒数)并增加“天”。

秒数≥(每小时秒数),从秒数中减去(每小时秒数)并增加小时数。

当秒≥ 60 时,从秒中减去 60 并增加分钟。

秒的剩余值是第二个字段。

即使总线主站为除法提供硬件支持,简单的除法运算也不足以计算前两个字段值(年和月)。这是因为每个字段单位的秒数会因闰年(影响年和月的值)和每月天数(仅影响月)的影响而变化。例如,从 2000 年(闰年)开始:

2000 年每年的秒数)= 366(天)× 24(小时/天)× 60(分钟/小时)× 60(秒/分钟)= 31,622,400 秒。

标准年份少一天(365 天),这会将秒/年更改为 (31,622,400 - 86,400) = 31,536,000。

因为每四年是闰年,所以我们按如下方式计算年份(请注意,此伪代码中的第 2、3 和 4 项是相同的)。

如果秒≥(每闰年的秒数),则从秒中减去(每闰年的秒数)并递增年份,否则停止。

如果“秒数”≥(每年秒数),请从“秒数”中减去(每年秒数)并递增“年份”,否则停止。

如果“秒数”≥(每年秒数),请从“秒数”中减去(每年秒数)并递增“年份”,否则停止。

如果“秒数”≥(每年秒数),请从“秒数”中减去(每年秒数)并递增“年份”,否则停止。

返回第 1 行。

“月份”字段的值以类似的方式计算:

如果秒≥(一月为秒),则从秒中减去(一月为秒)并递增月,否则停止。

如果秒≥(二月为秒),则从秒中减去(二月为秒)并递增月,否则停止。

如果秒≥(三月为秒),则从秒中减去(三月为秒)并递增月份,否则停止。

继续完成剩余的几个月。

运行演示

要运行演示,请加载并运行应用程序。然后使用DB9串行电缆将MAXQ610评估板从J1 SKT连接到PC上的COM1。启动 MTK(或其他终端模拟器)并以 1 波特打开 COM38400。初始输出应类似于以下内容:

 

@
ID: 24B91231000000B2  AC  18F83065

+   18F83065   Apr 10 2013, 02:15:01 pm 
+   18F83066   Apr 10 2013, 02:15:02 pm
+   18F83067   Apr 10 2013, 02:15:03 pm
+   18F83068   Apr 10 2013, 02:15:04 pm
+   18F83069   Apr 10 2013, 02:15:05 pm

第二行代码包含DS1904 ROM ID值(24B91231000000B2)、器件控制字节(AC)和当前时钟值(18F83065)。后续行中的“+”值表示时钟正在运行。时间值的刷新和显示频率与更改频率一样高,应为每秒一次。按“-”停止时钟。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分