« ディジタル一眼レフ(続) | メイン | あのチームのFA補強 »
2005年11月28日
一連のタイミング問題をまとめる
一連の、タイミングのシビアなプログラムの件を、忘れないうちにまとめておく。すべて互いに深くかかわりのある問題だった。
1) (そもそもの過ちの始まり)内蔵OSCのPIC12F629を採用する。UARTもPWMもないのに、シリアル受信とLED輝度のPWM制御を、いずれもソフトウエアでやろうとする。
2) LEDの輝度制御をタイマ割り込みで行うが、その処理時間が、UARTの1ビット分の待ち時間よりも長くなり、ビット落ちが生じている。
3) そこでプログラムをフルアセンブラで記述し、タイマ割り込み処理を1ビット分の時間(52us@19200bps)の半分よりも短い24usとする。
4) シリアル受信の開始タイミングを、スタートビット開始(TTLレベルで立下り)から0.5ビット分待ったあとからサンプル開始していたのを、短くする。この待ち時間は、内蔵OSCの発振周波数のバラツキにも関係するが、試行錯誤後、5usがよいと結論。
5) 内蔵OSCの安定化のためには、パスコンが有効。しかし1000個近い基板のすべてに取り付けるのは困難なので、試行錯誤の上で、3個に1個の割合+末端の1個にとりつけることにする。少なくとも常温では大丈夫そうだ。
6) この後は、PIC12F629基板が1000個近くなり、しかもアクリル封入されるので、こちらに手を加えるのはご法度となる。
7) PC側にUSB-シリアル変換器を15個接続する予定が、シリアルデータの送出タイミングがそろわないことが判明。
8) そこでUSB-シリアル変換器を1個とし、そこから115200bpsで送出したものをPIC16F873で受け、それを19200bps×15分配して送出する、という構成とする。
9) 当然UARTが16個(受信1個+送信15個)もない(PSoCでも足りない)ので、送出を19200bpsの1ビット分の時間である52usごとにタイマ割り込みで行う。
10) 52usのタイマ割り込みで、送出データを、スタートビット→データの各ビット×8→ストップビット、と順次生成し、出力ポートの値を設定する。
11) しかしスタートビットとストップビットの生成が、各ビットの生成よりも早く終わるため、スタートビットとストップビットのみ、送出のタイミングが少し(といっても10us程度も)早い=スタートビットが10us程度長い
12) これを受けるPIC12F629側は、スタートビットの開始のタイミングから、前述のとおりかなりシビアなタイミングでデータを受けるので、このスタートビットの長さは致命的。(これはPIC12F629側で、ビットサンプリングのタイミングを、別の出力ポートをフラグとして使ってオシロで観測してつきとめる)
13) PIC16F873側のタイマ割り込みルーチン中のスタートビット生成の部分の処理時間が、各ビットの生成と同じタイミングになるように、nopを入れて時間調整し、処理時間をそろえる。
14) 完成。
ふー。
投稿者 akita : 2005年11月28日 08:57
トラックバック
このエントリーのトラックバックURL:
http://akita11.jp/mt/mt-tb.cgi/359