2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

PICマイコン

2014年9月20日 (土)

プレイステーション用コントローラDUALSHOCK2の使い方

本ページでは,ロジクール社製ワイヤレスPSコントローラを使って,ロボを操縦するまでの過程を紹介する.(過去に作ったHPの焼き直しです)

 ここに掲載するプログラムの製作にあたっては,”プレイステーション・PAD/メモリ・インタフェースの解析”を参考にしました.実際に自分でプログラム製作を試してみる場合は,まずここの資料を印刷して読みながらやるといいと思います.

 

PS用コントローラ(PSパッド)のメリット

 プレイステーション用のワイヤレスコントローラは,ラジコンプロポよりも安価で携帯性にすぐれていることから,ロボコンや,ROBO-ONEでよ く見かけるようになった.プロポでは単純に前後左右しか指示できなかったが,プレステパッドのグリグリスティックを使うことで,全方向を指定できるように なったり,ボタンを押す強さによって,パンチ等を繰り出す速さを調節したりといった高度な機能を実装できるようになった.たかがゲームのパッドだが,見た 目によらず高度な操縦を実現できる.

 


 

準備するもの

・PS2用ワイヤレスコントローラ 1ヶ

・後述の受信回路

・PSパッド用のメス側コネクタ
(PCサプライのコーナーにUSB変換ツールが売っている。これをばらして取り出してくるしかない。単体では売ってない。昔シリコンハウスに一時期置いていたのだが。。。)

注意点

 プレステ本体は,PS,PS2,PS3と進化を遂げたが,コントローラの外観はほとんど変化していない.しかし,初代PSのデュアルショックはボ タンのONOFFを読み取るだけだったのに対して,PS2ではボタンが押された強さを読み取ることができる.さらにPS3では完全に無線化され,コント ローラ内部に加速度センサを内臓することでコントローラがどのように傾けられているかが検地できるようになった.通信の方式は基本的な部分は同じだが,ボ タンの押す強さを読み取るにはPS2特有のコマンドを発行する必要がある.

 PSパッド用のコネクタは普通は単体で売っていないので,”PSパッド→USB変換機”等を購入し,それをばらしてくるしかない.PSのバージョンによるコネクタの形状の違いはない.AKIBAや日本橋の電器屋街にいけばジャンク品として叩き売られているかも.

 ロジクール以外にもワイヤレスコントローラを作っているメーカーはたくさんあるが,どこのメーカーがいいかはさっぱりわからない.筆者はただ,デ ザインの良さと,使っている人が多いからという理由で選んだにすぎない.このパッドは電気屋で買ってきたのだが,HORIの無線パッドの方が連射機能が付 いていて100円安かったと思う.

--------------------試し方----------------------
 パッドは3.3Vで動作するので,ここでは単三電池2本でPICとパッド両方を駆動することとする.準備するのはPICと抵抗2つなので,ブレッドボード だけで十分試すことができる.PICの機種は20MHz対応なら何でも(PIC16F48A等)でも可.

Pspadpin

↑PSパッド駆動回路
右端にある端子はPSコントローラのコネクタを示している.中の数字はコネクタのピン番号

接続方法上の注意。

DATラインはプルアップしないと信号が取り出せない。
常に全バイトが0x00となっている場合は、大抵DATラインのプルアップ忘れが原因である。
この辺がちょっと面倒なところ。

パッドとの通信の決まり

☆データ・コマンドはBIT0から7の順に転送される.16進数の01hはb"10000000"となる.

☆PICからのコマンドはクロックの立ち上がりでパッドに受信される.パッドからのデータはクロックの立ち下がりでPICに取り込む.

☆参考資料にはデバイスは100μs以内にACKを返さない場合,未接続と認識される.とあるが,ACKを使って何かしようという気はないので,ここでは無視する.

☆PADのSELから次のSELまでの時間は約16ms.

☆PADはPSからのコマンドを検出して動作を開始する.クロックを送信しながら,1バイト目から5バイト目まで 01h,42h,00h,00h,00hと送信することで,DATピンにデータが送られてくる.SW1,2の部分が我々が今必要としているボタン押下情報 が入っている.

                                                                       
Byte1 Byte2 Byte3 Byte4 Byte5
CMD 01h 42h 00h 00h 00h
DAT -- 41h 5Ah SW1 SW2

まず,目標とする動作を決めていくため,パッドと通信するときの信号の波形を示す.この波形はPIC開発ツールであるMPLAB(ver8位かな)のLogicAnalyzerで出力したもの.



 下に1バイト目のCMDの拡大図を示す.




パッドとの通信の様子




 本回路のDAT信号は,Lレベルが0,Hレベルが1である.上の波形の場合,FFh,41h,5Ah,FFh,FFhが受信されていることになる.つまり,ボタンが何も押されていない状態.ボタンを押すと,最後の2バイトが変化する.

信号タイミングの要点

☆ACKを受信する必要は特にない.数クロック分waitを入れてから次のCLKを送信開始して構わない.


 上のオシロスコープの画像からわかるようにコマンドを送ってから数クロック分の時間ですぐにACKが返ってきていることがわかる.これを受信しよ うとするのは困難.プログラムで利用しないので,ACKの読み取りポートは思い切って省略してしまっても構わないと思われる.読み取り結果に万全を期した いならば,読み取りを2回実行して,結果を比較する方が簡単で良いだろう.

☆CLKは250kHzピッタリにあわせる必要はない.筆者の作成したプログラムは130kHzぐらいで正常に動作することを確認している.ただ,PS本体につなぐためのオリジナルゲームコントローラを自作したい人はPSの仕様ピッタリにあわせなければならないようだ.

☆SELを出してから,CLKを出すまでは数クロック分のwaitを挟まないとキーの読み取りが上手くいかない.症状としては,受信機のLEDがチカチカと不規則に点滅するのですぐわかる.

☆パッドとの通信は10ms程度の間隔をあけて実行しないと,読み取りが不安定になってしまう.PS1の仕様では,パッドとの通信を実行するのは16ms周期となっている.

☆ハイインピーダンス

 なにもつながっていない状態と考える.絶縁状態.

☆オープンコレクタ,オープンドレイン

 PICでいうと,RA4がオープンドレインである.Hレベルを出力できない出力ポート.Hレベルを出力したい場合は,プルアップ抵抗をつなぐ必要がある.

ぐりぐりスティックの位置の読み取り方

 グリグリスティック(以下スティックと記す)の位置を読み取るには,パッド内部の動作設定を行わなければならない.パッド内部の動作設定を行うに は,まず第一にコンフィグモードといわれるモードに移行する必要がある.このモードに入った後,パッドの動作をアナログモードに切り替えてやることで,よ うやくスティックの位置を送り返させることができるようになる.ここではスティックの読み取りが実現するまでの最低限必要なことだけを説明する.

☆コンフィグモードに入ることができれば,その時点からパッドはアナログコントローラとして動作をはじめるので,ボタンの押す強さを読み取る必要がないならば,プログラムの簡略化のためにそのまま使ってしまっても問題ないと思われる.

☆参考資料にはアナログモードのみ8セットのCLKを流すように書かれているが,別にデジタルモードで8セット送信しても誤動作は起こらない.よってデジタルモードかアナログモードか判定する構造をもっていなくても特に問題ない.

 

コンフィグモードに用意されているコマンド

◎クエリーアンドモデル

  パッドの型式を問い合わせる.単にマシンの操縦をするだけなら実行しなくても別に問題ない.

◎振動オンオフ

◎モード切替ボタンの許可不許可

  これはいると思う.知らない間にボタンが押されてモードが切り替わるとややこしい.モードはアナログモードで固定する.




dfad

2013年5月18日 (土)

未知のマイコンを参考書なしで使いこなせるようになる方法。+ PICの仕様書を探すならこのページ

マイコンを使いこなしたいと思ったら、専門書を一冊だけじっくり読む。
読んだら一個ずつ機能を試す。
だから、マイコン電子工作の本がお勧め。できるだけ簡単な題材のものがベスト。


初めて試すならPIC16F84が定番だったので、これの使い方について書かれている本が一番とっつきやすかった。「たのしくできるPIC電子工作」という後閑哲也氏の本はマイコンを始めるきっかけになった。もう10年以上前の本なので、本の中で使っているツールも相当古い。新しく出た本を買うほうが戸惑いがなく良いと思う。


書き込みライターを自作するところから始めなければならなかったが、初期コストが安いのですぐに試すことができた。最初は非常に簡単なソースを打ち込むことから始まるので、ソースをちょっとづつ書き換えながら理解することができた。やはりサンプルプログラムの題材が簡単なものから読み始めるのが良いと思う。いきなりUSB機器を自作しようなんてできない。


最初に買った本をじっくり読んで、試す。割り込みやタイマーの使い方程度がわかったら、後は仕様書を直接じっくり読んで頑張る。そうすれば他のマイコンをいじるときに絶対に役に立つ。あんまりいろんな本に浮気をすると、本ごとに癖が異なったりするのでお勧めはしない。


PICの仕様書は、設定すべき事項が各機能の冒頭などに書かれている。
そのリストを読んでから、ブロック図と照らして取り掛かれば、文章を最初から最後まで読むより効率的にできる。


本と同様、マイコンも乗り換えはお勧めしない。マイコンには専用のツールがつきものなので、いちいちツールの使い方を覚えないといけない。たいていROM書き込みでトラブルがつきものだから時間もお金もかかる。PICを最初にいじったならPIC一筋で性能を使いきったほうがお得。PICのプログラムメモリを全部使い切るプログラムを書けば、PICを卒業しても良い頃でしょう。(※筆者はそうした。)

PICで一通り仕様書読み込みの修行を積んだら、トラ技の付録マイコンを試すもよし。ハイスペックのARMを試すもよし。
(☆トラ技の付録は簡単なようで、たまにピン配の誤植や何やらがある。PICしかやってなかった頃はちょっと難儀した。)



<仕様書のページ>

昔は英語の仕様書しかなかったが、秋月やら浅草技研でポツポツと日本語の仕様書を見かけるようになった。AVRも書籍自体は少ないけれど「AVR.jp」で検索すると、ドキュメントの日本語訳をボランティアでやっていらっしゃるサイトが出てくる。(☆AVR.jpは直リンク禁止のサイトなのでここには貼れません。)

今やPICの仕様書は、ありがたいことに最初から日本語でアップされている。
日本語ドキュメントのダウンロードサイト

PICの種類は爆発的に増え、内臓している機能もコンパレータやらOPアンプやらとんでもないものまで取り込み始めた。中にはUSBやLANの機能を実現するフレームワークなどもあり、非常に高機能化した。Cコンパイラも今はフリーで使うことができる。

これらについて書籍を買えば、サンプルソースが付いているので簡単に使い始めることができる。それだけ目的のものを作るまでの時間も短縮できる。 しかしながら、全部買っていると非常にお金がかかり、大概分厚いので嵩張る(^^;;)

だから仕様書を読むことができればそれだけ得をする。情報の少ないマニアックなマイコンでもフルに使いこなすことができる。

電子工作のためのPIC16F活用ガイドブック

        後閑 哲也 技術評論社 2004-09
        売り上げランキング : 194698
by ヨメレバ

2013年5月16日 (木)

DACをコンパレータの基準電圧に使う PIC16F1936 <続編>DACのステップを小さくするためにFVRを使うテクニック。

DACをコンパレータの基準電圧に使う PIC16F1936
<続編>DACのステップを小さくするためにFVRを使うテクニック。

前回に引き続き、コンパレータの基準電圧をPICの中で作成するテクニックについてメモ。

DACをコンパレータの基準電圧に使って、外部アナログ信号と比較→ピンに出力。という形はスマートで良いのであるが、PIC16F1936のDACが5ビットであるために精度に不満が残る。5V電源を使っているとその5ビット分割だから32等分で、電圧の刻みが0.156V/stepなのだ。

そこで、DACのプラス側電圧を内臓電圧リファレンス(FVR)の2.048Vにして、電圧の刻みを小さくしようと試みた。

サンプルソースはこちら
「DACwithComparator2.c」をダウンロード

<やりたいこと>
コンパレータの基準電圧をDACで作る。ただし、DACは最大電圧2.048Vとし、電圧刻み0.064Vになるようにする。

<具体的な作業 FVR側>
電圧リファレンスのブロック図を見ていると、ADコンバータのFVRはADFVRで独立していて、DACとコンパレータのFVRはCDAFVRで共用になっていることがわかる。

Ws000041

そのことさえわかれば後は簡単。CDAFVRに2.048Vを指定したいのだから、b'10をセットすればよい。そしてFVRENをセットすることを忘れずに。


<具体的な作業 DAC側>
肝心のDACの設定を忘れてはいけない。DACポジティブソース選択ビットというのがあって、これがDACの+側電圧の基準になる。FVR出力を選ぶのでb'10をセットすればよい。


<動作確認方法>
電源電圧は5Vとする。
DACのMAX電圧を2Vに設定したので、DACCON1で設定したDAC値が0x1F(5bitでのMAX値)ならばDAC出力は2Vとなる。つまりコンパレータの出力は2Vで反転するはず。

RA0のC12IN0-ピンに半固定抵抗をつないで電圧を振ってみると、たしかに2Vあたりでコンパレータの出力がパタパタと変化した。

取りあえずFVRが動いていることを見たかったのでDACの電圧刻みについてはまたの機会に。

2013年5月15日 (水)

DACをコンパレータの基準電圧に使う PIC16F1936

内臓コンパレータの入力信号は、レジスタの設定によって自由に選ぶことができる。もっとも簡単な、というか動作を簡単に確認できるのは、入出力をピンに出してくる使い方だが、ここではちょっと進んで、DACの電圧をコンパレータの基準電圧に使う方法をメモ。

サンプルソースはこちら
「DACwithComparator1.c」をダウンロード

DACの出力をコンパレータの+に入れる。
コンパレータの-はアナログ入力。
コンパレータの出力はC1OUTピンへ。

コンパレータの各部信号のセレクトの仕方は、この図のようになる。

Pic_withdac


コンパレータの+側のMUXをDACにするのがミソだ。コンパレータ1を使っているならC1PCHレジスタにDACを選択するb'01をいれればよい。

もちろんDACモジュールも別途設定しなければならない。
Ws000039

この図の中の右端矢印の記述から、DACの出力は確かにコンパレータとADCにつながっていることがわかる。この矢印に出力を出したければ、下のCVrefというピンに引っ張られたくないので、DACOEは0にクリアしなければならない。

DACの+-の基準電圧は、いつもどおり電源VccとGNDでいけばよいだろう。DACENをセットするのを忘れずに。

最後にDACCON1で出力したいDAC値をセットして完了。PIC16F1936は、5ビットなのでそれ以上のビットをセットしても無効なので注意。


最後に、動作チェックをしてみた。
サンプルソースではDACCON1に0x05をセットしているので、電源5Vだから

5V / 32 * 0x05 = 0.781V

つまり、コンパレータのマイナス側の電圧が0.781Vになった時、コンパレータの出力が切り替わるということ。RA0のC12IN0-ピンに半固定抵抗をつないで電圧を振ってみると、たしかに0.8Vあたりでコンパレータの出力がパタパタと変化した。


DACのレンジを調節して1ステップの刻み電圧を細かくする<続編>はこちら。

2013年5月14日 (火)

PIC16F1936の内臓DAC(5bit)を動かしてみた。

いつも使っているPIC16F1936に内臓されているDACを試したのでメモ。

まずはサンプルソース
「1936_DACtame1.c」をダウンロード

ここでは
DACの出力をDACOUTピンから出すように設定している。

基本的な設定は、他のDAC内臓PICと同じ。
多分H8等の他のマイコンでも設定項目は同じ。

DACの電源電圧+側と-側をそれぞれ選ぶことができる。大雑把に言うと、+側と-側の電圧差を5ビットで分割した電圧がDACOUTから出てくる。5ビットのどこの電圧を出すかをDACCON1で選択する。

<設定項目>
・+側の基準電圧 デフォルトはPICの電源 Vcc
・-側の基準電圧 デフォルトはPICのGND
・DACENフラグを1にセット
・DACOEフラグを1にセットするとDACOUTピンからDACが出力される。

これら設定項目を仕様書のビット表から探して入れる。

DACCON1に設定する値に注意。5ビットなので、それよりも大きな値は設定してもDAC出力が変化しない。たとえば0x20をセットしても、セットできない値なので、DACCON1は0x00になってしまう。

8ビットDAC内臓のPIC16F1783についても記事を書いています。

2013年5月13日 (月)

秋月のリアルタイムクロック RTC4543をPICで動かす

RTC4543をPIC16F1936でデータ読み出ししたときのソースとそれまでの過程をメモ。

まずはソース。秒の桁だけを読みだす動作をする。オシロで見ると秒がカウントされている様子が簡単に確認できる。

「RTC4543_reader1.c」をダウンロード


秋月の説明書から、データリードのタイミングチャートを見てみると、一発目のクロックを立ち上げた瞬間に秒の1の桁。2発目のクロックで秒の10の桁のビットが出力される。クロックの立下りのタイミングでビットを読めば丁度出力のど真ん中で確実に読める。

その通りになるように、PICでシーケンスを組んでビットを読ませてみた。

YOUTUBEで動作波形の動画を見る。

上の波形がクロックで、下の波形がクロックICから読み出したデータ。クロックの立下りでビットを読み込むが、ここでのサンプルソースは、単にクロックとCE、WRを操作しているだけである。1クロックは10us周期としている。

出力はLSBからとなっている。BCDで2桁なので、最下位ビットから4ビット
1の桁。さらにその先が10の桁。
1の桁が10になったら5ビット目に1が立つので、バイナリカウンタのカウントアップを見ているときとは様子がだいぶ違う。


ポートの操作ができさえすれば簡単に読み出しができるので、実は初心者向けかもしれない。
数msのクロック周期でも動くと説明書には記載されていることから、パルス長、タイミングについてもよほど長くしたり短くしたりしなければ動作する。

しかし自分としてはPICの内臓SPIなどを使って読み出せたほうがありがたかったかもしれない。SPIなら周波数とビット数くらいをセットすれば自動的にやってくれる。一方、本ICではポートを地道にいじる必要があり、デバッグ作業は中々面倒であったし、別のマイコンで使おうとしたらそのマイコンに合わせてポート操作の箇所を変更しなければならないからだ。



2013年5月11日 (土)

MPLABX Logic Analyzerの使い方 デバッガの設定方法

MPLABXのロジックアナライザーについて
MPLABのウリの一つがこのロジアナであり、Simulatorでポートをパタパタさせた結果が波形として表示される優れものである。しかしMPLABXにしてから、全く波形が出てくれなくなった。おかしいと思って英語サイトをあさってみると、解決方法が見つかった。
Simulatorの設定方法が非常に煩雑になったので、ストレートにはいかなかった。まず、コンフィグメニュー自体がわかりにくい。
<まずはコンフィグメニューの出し方>

Ws000039projectmenu


Projectsタブの、ICのアイコンのところで右クリックし、ポップアップの一番したのPropertiesを選ぶ。


Ws000040config

こんな画面が開くので、Simulatorを選ぶ。
そしてOption categoriesでTraceを選ぶ。
このままだと何もコンフィグできないので、右下にあるUnlockを押す。
すると、すべてのメニューがグレーアウトから、選択ができるように変化する。押してから画面が変化するまで少しタイムラグがあるので焦ってはいけない。


Data Collection Selectionが重要で、DefaultではOffになっている。ロジックアナライザーはこれがOnになっていないと動作しないことが、PICのフォーラムで報告されている。(このレポートを見つけるまでやり方がわかるわけがない。わかりにくすぎる。)
Data Collection SelectionをInstruction Traceにして、右下のApplyボタンを押すと、ロジックアナライザーが動作を始める。

Ws000041logicana
こいつの使い方はMPLABXのヘルプを見ればわかる。
Busというのが新しく追加になっているが、ポートを一個ずつ指定するやり方と大した変わりはない。

ちなみにヘルプは、

Getting Started with the Simulator : Using Simulator Trace : Simulator Trace Setup

とたどれば出てくる。

2013年5月 9日 (木)

PIC 割り込みを使ってシリアル受信する (PIC16F1936)

前回に引き続き、シリアル受信を割り込み(USART割り込み)を使ってやってみた。
使用コンパイラはXC8

サンプルソース
「tame1936-tameSCI-INT_TXRX-32MHz.c」をダウンロード

割り込み処理を追加するだけなので、
前回の記事 に割り込みフラグの設定と、割り込み関数を追加すれば完成する。

具体的には、
グローバル割り込み GIE、ペリフェラル割り込み PEIEをセットして、シリアル受信割り込みのRCIEをセットするだけ。

Ws000036

この図の右下を見るとわかるように、RCIEとRCIFがANDに入っていて、その出力が割り込み発生(Interrupt)となっている。だから、何か受信があってRCIFが1にセットされると割り込みが発生するようになっている。

ペリフェラルの設定では、まずブロック図をみて、どのビットがどんな役割をするか、俯瞰するのがいつものやり方。

精度やエラー処理を気にせず、まずは取りあえずの動作を見てから詳細をつめていくほうが、労力は少ない。


2013年5月 4日 (土)

PIC UART シリアル通信の送受信設定(PIC16F1936)

EUSARTはシリアル通信のモジュールで、パソコンのR232シリアル通信 I2Cのような全二重非同期、半二重同期の方式を設定できる。
この記事は、PIC16F1936の仕様書を見ながら、設定項目を埋めていく際に見ていったポイントをまとめている。

この資料→PIC16F1936の仕様書(日本語)

まずはサンプルソース。(13/5/8  動作確認済み)

「tame1936-tameSCI-TXRX-32MHz.c」をダウンロード



EUSARTは以下のような分類がある。やりたい設定の位置づけをまずは確認。

方式で以下の2通りがある。

・非同期式(asynchronous)
パソコンとのR232シリアル通信はこれ。送信、受信側でオシレータを持ち、このオシレータのクロックに従ってビットを送信する。クロックの周波数(ボーレート)を合わせてやらないと正しく通信ができない。

・同期式(synchronous)
マスターのデバイスがクロックとデータを送り、スレーブ側のデバイスが受信したクロックに同期してデータを読み込む。I2Cはこの方式。

さらに通信のラインで2通りに分かれる。

・全二重通信
送信と受信に一本ずつラインがある。送受信が同時にできる。

・半二重通信
通信ライン一本を送信、受信切り替えて通信するので、どちらか一方の動作しかできない。

<設定目標>
PCとのシリアル通信を実験したいので、非同期式の全二重通信を設定する。
1バイトは8ビットとし、割り込みは使わない。

<設定する項目>

下記項目に沿って非同期受信の設定をする。仕様書222ページには9段階の操作工程が書いてある。しかし、エラー検出などの精度を求めなければ、全てを実施する必要はない。とりあえず必須の項目を挙げるとすれば下記工程となる。

0. 仕様書には工程表に書いていないが、RXのポートを入力、TXのポートを出力に設定する。これを忘れると全く動作しない。

1. 任意のボーレートを実現するため、SPBRGH とSPBRG のレジスタ ペアおよび BRGH と BRG16ビットを初期化する。ボーレートが間違っていても、取りあえず何かは表示されるので動いているかどうかはわかる。

2. CREN、SPEN ビットをセットしてシリアルポートを有効にします。SYNC ビットをクリアして非同期動作にする。これはポートの設定と同様に必ず必要。

  ☆EUSART の受信部は、次の3つの制御ビットを設定すると非同期動作が有効になる。
  ・CREN = 1
  ・SYNC = 0
  ・SPEN = 1

3. データ受信完了するとRCIFビットがセットされる。
 ☆サンプルプログラムではRCIFビットがセットされるのをwhileループで待っている。
  受信に失敗すると次の命令に移れなくなるのであくまで実験向き

4. RCREG レジスタを読み出して、受信バッファから 8 ビットのデータを取得する。

<設定の詳細>
・ボーレートについて
仕様書の227ページにボーレートの計算式が載っているが、別に計算する必要はない。229ページの表から、設定したいボーレートを探して、それに対応するSPBRGをレジスタに入れれば完了する。

Ws000035

[ボーレート設定例]
9600bpsに設定したい。通信エラーについて細かい注文がないのなら、

次の3つの通信エラーに関係してくるビットを全てデフォルト値に設定。

・SYNC=0
・BRGH=0
・BRG16=0

SPBRGに設定すべき値として51(10進数)が得られる。

送信のサンプルソースについてはこちらを参照。
シリアル送信

-------------------------------------------------------------------

PICで楽しむネットワーク接続機器の自作

        後閑 哲也 技術評論社 2008-09-12
        売り上げランキング : 117048
by ヨメレバ

2013年4月26日 (金)

MPLABで割り込み処理をデバッグする。

このあいだ公開したタイマー1を使った割り込みやタイマー0の処理のソースコードを使って、実際にMPLAB(Ver8.86)上でデバッグする方法をメモ。

コンパイルが通ったら、
Debugger→SelectTool→MPLAB SIM
でシミュレータのモードにする。

Ws000017

このメニューが出てきたらOK。
左端にある三角のボタンを押すとシミュレーションが実行される。
まだ押さないで、まずはブレークポイントを設定する。

Ws000018

こんな感じでメイン関数の中の無限ループの手前で一旦とまるようにするのと、割り込み処理interrupt関数の中の最初の処理のところでブレークを掛けてください。

そこまでできたら、先ほどの三角ボタンを押してシミュレーションを実行してください。すると先ほど入れたメイン関数の中のブレークで止まります。

それでは、割り込みの発生時間が正しいかどうか時間を測って見ましょう。PICの開発環境が特に優れているのは、この実行時間を非常に簡単にシミュレーションできる機能だと思います。H8だとデバッガを買わないといけないので高くつき、IO叩いてオシロで見るくらいが関の山でした。

Debugger→StopWatchを選ぶと、StopWatchという窓が開いて、uSecsのところに実行にかかった秒数が表示されるようになっています。

今Main関数内でブレークがかかっている状態から、もう一度実行を押して見ましょう。すると割り込み関数のところでブレークがかかります。このとき、ストップウォッチを見ると、45.6usとなっています。これが割り込みまでにかかった時間です。

それでは、50us周期で割り込みがかかるようにしてみましょう。
割り込みの周期はプリスケーラとTMR1が関係していますが、今45.6usなので、プリスケーラをいじる必要はありません。TMR1の下1バイト。TMR1Lを調節すれば狙いの時間に合いそうです。

いまTMR1Lは0x8Fで時間が足りない状態です。
オーバーフロー割り込みを発生するまでの時間を延ばすには、より多くカウントさせればよいから、TMR1Lの値を減らせばよいことになります。
0x8Aを入れてみます。

ここで注意。メイン関数の冒頭の初期化部分の記述だけを変えた場合は、最初の一回だけ0x8Aで割り込み。その後は変更前の0x8Fの時間で割り込みとなってしまいます。なぜならTMR1に設定されている数値が最初とそれ以降で変わってしまうから。

だから、割り込み関数内の値も同様に0x8Aに変更しておきます。
できれば、これらの値は#define文で記述してやるべきです。少しまずいソースコードを公開してしまった。

同じ要領で実行してみましょう。すると、50.2usという周期で割り込みがかかることがわかりました。

以上で割り込み時間の見方。周期の合わせこみ方は完了です。


PICに関する本をこちらで検索できます。
AmazonAPIでPIC本を検索