SilentCが使っていないモジュールを探せ(4) [ColdFire V2]
モジュール探訪の旅。 今日は、Pulse-Width Modulation (PWM) を走ります。
最初はレジスタ・ダンプ
PWMは、レジスタに設定した値に従って、パルス波形を作ります。 こういったモジュールなら、SilentCからでも簡単に使えそうです。 まず、レジスタ領域のダンプをとりました。
401b0000 00 00 00 00 00 00 00 00 ........ 401b0008 00 00 00 00 00 00 00 00 ........ 401b0010 00 00 00 00 ff ff ff ff ........ 401b0018 ff ff ff ff ff ff ff ff ........ 401b0020 ff ff ff ff 04 00 00 00 ........
全く使われていないようで、デフォルトのままです。 ただ一箇所だけ、PWM7INビットがセットされているのがデフォルトから変わっています。 このビットはPWM7端子の状態をモニタするためのRead-onlyビットなので、このような値が返ってきたのでしょう。 でも、PWM7端子は、どこにも割り当てていないんだけどな?
おなじみ、LEDピカピカ
SilentCでは、使っていないらしいので、PWMモジュールを使って恒例のLEDピカピカをプログラムしてみます。 PWM出力は、いくつかの端子から出すことが出来るのですが、先人に倣ってPNQ[1]端子から出力してみます。
PWMを8-bitで使った場合の最大周期を計算すると
128 × 256 × 2 × 255 ÷ 60MHz = 279msec
だいたい3.6Hzの点滅になります。 ちょっと早いかもしれないけれど、この設定でやってみます。
main(){ int *pnqpar = 0x40100068; char *pwme = 0x401b0000; char *pwmclk = 0x401b0002; char *pwmprclk = 0x401b0003; char *pwmscla = 0x401b0008; char *pwmcnt1 = 0x401b000d; char *pwmper1 = 0x401b0015; char *pwmdty1 = 0x401b001d; *pnqpar |= 0x000C; // PNQPAR1=11 (tertiary:PWM) *pwmclk = 0x02; // PCLK1=1 (clock SA) *pwmprclk = 0x07; // PCKA=111 (x128) *pwmscla = 0x00; // SCALEA=0 (x256) *pwmper1 = 0xFF; // PWMPER1=255 *pwmdty1 = 0x7F; // PWMDTY1=127 (50%) *pwme |= 0x02; // PWME1=1 (enable) #stop 0 for(;;){ if (Getc(0)=='q')break; PrNum(*pwmcnt1);PrStr(" ");Sleep(10); } }
コンソールには、PWMカウンタの値を表示しています。 コレぐらいなら、簡単だね。 このPWMモジュールは、ソフトウェアと無関係に動作するので、'q'キーでプログラムの実行が終了した後もLEDの点滅を続けます。
参考文献
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
その節はどうもありがとうございました。
現在、SDメモリを検討していて、また参考にさせていただきますm(__)m
by orya (2009-03-24 23:43)
orya さん、いらっしゃいませ。
色々と気が散ってしまうタチなので、ColdFireは現在休止状態です。
何かおもしろい疑問がありましたら、気を散らせるかもしれませんので、どしどしお知らせください。
by noritan (2009-03-26 10:21)