« 秋月のアナログテスター「7007」、可動コイル式メーターは発電機だった! | トップページ | Arduino 放置したポートが及ぼす電源電流変化 »

2020年5月 2日 (土)

Arduino ポートの初期化と通信設定

2020年4月25日:Arduino やっぱり気になる放置ポート に絡んで、ArduinoのI/Oポートの初期化、こんな方法(3ポートいっぺんに記述)を提案しました。
// I/Oイニシャル
  PORTB = 0b00011100;   // data/pull up
  DDRB = 0b00101111;   // port指定
  //     |||||+---- PB0 IO8  out 赤LED (Lでon)
  //     ||||+----- PB1 IO9  out 緑LED (Lでon)
  //     |||+------ PB2 IO10  out CS カードアクセス時Lに
  //     ||+------- PB3 IO11  out MOSI カードDI
  //     |+-------- PB4 IO12  in MISO カードDO
  //     +--------- PB5 IO13  out SCLK
  PORTC = 0b00000000;   // data/pull up
  DDRC = 0b00111111;   // port指定
  //     |||||+---- PC0 AD0  out -
  //     ||||+----- PC1 AD1  out -
  //     |||+------ PC2 AD2  out -
  //     ||+------- PC3 AD3  out -
  //     |+-------- PC4 AD4  out -
  //     +--------- PC5 AD5  out -
  PORTD = 0b10000011;   // data/pull up
  DDRD = 0b01111110;   // port指定
  //    |||||||+---- PD0 IO0  in RXD
  //    ||||||+----- PD1 IO1  out TXD
  //    |||||+------ PD2 IO2  out -
  //    ||||+------- PD3 IO3  out -
  //    |||+-------- PD4 IO4  out -
  //    ||+--------- PD5 IO5  out -
  //    |+---------- PD6 IO6  out -
  //    +----------- PD7 IO7  in SW入力 pull up

PortBとPortCがそれぞれ6ビット、PortDが8ビット。
「pinMode(1, OUTPUT);」などと一つずつ記述するのではなく、まとめてやってしまおうという方法です。
合計20ビットのポートの状態を6行で記述できます。

さて、そこで「どうしたら」というのがPortDの「RXD」と「TXD」の二つ。
PD0のRXDは受信なので入力、PD1のTXDは送信なので出力です。
ポートを初期化した後に「Serial.begin(9600);」と通信設定するのは納得できるでしょうが、通信設定した後にポートを初期化したらRXDとTXDのH/L状態がおかしくならないかという心配が残ります。

これ、心配ご無用。
シリアル通信を有効にしたら、
 ・PD0:RXD DDRDのDDD0の状態にかかわらず入力に。
 ・PD1:TXD DDRDのDDD1の状態にかかわらず出力に。
になります。
 ※この時PORTD0ビットでPD0のプルアップ制御が可能。

ですので、先にポートを初期化したい時はこんな具合に。
  PORTD = 0b00000011;  // TXD,RXD pull up
  DDRD = 0b11111110;  // RXDだけ入力 TXDはHを出力 他は出力
  Serial.begin(9600);   // 通信設定

あるいは、これでもok。
  PORTD = 0b00000011;  // TXD,RXD pull up
  DDRD = 0b11111100;  // TXDとRXDは入力 他は出力
  Serial.begin(9600);   // 通信設定

しかし、これを、
  PORTD = 0b00000000;  // portD全部Lに
  DDRD = 0b11111111;  // 出力指定
  Serial.begin(9600);   // 通信設定 TXD,RXD L→Hに
こうしちゃうと、TXDとRXDのラインに不要なLパルスが出てしまいます。
   (3uSくらいのLパルスが出現)

先に通信設定してもok。
  Serial.begin(9600);   // 通信設定
  PORTD = 0b00000000;  // TXD,RXD 0にしてもH/L変化しない
  DDRD = 0b11111111;  // 全部出力にしてもRXDは入力
この場合、後で設定するポートの初期化でTXDとRXDがLになりそうですが、ポートの出力回路がシリアル回路側に切り替わっているので、Lになってしまうことはありません。

 

|

« 秋月のアナログテスター「7007」、可動コイル式メーターは発電機だった! | トップページ | Arduino 放置したポートが及ぼす電源電流変化 »

Arduino」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 秋月のアナログテスター「7007」、可動コイル式メーターは発電機だった! | トップページ | Arduino 放置したポートが及ぼす電源電流変化 »