2016年6月10日金曜日

PIC32MXのsleepとかwaitとかdelayする関数について

結論: 無い。

PIC32はdelayするマクロが用意されていないらしい。( yahoo知恵袋 )
別に正確じゃなくていいから、sleep(3) とかそういうことがしたいのよ。。

いろいろ調べてTimer触ったので記念にメモ。

MPLAB Harmonyというものについて

PIC32MXの開発では、開発環境拡張のHarmonyを利用するようになってきているらしい。ネットで少し古いソースコード参考にすると、開発環境に含まれないライブラリをインクルードしてたりして困る。Harmonyには、設定を簡単にするGUI、コードジェネレータ+ライブラリがセットになってる感じだった。Harmonyを使うと20~40%も開発効率があがるとかなんとか。
便利そうだしPIC32の開発に使ってみようと思った。

インストールはググったページみながらやればOK。「MPLAB Harmonyのインストール手順


MPLAB Harmony使ってみる

MPLAB Harmonyの使い方」というページから順にやってみた。丁寧に書いてあるなぁ。。
まずは、コードジェネレータだけ試した。生成したコードをPICKIT3で焼いたらそのままできたのでOK。


タイマーについて

分からない。分からない。分からない。分からない。分からない。本当に分からない。
動かしたけどあってるか自信ない。よく、皆こんな情報だけで動かせるなぁ。。素人にはキツイぜ。

本家サイトの「Using Harmony to Control Timers」に次の表がある。


取りあえず、staticが簡単で使いやすいらしい。

考え方としては、タイマのオシレータに内部クロックを使う場合、
(ペリフェラルクロック) / (プリスケール) / (カウンタ) = 割り込みの頻度
になる。

MPLAB Harmonyの使い方(4)」は前ページで30MHzに設定しているので、それをベースに記述してある。

私は、オシロとか持ってないのでLEDチカチカで割り込みの頻度を確認することにした。PICはいつものPIC32MX120F032B。

タイマ確認手順

まず、harmonyのGUIでクロック設定。Auto-Calculateボタンを押して、表示されるダイアログで20MHzを設定した。


システムクロックを20MHzにすると、デフォルトでペリフェラルバスクロックが半分の10MHzになる。


次にタイマの設定で、MPLAB Harmonyの使い方(4)に書いてある図と自分の設定が合わなくて困った。使い方(4)にある図は次のもの。

一方、私のはこんな感じで若干選択できる項目違った。。


特に分からなかったのが、Clock Sourceで「DRV_TMR_CLKSOURCE_INTERNAL」のINTERNALってなんじゃい!!っていうとこ。参考にしたサイトはPERIPHERAL_CLOCKってあるのに、それが選べなくて悩んだ。
それで、途方にくれながらソースコード生成して、ソースコードジャンプしたら、INTERNALは、PERIPHERALとして取り扱ってるような記述だった。深く考える必要なし(笑)

で、私は10MHzで1秒ごとにLEDを点滅させる作戦だったので、プリスケール256として、timer周期が25.6㎲。よって、1秒の割り込みするなら1/25.6㎲=39063(Timer Period)とした。


設定をしたら、「Generate Code」ボタンを押してソースコード吐き出す。

あとは、Using Harmony Static Drivers to Control Timers を見ながら初期設定を書いてあげた。(最初、 MPLAB Harmonyの使い方(4) だけみながらやったがなんかうまくいかなかったので本家も見た)

app.c の初期化部分で、TRISAレジスタを設定して、RA0を使えるようにして、system_interrupt.c のLEDチカチカする部分こんな感じにした。
---------------------
int status = 0;
    
void __ISR(_TIMER_1_VECTOR, ipl4AUTO) IntHandlerDrvTmrInstance0(void)
{
    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_1);
    status = !status;
    PORTA = status;
}
---------------------

そしたらこんな感じ。



PICは難しいねぇ(笑)