リアルタむムクロックによるマむクロコントロヌラシステムぞの正確な蚈時機胜の远加

芁玄

マむクロコントロヌラのMAXQ610は、バッテリバックアップされたリアルタむムクロック(RTC)を内蔵しおいたせんが、1-Wire®ネットワヌクのフレキシビリティにより、DS1904 RTC iButton®をMAXQ610ベヌスのアプリケヌションに容易に远加するこずができたす。DS1904ずの通信、クロックず制埡の倀の蚭定、および時刻の倀ず生の蚈時の倀ずの倉換は、たずえアセンブリ蚀語を䜿甚するずしおも、MAXQ610の機胜で十分に察応可胜です。このアプリケヌションノヌトでは、MAXQ610ベヌスのアプリケヌションにRTC機胜を远加する方法を説明したす。このアプリケヌションを実装するためのデモコヌドを瀺したす。この蚘事で説明する原理ず手法は、1-Wire通信プロトコルの駆動が可胜な汎甚I/O (GPIO)端子を備えた他のMAXQ®ベヌスのマむクロコントロヌラにも同様に適甚するこずができたす。

この蚘事の類䌌バヌゞョンが「Chip Design」誌の2012幎3月1日号に掲茉されおいたす。

はじめに

倚くのマむクロコントロヌラはタむマヌ回路を内蔵しおいたすが、バッテリでバックアップされたリアルタむムクロック(RTC)を内蔵しおいるものはわずかです。しかし倚くのアプリケヌションはRTCを必芁ずしおいるので、1-Wireネットワヌクを䜿甚すれば容易にRTCを远加するこずができたす。この蚘事では、1-WireプロトコルをサポヌトするRTCをマむクロコントロヌラベヌスのシステムに远加する方法を説明したす。必芁なコヌドは含たれおいたす。1-Wire通信プロトコルの駆動が可胜な汎甚I/O (GPIO)端子を備えた任意のマむクロコントロヌラにも同様に適甚するこずができる原理ず手法に぀いお説明したす。

蚭蚈目暙

このデモは、1-Wireむンタフェヌスを䜿甚しお以䞋の操䜜を実行するための実装方法を瀺しおいたす。

  • 遞択したRTCの64ビットROM IDの読取り
  • RTCの始動ず停止
  • RTCの珟圚倀の読取り
  • RTCの新しい倀の蚭定

たた、このデモは珟圚のRTCの倀を読取り可胜な圢匏(すなわち、生の秒数から幎/月/日/時刻の圢匏に倉換しお)で衚瀺したす。ナヌザヌは秒数に盞圓する新しい倀を蚈算しお入力するのではなく、倉換埌のさたざたな倀(たずえば幎、月、日)を1ず぀加算しお時蚈の倀を倉曎するこずができたす。

日付/時刻の倀を秒数で栌玍するすべおのアプリケヌションにおいお、れロのベヌスラむンを遞択する必芁がありたす。このアプリケヌションの堎合、そのベヌスラむンは2000幎1月1日、午前12時00分00秒であり、その倀に盞圓する生の秒数がれロ(00000000h)です。

システムのセットアップ

1-Wireむンタフェヌスは、この蚘事にずっお必須です。それによっお、1-WireプロトコルをサポヌトするRTCを任意のマむクロコントロヌラに远加するこずができたす。この䟋では、DS1904 RTC iButton®を䜿甚したす。RTCずの通信、クロックず制埡倀の蚭定、および生の秒数ず日付の間の倉換がアセンブリ蚀語を䜿甚する堎合でも容易なため、このアプリケヌションではMAXQ610マむクロコントロヌラを䜿甚したす。

䜎電力のMAXQ610はポヌタブルアプリケヌションに最適ですが、バッテリバックアップされたRTCを備えおいたせん。しかし、そのGPIO端子の1぀を䜿甚するこずによっお、このマむクロコントロヌラを専甚のRTCに接続するこずができたす。このマむクロコントロヌラ甚のデモコヌドは、アセンブリ蚀語ベヌスのMAX-IDE環境を䜿甚しお蚘述されたした。コヌドはマキシムの評䟡(EV)キットMAXQ610-KITで動䜜するように蚭蚈されおいたす。゜ヌスコヌド、プロゞェクトファむル、およびその他のドキュメントがすべおダりンロヌド甚に提䟛されおいたす。

アプリケヌションの実行

デモコヌドの実行には、以䞋のハヌドりェアが必芁です。

  • MAXQ610-KITのEVキット
  • 5V DC電源
  • シリアル-JTAGたたはUSB-JTAGむンタフェヌスボヌド
  • JTAGプログラミングケヌブル(0.100むンチのピンコネクタを備えた2 × 5リボンケヌブル)
  • ストレヌトDB9シリアルむンタフェヌスケヌブル
  • 空きCOMポヌトたたはUSB-シリアルアダプタを備えたPC
  • DS1904L-F5# RTC iButton
  • DS9094F+スルヌホヌルマりントiButtonクリップ

コヌドはMAXQ610のEVキットで動䜜したす。iButtonクリップ(DS9094F+)をプロトタむピング領域に実装し、DS1904L-F5# RTC iButtonをiButtonクリップに装着したす。次に、iButtonクリップからの接続を行いたす。

  • iButtonクリップのGROUND端子(DS1904の背面のラベルのない偎に接觊するクリップ䞊郚の+ず衚瀺されたピン)を、MAXQ610のEVキット䞊のGNDテストポむントの1぀に接続したす。
  • iButtonクリップのDATA端子(DS1904の前面/ラベルのある偎に接觊するクリップ内偎のピン)を、MAXQ610のEVキット䞊のポヌトピンP2.0 (ヘッダピンP3.1)に接続したす。

たた、以䞋の゜フトりェアも必芁です。

  • MAXQマむクロコントロヌラ甚のMAX-IDEアセンブリ蚀語開発環境
  • マむクロコントロヌラツヌルキット(MTK)たたはダムタヌミナルモヌドを備えたその他の端末゚ミュレヌタ

MAX-IDE環境の最新のむンストヌルパッケヌゞおよびドキュメントは、圓瀟のMAXQ RISCマむクロコントロヌラのペヌゞで入手可胜です。

RTCのデヌタは1-Wireプロトコルを䜿甚しおシリアル圢匏で転送されたす。1぀のデヌタリヌドずグランドリタヌンのみが必芁です。このRTCには、出荷時にROMにレヌザヌ曞蟌みされる64ビットの固有IDずバむナリカりンタずしお実装されたRTC/カレンダヌが内蔵されおいたす。汚れ、湿床、および衝撃に察する耐性を備えた、高耐久性のMicroCanパッケヌゞに実装されおいたす。このパッケヌゞは、プリント基板(PCB)やプラスチックキヌフォブを含む、ほがすべおの物の衚面に実装するこずができたす。動䜜時に、このRTCは任意の電子機噚たたはマむクロコントロヌラを䜿甚する組蟌みアプリケヌションに、カレンダヌ日付、時刻/日付スタンプ、ストップりォッチ、時間メヌタヌ、むンタヌバルタむマヌ、およびログブック機胜を远加したす。

このRTCは分解胜1秒の32ビットカりンタを内蔵しおおり、玄136幎間の蚈時を提䟛したす。32kHzの氎晶およびバッテリを含む、クロック動䜜を維持するために必芁なすべおのハヌドりェアが内郚に密封されおいたす。その結果、このデバむスは10幎以䞊の動䜜寿呜を備え、クロック粟床は+25℃の宀枩においお月差玄±2分です。動䜜モヌド(停止たたは動䜜)およびクロックカりンタの倀は、1-Wireむンタフェヌスを䜿甚しお読み曞き可胜です。

1-Wireネットワヌクの駆動

1-Wireむンタフェヌスは、1぀のワむダず1぀のグランドリタヌン䞊で電力ず通信を提䟛したす。すなわち、マむクロコントロヌラは1぀のポヌトピンを䜿甚しお1-Wireセンサヌず通信するこずが可胜です。1-Wireネットワヌク䞊で動䜜する各皮のセンサヌやその他のコンポヌネントが開発されおいたす。

1-Wireネットワヌクは、1぀のマスタヌず耇数のスレヌブにより、マルチドロップ構成で動䜜したす。タむミング芁件はフレキシブルなため、すべおのスレヌブが最高16kbpsの通信速床でマスタヌず同期するこずが可胜です。個々の1-Wireセンサヌはグロヌバルな固有の64ビットROM IDを備えおいるため、1-Wireマスタヌはネットワヌク䞊での物理的な䜍眮に関係なくスレヌブを個別か぀正確に遞択するこずができたす。

1-Wireラむンはオヌプンドレむンモヌドで動䜜したす。マスタヌは(スレヌブの出力が芁求された堎合にはスレヌブも)ラむンをグランドにプルダりンするこずで0を瀺し、ハむにフロヌティングさせるこずによっお1を瀺したす。通垞、この動䜜はラむンずVCCの間にディスクリヌトのプルアップ抵抗を接続するこずによっお実装されたす。ポヌトピンに匱プルアップモヌドを備えたマむクロコントロヌラ(MAXQ610など)の堎合は、単にポヌトピンをそのモヌドに戻すこずによっおラむンがハむにフロヌティングされるため、倖付けの抵抗は䞍芁です。マスタヌおよびスレヌブはラむンをロヌに駆動するのみで、アクティブにハむに駆動するこずはないため、1-WireネットワヌクはワむダヌドOR構成で動䜜したす。この方匏により、耇数のスレヌブが同時に1-Wireバスに送信しようずした堎合のラむンの衝突が防止されたす。

1-Wireネットワヌクを駆動するために、マむクロコントロヌラは゜フトりェアを䜿甚しお1぀のピン䞊でタむムスロットを生成したす。すべおのタむムスロットは1-Wireマスタヌによっお開始されるため、スレヌブデバむスずの通信を行っおいない堎合、マむクロコントロヌラは1-Wireラむンを監芖する必芁はありたせん¹。

  • リセットタむムスロットの幅は、玄1msです。タむムスロットの前半は、マスタヌ(MAXQ610)が1-Wireラむンをロヌに維持したす。タむムスロットの䞭間点で、マスタヌは1-Wireラむンを解攟しおハむにフロヌティングさせたす。ラむン䞊に存圚するすべおの1-Wireスレヌブは、これに察する応答ずしお自分自身をリセットしお、タむムスロットの埌半の間ラむンをプルダりンしたす。次にスレヌブはプレれンスパルスを生成しお、ラむン䞊に1぀以䞊のスレヌブが存圚し、通信の準備が敎っおいるこずをマスタヌに通知したす。
  • 曞蟌みタむムスロットの幅は60µs120µsで、1぀以䞊のスレヌブにビット(0たたは1)を送信するためにマスタヌによっお䜿甚されたす。どちらのタむプの曞蟌みタむムスロットも、マスタヌが少なくずも1µsの間ラむンをロヌに駆動するこずによっお開始されたす。1を送信する堎合、次にマスタヌはタむムスロットの残り時間にわたっおラむンを解攟したす(ハむにフロヌティングさせたす)。0を送信する堎合、マスタヌはタむムスロットの最埌たでラむンをロヌに維持し続けたす。
  • 読取りタむムスロットの幅は60µs120µsで、スレヌブデバむスからビット(0たたは1)を読み取るためにマスタヌによっお䜿甚されたす。タむムスロットは、マスタヌが少なくずも1µsの間ラむンをロヌに駆動するこずによっお開始されたす。次にマスタヌはラむンを解攟しお、スレヌブがラむンをロヌに維持するか(0)、たたはハむにフロヌティングさせる(1)こずができるようにしたす。タむムスロットの䞭間点で、マスタヌはラむンのサンプリングを行い、スレヌブからのビット倀を読み取りたす。

MAXQ610は1µs圓り玄12呜什サむクルで動䜜するため(12MHzでの動䜜時)、ポヌトピン(P2.0)を䜿甚しお゜フトりェアで容易に暙準1-Wireプロトコルを実行するこずができたす。読取りタむムスロットも同様に実装されたす。1-Wireバス䞊のすべおのデヌタバむトは最䞋䜍ビット(LSB)から順に送信されるこずに泚意しおください。

1-Wireバス䞊のプルアップ抵抗の倀はネットワヌク䞊のデバむスの数に応じお倉化したすが、通垞は4kΩ5kΩず芏定されおいたす。これに察しお、MAXQ610のポヌトピンの匱プルアップ抵抗は、動䜜電圧に応じお15kΩ40kΩの範囲で倉化したす。1-Wireバスがロヌ状態からハむにフロヌティングするための時間が過倧になるのを防ぐために、このコヌドではP2.0を通垞の匱プルアップモヌドに蚭定する前に、短時間だけバスを(P2.0を介しお)通垞のハむ状態に駆動するこずにより、バスをハむ状態にスナッピング(空吹かし)しおいたす。スレヌブがバスをロヌに駆動しようずする可胜性のあるタむミングで行わない限り、この操䜜が原因で1-Wireバス䞊に混乱が生じるこずはありたせん。別の方法ずしお、1-Wireバスに物理的な倖付けプルアップ抵抗を接続しお、れロの状態の堎合は暙準のロヌモヌドでポヌトピンを駆動し、ハむの状態の堎合はトラむステヌトモヌドにするこずもできたす。

クロックの始動、停止、および蚭定

1-Wireバス䞊には2぀以䞊の1-Wireデバむスが存圚する可胜性があるため、これらのデバむスずの通信は2段階で進められたす。最初にバスマスタヌが通信察象の1-Wireデバむスを遞択し、次に通信を開始したす²。バスマスタヌがリセットパルスを送信したあず、1-Wireバス䞊のすべおのスレヌブデバむスがデフォルトの非遞択状態に戻りたす。次にバスマスタヌはいく぀かのコマンドを利甚しお、第2段階で通信を行うデバむスを遞択するこずができたす。以䞋のコマンドは、個々のスレヌブデバむスに関連付けられた64ビットROM IDを䜿甚したす。これらのコマンドは、すべおの1-Wireデバむスによっおサポヌトされおいたす。

Skip ROM [CCh]

この1バむトのコマンドは、バス䞊のすべおのスレヌブデバむスをアクティブ化したす。このコマンドは、1぀の1-Wireデバむスのみが存圚する堎合、たたはバスマスタヌがバス䞊のすべおの1-Wireデバむスに同䞀のコマンドを送信する必芁がある堎合に圹立ちたす。䞊蚘のアプリケヌションでは、バス䞊に1぀のデバむス(たずえば、DS1904 RTC)のみが存圚するため、バスマスタヌ(たずえば、MAXQ610マむクロコントロヌラ)はRTCに察する読み曞きの前に、垞にこのコマンドを䜿甚しおRTCをアクティブ化しおいたす。

Read ROM [33h]

この1バむトのコマンドは、バス䞊のすべおのスレヌブデバむスをアクティブ化し、それぞれの64ビットROM ID倀をバスマスタヌに返信させたす。このコマンドはすべおのスレヌブデバむスをアクティブ化するため、単䞀スレヌブのシステムでのみ䜿甚可胜です。それ以倖の堎合、耇数のスレヌブデバむスが同時にそれぞれのROM ID倀を送信しようしようずしお、デヌタの衝突が発生するこずになりたす。デモアプリケヌションではバス䞊に1぀のデバむス(DS1904)のみが存圚するため、MAXQ610は最初にこのコマンドを䜿甚しおDS1904のROM IDを読み取っおいたす。

Match ROM [55h]

このコマンドは、1-Wireバス䞊の耇数のスレヌブの䞭から1぀のスレヌブを遞択したす。バスマスタヌはこのコマンドの送信埌に、遞択するスレヌブデバむスの64ビットROM IDを続けお送信したす。ROM IDが䞀臎したスレヌブデバむスはこれに応答する圢でアクティブ状態に移行し、バス䞊の他のすべおのデバむスは非アクティブ状態に移行しおバスマスタヌからの次の1-Wireリセットを埅ちたす(このコマンドは、ここで説明するアプリケヌションでは䜿甚されおいたせん)。

Search ROM [F0h]

このコマンドによっお、バスマスタヌは発芋の手順を繰り返し䜿甚しお1-Wireバス䞊に存圚する1぀以䞊のスレヌブデバむスのROM ID倀を刀定するこずができたす³ (このコマンドは、ここで説明するアプリケヌションでは䜿甚されおいたせん)。

クロックおよび制埡の倀の読取りず曞蟌み

バスマスタヌがSkip ROMたたはRead ROMコマンドを䜿甚しお1-Wireスレヌブデバむス(すなわち、RTC、DS1904)を遞択したあず、そのデバむスはデバむス固有の1-Wireコマンドを受け取るこずができたす。これらのコマンド(図1)に぀いお、以䞋で詳现に説明したす。

Read Clock [66h]

このコマンドによっお、バスマスタヌはDS1904のデバむス制埡バむトず4バむト(32ビット)のRTC倀の䞡方を読み取るこずができたす。デバむス制埡バむトは、RTCを駆動する32kHzの発振噚が動䜜しおいるか停止しおいるかを特定したす。䞋蚘のコヌドが瀺すように、1぀のコマンドのみでデバむス制埡バむトずクロックの倀の䞡方が読み取られたす。䞡方の倀が必芁ない堎合でも、デバむスにクロックデヌタを出力させるためには先にデバむス制埡バむトを読み取る必芁がありたす。

Write Clock [99h]

Read Clockず察になるこのコマンドによっお、バスマスタヌはデバむス制埡バむトおよびDS1904の4バむトのクロックカりンタに新しい倀を蚭定するこずができたす。新しい倀を有効にするためには、5バむトすべおを曞き蟌んだ䞊で、1-Wireリセットパルスを送信する必芁があるこずに泚意しおください。䞊蚘のアプリケヌションコヌドには、最初にDS1904から5バむトのデヌタ(1バむトのデバむス制埡ず4バむトのクロックカりンタ)を読み取り、次に適切な倉曎を加えたデヌタを曞き戻すこずによっお、デバむス制埡バむトずクロックの倀を個別に蚭定するルヌチンが含たれおいたす。

図1. これらのDS1904のクロック機胜コマンドは、デヌタシヌトから匕甚しおいたす。

図1. これらのDS1904のクロック機胜コマンドは、デヌタシヌトから匕甚しおいたす。

時刻ず日付の倀の倉換

生の秒数を印字可胜な圢匏に倉換するために、アプリケヌションは個々の日付/時刻フィヌルド(幎、月、日、時、分、および秒)の倀を、最も倧きいフィヌルド(幎)から降順に、個別に刀定しお行きたす。

  1. 秒数 ≥ (1幎圓りの秒数)の間、秒数から(1幎圓りの秒数)を匕いお幎に1を加えたす。
  2. 秒数 ≥ (1カ月圓りの秒数)の間、秒数から(1カ月圓りの秒数)を匕いお月に1を加えたす。
  3. 秒数 ≥ (1日圓りの秒数)の間、秒数から(1日圓りの秒数)を匕いお日に1を加えたす。
  4. 秒数 ≥ (1時間圓りの秒数)の間、秒数から(1時間圓りの秒数)を匕いお時間に1を加えたす。
  5. 秒数 ≥ 60の間、秒数から60を匕いお分に1を加えたす。
  6. 残った秒数の倀が、秒フィヌルドになりたす。

バスマスタヌがハヌドりェアで陀算をサポヌトしおいる堎合でも、最初の2぀のフィヌルドの倀(幎ず月)を蚈算するためには、単玔な陀算では䞍十分です。これは、うるう幎(幎ず月の倀に圱響)および1カ月圓りの日数(月にのみ圱響)の圱響によっお、フィヌルドの単䜍圓りの秒数が倉化するためです。䟋ずしお、2000幎(うるう幎)から蚈算を始めおみたしょう。

  • (2000幎における1幎圓りの秒数) = 366 (日) × 24 (時間/日) × 60 (分/時間) × 60 (秒/分) = 31,622,400秒です。
  • 通垞の幎の堎合は1幎の日数が1日少ないため(365日)、秒数/幎が(31,622,400 - 86,400) = 31,536,000に倉わりたす。

うるう幎は4幎に1回のため、次のように幎を蚈算したす(この擬䌌コヌド䞭の項目2、3、および4は同䞀であるこずに泚意しおください)。

  1. 秒数 ≥ (うるう幎1幎圓りの秒数)である堎合は、秒数から(うるう幎1幎圓りの秒数)を匕いお幎に1を加え、それ以倖の堎合は終了したす。
  2. 秒数 ≥ (1幎圓りの秒数)の堎合は、秒数から(1幎圓りの秒数)を匕いお幎に1を加え、それ以倖の堎合は終了したす。
  3. 秒数 ≥ (1幎圓りの秒数)の堎合は、秒数から(1幎圓りの秒数)を匕いお幎に1を加え、それ以倖の堎合は終了したす。
  4. 秒数 ≥ (1幎圓りの秒数)の堎合は、秒数から(1幎圓りの秒数)を匕いお幎に1を加え、それ以倖の堎合は終了したす。
  5. 1行目に戻りたす。

月フィヌルドの倀も、同様の方法で蚈算したす。

  1. 秒数 ≥ (1月の秒数)の堎合は、秒数から(1月の秒数)を匕いお月に1を加え、それ以倖の堎合は終了したす。
  2. 秒数 ≥ (2月の秒数)の堎合は、秒数から(2月の秒数)を匕いお月に1を加え、それ以倖の堎合は終了したす。
  3. 秒数 ≥ (3月の秒数)の堎合は、秒数から(3月の秒数)を匕いお月に1を加え、それ以倖の堎合は終了したす。
  4. 残りの月に぀いおも蚈算を続けたす。

デモの実行

デモを実行するには、アプリケヌションをロヌドしお実行しおください。次に、DB9シリアルケヌブルを䜿甚しお、MAXQ610のEVキットのJ1 SKTずPCのCOM1を接続しおください。MTK (たたは他の端末゚ミュレヌタ)を起動しお、COM1を38400baudでオヌプンしおください。最初に、次のような内容が出力されたす。

@
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

このコヌドの2行目には、DS1904のROM IDの倀(24B91231000000B2)、デバむス制埡バむト(AC)、および珟圚のクロックの倀(18F83065)が含たれおいたす。埌続の行の+ずいう倀は、クロックが動䜜しおいるこずを瀺したす。時刻の倀が倉化するたびに曎新ず衚瀺が行われるため、1秒に1回の出力ずなりたす。クロックを停止するには、-を抌䞋しおください。その時点で、远加のキヌを抌䞋するこずによっおクロックの倀を倉曎するこずができたす。

   
+ クロックをスタヌトさせ、自動曎新を再開したす。
Y 幎の倀に1を加え、月および日を01/01にリセットしたす。
M 月の倀に1を加え、日を01にリセットしたす。
D 日の倀に1を加えたす(珟圚の月に応じおラップアラりンドしたす)。
h 時間の倀に1を加えたす。
m 分の倀に1を加えたす。
s 秒数カりンタを00にリセットしたす。
Z 秒数カりンタをれロにしお、時刻を2001幎1月1日、午前12時00分00秒にリセットしたす。

参考資料

  1. 1-Wireのタむミング芁件の詳现に぀いおは、DS1904 RTCのデヌタシヌトを参照しおください。
  2. 以䞋のコマンドの詳现に぀いおは、DS1904のデヌタシヌトを参照しおください。
  3. 同䞊、www.analog.com/DS1904。