2008/8/16 土曜日

トラ技2008年8月号付録マイコン「NEC 78K0」を用いた赤外線物体検出

Filed under: マイコン — 平川 滝雄 @ 2:44:41

こんばんは.

今回は78K0マイコンを用いた物体検出についてのメモ書きです.
ことの発端は研究室の鍵を閉まってあるキーボックスが別の階にあるので,今鍵があいているのかがわかるシステムが欲しいということでした.
まあFericaリーダをつけて,サーボモータを動かしてサムターンを回すというネタがありましたが,今回はそれには触れません.

鍵をしまう箱に赤外線LEDと赤外線リモコン受信モジュールを用いて,鍵検出(広くいえば,物体)を行います.
通信できれば,当然鍵はなく,通信できなければ鍵があるという風に認識します.
その間に別の物が入ってしまうということは考えないことにします.

仕様としては,物があるかないかをシリアル通信でPC側に1bitのデータを送るということにします.
PC側はWEBサーバを立て,携帯から見られる状態にします.
PC側でシリアル通信を行い,文字列を受信するにはPerlで実装するのが一番簡単なようです[1].

赤外線受信モジュール[2]は38KHzでPPM変調[3][4]したものでないと,きちんと出力してくれません.
なので,78k0マイコンでタイマ50を用いて方形波出力をすることに・・・.

自分がハマったこととしては,コンペア値を間違えていたこと.
ここで,38KHzなので,1/(38*1000)=26msec
なので,26msecになるようにコンペア値を設定しました.
すると,L(_)の時が26msecなので,LH(_ ̄)は52msecになります.
つまり周波数としては38/2 となり,半分になってしまいました.

かならずLH(_ ̄)の長さで26msecにならなければならないので,コンペア値は13msecになるように設定する必要があります.
今回はクロック周波数が16MHzで,プリスケーラで1/4にしているので,タイマの入力クロックは4MHz.
なので,1/(4*1000000)=0.25msec
13 (msec)/0.25 (msec)= 52
となり,コンペア値は52を設定しました.
間違えたときは,倍の104でしたorz

よく考えば当たり前のことで,タイマが比較一致した時点で,出力が反転されるというのを繰り返すわけです.
気持ちが焦るあまりに計算を間違えていたので,みなさんも気をつけましょう.

携帯で撮ったので画質が悪いのですが,作っているものを一応あげておきます.

試作品

ちなみに動作しているところの動画です.一応,それっぽく音もなります.

http://jp.youtube.com/watch?v=TcbSzBFR378 

こちらはUSB通信でPCに鍵の有無を1bitで送っている様子です.(0:なし,1:あり)

http://jp.youtube.com/watch?v=jlNNcVXhMcE

そのうちトラ技付録マイコンでの割込みの仕方などをメモに残したいと思います.
では.


参考サイト

[1]TechMemo
Perlでシリアルポートからの文字列を受信して表示

[2]CPUを作ろう
赤外線リモコン受信モジュール

[3]なる研
赤外線リモコンの解析

2008/7/13 日曜日

トランジスタ技術2008年8月号 「@@LCODE」のエラー

Filed under: マイコン — 平川 滝雄 @ 13:46:14

久しぶりにトラ技についていた付録基板で遊んでみようと思いました.
今回はUSB経由でマイコンが書き込めたり,通信できるのですごく便利.

ただし,トラ技BIOSを使用しなければなりません.
本書を読み進めていくと,途中で次のエラーが表示されました.

RA78K0 error E3210: Segment ‘@@LCODE’ is not exist - ignored

これはトラ技のAppendix Aにも書かれているとおりですが「標準のライブラリを使用する 」のチェックをはずすと,エラーになるそうです.

でも,「標準のスタートアップルーチン」と「標準のライブリラリ」のチェックをはずせと書いてあるのに,どういうことだと.
で, 問題は「RAMAPP.dr」に潜んでました.
トラ技に添付れていた「RAMAPP.dr」は次の通り

memory ROM : ( 00000H, 01800H )
memory BROM : ( 01800H, 00800H )
memory UROM : ( 02000H, 02000H )
memory IXRAM : ( 0F000H, 00800H )
memory RAM : ( 0FB00H, 00500H )

#プログラム中で明示的に定義されていないセクションの配置アドレスを指定する
MERGE @@CODE : = IXRAM
MERGE @@CNST : = IXRAM
MERGE @@DATA : = IXRAM
MERGE @@R_INIT : = IXRAM
MERGE @@R_INIS : = IXRAM
MERGE @@LCODE : = IXRAM

で,本来なら,最後の行がコメントアウトされていなければならないようです.
それなのに,コメントアウトがついてません.
次のように書き換えて実行すると,

#MERGE @@LCODE : = IXRAM

次のような警告が出るものの,ビルドに成功しました.

RA78K0 warning W4301: Can’t initialize RAM area ‘f000h - f002h’
RA78K0 warning W4301: Can’t initialize RAM area ‘f003h - f052h’

めでたし,めでたし.

最初で自分のようにつまづく人が出てくると思ったので,書いてみました.

もし間違い等あればご連絡ください.


追記 2008.7.14

なひたふJTAG日記に公式?の訂正が掲載されておりました.
詳しい解説も載っておりますので,そちらも併せて参照してください.

なひたふJTAG日記,”トラ技78Kマイコンのコンパイルエラー”
http://nahitafu.cocolog-nifty.com/nahitafu/2008/07/78k_0cec.html

HTML convert time: 0.117 sec. Powered by WordPress ME