|
USB接続の時計を作る |
PIC16E1455のブレークアウト基板が出来たので、USB接続の時計を作ってみます。
回路図 ↓ |

「U_BASE」がブレークアウト基板です。ピンの位置も基板と同じです。
秋月電子のRTCモジュール「RTC−8564NB」とLEDを1ヶ接続しています。
モジュールとPIC16F1455間の接続は、I2Cです。RTCはクロックとアラームを出力可能です。
LED1ヶが表示部です。輝度はあまり明るくしません。
I2CのプルアップはRTCモジュール内のプルアップ抵抗を使用します。
☆☆☆ ユニバーサル基板で組み付け ☆☆☆
できあがり↓

※ソフトウェア
仕様:
PCに対して、仮想シリアルデバイスとして動作
(Windows側のドライバは、マイクロチップのデモを無加工で使用)
ターミナル(teraterm等)を使用し、時刻の設定、読み出しを行う
周期的にRTCを読み出し、時刻得る。
取得した時刻をモールスコードに変換し、LEDを点滅させる。
開発環境
コンパイラ XC8 V1.2
統合開発環境 MPLAB XIDE V1.51
フレームワーク Microchip Application Libraries v2012-06-15
書き込み器 PICKIT3
USB絡みのソフトウェアはマイクロチップの「Microchip Libraries for Applications」を元にして作っていきます。
CDCデバイスを作りたいので、「Device - CDC - Serial Emulator」を使います。
このサンプルプログラムは、USB−UARTブリッジとして動作するので、このプログラムを移植すると、ブレークアウト基板がUSB−非同期シリアル変換基板になります。
○ 移植について
16F1459用の雛形があるので、これを使います。
○ LVPについて
USBのD+、D−信号をICSPに使っている都合上、コンフィグレーションレジスタのLVP設定はONにする必要があります。
「#pragma config LVP = ON 」
○ ACTCONについて
水晶振動子を付けずに、USBコントローラを使用する場合、アクティブクロックチューニングをイネーブルにする必要があります。
普通は、OSCCON = 0xFC;ACTCON = 0x90、と設定するだけで問題無いと思いますが、USBハブを挟んでいる場合、運が悪いとクロックがロックしません。
(ハブが悪いのかもしれませんが、そのようなハブが普通に市販されています)
クロックのロックに失敗した場合、PC側は「不正なデバイスを検出した」と判断し、対象となるUSBポートへのアクセスを停止します。(わりと簡単にあきらめてしまいます)
アクセスが停止するとUSBバスのD+、D−に有意な波形を送出しなくなるため、以後クロックがロックすることはありえません。
その様なケースを回避するため、一定期間の間にクロックがロック出来なかった場合、USBのプルアップを中止し、少し待ってから再度プルアップする仕掛けを付けています。
このアクションは、PCからは、USBデバイスがいったん外され、再度プラグインされた様に見えます。
待ち時間が少し必要なので、起動が遅くなるキライがありますが、まあ仕方が無いでしょう。
出来上がり usb2uart.zip
RC4がTxD、RC5がRxDなので、基板のピンは↓の様になっています。

USB→UARTの動作が確認出来たので、その他の部分を作り込んでいきます。
☆☆☆ i2c部分
RTCはI2Cで接続されています。
I2Cのライブラリが、何故かXC8に付いていないので、関数をソースからコンパイルする必要があります。(何故かソースはある。何故かヘッダ”i2c.h”もある)
I2C関係のソースは「C:\Program Files\Microchip\xc8\v1.12\sources\pic18\plib\i2c」にインストールされています。
面倒なので、必要な関数だけを拾って、main.cにコピーしました。
RTCアクセスに必要なi2cの関数は、以下の9つです unsigned char ReadI2C( void );
signed char WriteI2C( unsigned char );
void IdleI2C( void );
void OpenI2C( unsigned char , unsigned char );
void StopI2C( void );
void AckI2C( void );
void NotAckI2C( void );
void StartI2C( void );
void RestartI2C(void);
☆☆☆ 仮想シリアルポート部分
シリアルエミュレータでは、USBからデータを受信すると、そのデータをEUSARTの送信バッファに書き込んでいます。
また、EUSARTの受信バッファに有意なデータが有れば、そのデータを読み出して、PCに向けて送出しています。
今回は、送信と受信のリングバッファを作り、リングバッファを仲介してデータを送受信します。
☆☆☆ コマンド パーサ
簡単なパーサで、ターミナルからの入力処理をします。
PCのターミナルから送られたコマンドに応答して、アクションを起こします。
最初に入力された1文字がコマンド、続く文字列をパラメータとして扱います。
リターンキーを検出すると、コマンドとパラメータの解析を行い、コマンドに従ってアクションを起こします。
○時刻をセットするコマンド 「s」
ex..
2013年7月26日午前9時14分00秒 (時間は24時間制、曜日は未使用)
s 130726091400 (enter)
○時刻を表示するコマンド 「t」
ex.
t (enter)
○入力した文字列を表示するコマンド「e」 (送受信確認用)
ex.
e 12345678 (enter)
○モールス信号で時刻表示を開始するコマンド 「d」
ex.
d (enter)
☆☆☆ LED表示
一定間隔でRTCを読み出し、時刻をモールス信号で表示します。
モールス信号自体は可変長ですが、数字に限れば5音の固定長です。
下記のパターンでテーブルを作り、数字をビットパターンに変換します。
0= 長長長長長
1= 短長長長長
2= 短短長長長
3= 短短短長長
4= 短短短短長
5= 短短短短短
6= 長短短短短
7= 長長短短短
8= 長長長短短
9= 長長長長短
RTCから読み出した時刻に対応するビットパターンをテーブルから拾って、左シフトしながら、長点と短点を送出します。
ビット4が1であれば長点、0であれば短点です。
ソースファイル↓
USB_CLOCK.zip
書き込みツール
ICSPで書き込みを行うために、PICKIT3とモジュールを接続するケーブルが必要です。
-----------------------
部品 6ピンヘッダ
usbミニbコネクタ オス (ハンダ付けタイプ)
配線材 少々
----------------------- 結線表
6ピンヘッダ(pickit側) USBミニBコネクタ
1 VPP 4
2 VDD 1
3 GND 5
4 ICSP_DAT 3
5 ICSP_CLK 2
6 NC
------------------------
↓ こんな風。ケーブルは短めに。

------------------------
USBミニBコネクタは、共立エレショップで扱っている「USB−32BP」です。
千石電商やオヤイデ電気で販売されている物も、たぶん同じ物だと思います。
中国製というだけで、メーカ−は不明、かつ、データシート無しというとても怪しい部品です。
プラスチックのカバーは、一度付けると、外すことが出来ないので、結線して動作確認が済むまでカバーを付けない方が良いでしょう。
※書き込み時の注意
LVPモードで書き込みます。書き込みツールもLVPをイネーブルに設定する必要があります。
書き込み時はPICKIT3からパワーを供給します。供給する電圧は3.3V程度とします。
☆☆☆ 感想
USBから給電するので、ACアダプタ不要なのがいいですね。
セルフパワーのハブを使えば、PCの電源を落としても給電が継続します。
モールス信号の光表示は、最初はたぶん読めません。
3日程度すると、目が慣れて読める様になります。
暗闇で時間を知る手段としては、実用性が無いこともありません。
私は乱視が強いので、メガネ無しでは時計の文字盤が読めないのですが、この時計ならば離れていても読むことができます。
( 因みに7segLEDの時計は、乱視があると暗闇ではボケボケになって全く判読できません。)
|
|
|