« いろいろな音をモールス受信練習機で作ってみよう | メイン | 拡張PIC16実験 内蔵温度センサを試す(2/2) »

PIC16F1827時計の製作(4)


ソフトウェアの追加改造
 今回時計制作に使用したEnhanced Midrange CPUと名前の付いた新しい8ビットのPICシリーズは、全て256バイトのEEPROMをもっています。このソフトウエア追加改造でEEPROMの使用法を説明し、その使用例を今回制作した時計で紹介します。
 このシリーズのEEPROMはプログラム・エリアのアドレス上ではなく、独立したエリアに設置されていて専用のSFR(スペシャル・ファンクション・レジスタ)を使ってアクセスしますが、Hi-Tech C言語のインクルード・ファイルの中に既に便利なWrite/Read関数が定義されていますので、これを使用します。
 第1回のCPU紹介でも記述したように、Writeは事前消去不要で、Write命令で自動消去してくれます。Write命令は内部動作完了を待たずにリターンしますので、連続Write時はその前のWrite完了を判断する必要があります。
 この時計への応用としては、年月日時までの4バイトを1時間ごとにセーブしておき、電源断からのPWR-ON復帰時にセーブされた年月日時の0分0秒からリスタートするものです。セーブされた情報がEEPROM初期値のFFや年月日時に該当しなかった場合は、2012年1月1日0時0分0秒からリスタートし、次の時間のカウントアップ時に年月日時をセーブする動作とします。
書き換え回数の平潤化(ウェアレベリング)
 PIC16F1827のスペックではEEPROM単独セルの書換え回数は10万回で、全体の書き換え回数は100万回保障となっています。Flash Memoryを使用しているSDカードやUSBメモリなどは、寿命を延ばすため、書き換え回数が全体のセルで平潤化(ウェアレベリング)するよう複雑なコントロールをしているようです。
 この時計では年月日時までの4バイトを1時間ごとに書き替えるだけですから、同じセルを使っても10万時間(11年以上)は保つ計算ですが、せっかく256バイトありますから、4x64Blockに分割し1日ごとにセーブする場所を変更する構造とします。
 最初の4バイト中の3バイトは、セーブするアドレスのポインタのセーブ場所として使用します。ポインタ書き換え中の停電を考慮して3個のデータを持ち、PWR-ON時に多数決でポインタのアドレスを決定する方式を取ります。これで10万x63=630万時間(719年以上)EEPROMの単独セルは大丈夫になる計算ですが、全体の書き換え回数100万回(1回のセーブで4回Writeするのでポインタ書き換えと合わせて100万回/(4x24+3=99回/日)=>10101日=27.67年)がスペック上の限度となります。
 
ソフトウェア
 Hi-Tech C言語のインクルード・ファイルの中にeeprom_routines.hというファイルがあり、その中にByteごとの読み書きとBlockでの読み書きをする合計4個の関数が定義されています。この時計では年月日時分秒の変数にMicrochip社のサンプル・プログラムの構造体を利用していますので、バイト単位のデータとして取り扱ったほうが簡単なので、バイトごとの読み書き関数を使用します。4バイト連続Writeとなりますので、Read命令が持っているBusy Check機能を使ってWrite動作終了を判断することとします。要するにWriteの前にReadすればOKで、Readが終了すればNot Busyです。
 年月日時の4バイトのWrite/ReadとポインタのWrite/Readの計4個のProcedureを定義しました。この4個のProcedureを宣言して、eeprom_routines.hをインクルードすれば、停電からのリスタートで時間再設定が楽になります。この4個のProcedureを呼んでいる場所は、main関数の初期値セット部分とCalendar関数の60分と24時間の変数更新部分です。詳しくはProgramを読んでください。

   1827RTC_V41.c  1827RTC_V43.c (2012/02/16 Ver.43に変更)
  1827RTC_V44.c  (2012/03/23 構造体を使わない形にした
 
追記
 XTALの発振周波数絶対誤差が±50PPM程度ありますから、1日86400秒x50E-6=4.32秒の日誤差となります。Timer-1のプリセット値の1LSBが1/62500=16E-6(16PPM)となりますので、16PPM単位のXTAL周波数補正はソフトで可能です。筆者の使用した2MHzのXTALは+50PPMくらい早かったので、TMR1Lのプリセット値を計算値の221から218へアジャストしました。16PPM以下の分解能での補正は、発振器の入力側のコンデンサを増減することで可能となります。だいたい1~2PF/PPMくらいと考えて大きな差はないでしょう。

中川 裕三

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/6345

コメント (2)

dummy:

このプログラムを使用していますが、今年の2月の曜日がずれています。
多分、列挙型のスタートが0なのに月は1からスタートしているのが原因と思われます。
調査してみてください。

yoshida@管理者:

ご指摘ありがとうございます。
修正版が届いていましたので、差し替えました。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/