2009/02/25

インターフェース誌9月号付録ColdFire基板(2):GPIO(汎用汎用IO)出力

折角組み立てたので、インターフェースのColdFire付録基板にピンヘッダを付けました。その上で、ちょっと接続したいものがあって、基板の外部ピンを汎用IOとして使うテストをしてみました。


MCF52235(というかColdFireコア)は、ほとんどのすべてピンを汎用IO(GPIO)として設定することができます。MCF52235のマニュアルを参考にしながらテストプログラムを作成しました。
main()
{
char *ispbar = 0x40000000;
long panpar = 0x10006a;
long ddran = 0x100022;
long portan = 0x10000a;

char *p, v, c;

PrStr("Show PANPAR\r\n");
p = ispbar + panpar;
v = *p;
PrHex(v);
PrStr("\r\n");

PrStr("Set and Show DDRAN\r\n");
p = ispbar + ddran;
*p = 0xf;
v = *p;
PrHex(v);
PrStr("\r\n");

PrStr("Write to PORTAN...\r\n");
p = ispbar + portan;
for(c=0;;c+=3) {
*p = c & 0xf;
}
}
ispbarというのはメモリマップドレジスタの先頭アドレスで、今回の基板では0x40000000になっています。

マニュアル中のレジスタの位置などは、大体このレジスタの値へのオフセットとして表記されています。

その次のpanparというのは、ispbarからオフセット0x10006Aにあるレジスタで、ポートANのPAR (Pin Assignment Register)という意味です。今回は、ANポート(アナログ入出力ポート)をIOピンとして使うのですが、panparはリセット後は0になっていますから、何もしなくても汎用ディジタルIOピンとなっています(確認のために読み出しています)。

ちなみに、付録基板に搭載されている3軸加速度センサはAN5、AN6、AN7に接続されています。ad::adinitを実行すると、panparの値が0x70に変化することがわかります。

さて、ANポートを出力ピンにするにはDDRAN(Data Direction Register AN)を使います(オフセット0x100022)。各ビットがAN0~An7の各ポートに対応していて、0の場合にはそのANポートは入力、1だと出力となります。今回下位4ビットを出力で使用するので0xfを書き込みます。

これで書き込みの準備はOKです。最後に、書き出したい値をPORTAN(オフセット0x10000A)に書き込んでやると、任意の値をディジタルIOとして出力することが出来ます。今回は+3しながら値を書き込んでいます。

このプログラムをtftpで基板に転送し、runで実行させると
run
Show PANPAR
00000000
Set and Show DDRAN
0000000f
Write to PORTAN...
となって、PANPAR、DDRANなどのレジスタが期待通りの値になっていることがわかります。


こちらは、カメレオンUSBで計測したAN0~AN4の値です。正しく3ずつ増加しているので、正しく動いているものと思われます。

ループ一回あたり約1m秒掛かっていることが判ります。ちょっと遅い気もしますが、インタプリタだし仕方ないといえば仕方ないかもしれません。

0 件のコメント: