Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 9 months ago.
mbed HRM1017のPortOutの使い方について(再記入)
PortOutでp0からp7をデータバスとして一気に変更しようとしていますが、アクセスを行うと他のポートが勝手に変更されてしまう現象で悩んでします。 使い方、誤り等ご指摘いただけますと幸いです。
以下のソースで動かしています。 内容としまして、
- 1.DigitalOutでp19をHighに設定
- 2.PortOutでp0からp7を一斉に0(ゼロ)設定
- 3.DigitalOutでp19をHighに設定
各操作の後にはpc.printf()を行い3秒空けています。 この状態とp19出力をオシロで観測すると、2.のPortOutを実行した時に、p19がLowになってしまいます。
#include "mbed.h" #include "BLEDevice.h" Serial pc(USBTX, USBRX); // tx, rx for DEBUG I2C i2c0(p22, p20); // sda0, scl0 DigitalOut testout(p19); // TEST out DigitalOut led(p18); // access LED DigitalIn sw1(p16); // next SW1 DigitalIn sw2(p17); // next SW2 #define DBUS_MASK 0x000000FF PortOut dbus(Port0, DBUS_MASK); // data bus /////////////////////////////////////////////////////////////////////////////// int main(void) { testout = 1; // H output p19 pc.printf("p19 = H output.\r\n"); wait(3.0); dbus = 0x00000000; // Data Bus write 0x00 pc.printf("data = 0x00 output.\r\n"); wait(3.0); testout = 1; // H output p19 pc.printf("p19 = H output.\r\n"); wait(3.0); for(;;){ wait(0.5); } }
Question relating to:
1 Answer
8 years, 9 months ago.
私もnRF51822(RedBearLab)で同じ症状発生を確認しました。
HRM1017特有の問題ではなく、nRF51822使用のNordicファミリー全体の問題です。
mbed-dev(従来はmbed-srcでしたが、今はmbedソースファイルがこちらで管理されている)を覗いてみると、すぐに問題がわかりました。
/mbed-dev/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/port_api.c
の中で、書き込み時にマスクパターンを利用せずに、引数をポート全体(32Bit)に書き込んでいる単純なミスです。
port_api.c
void port_write(port_t *obj, int value) { *obj->reg_out = value; }
修正は下記のようにすると良いでしょう(というより他のmbedのコードを拝借してきました)。
void port_write(port_t *obj, int value) { #if 0 // original *obj->reg_out = value; #else // Other mbed's implementation *obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask); #endif }
急ぎで修正したいのであれば、
1) mbedライブラリーを削除
2) mbed-devのライブラリーインポート
3) 上記のファイル修正
で動きます(全ての状態を調べていないのでBugfixと呼べるか不明)。