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になってしまうことはありません。
| 固定リンク
「Arduino」カテゴリの記事
- Arduinoで「ボコスカハンマー」 あれれれれっ?!(2023.12.07)
- Arduino UNO R3で±19.9V表示電圧計(2023.10.14)
- 「御詠歌プレーヤー」の製作 (MP3-TF-16Pモジュールの使用例)(2023.08.10)
- Arduino UNO R3のソケット・・思えば違和感がぁ(2023.07.07)
- 初めて買ったArduino UNO・・・今は(2023.05.25)
コメント