toneパルスの異常 もうちょっと掘り下げて
toneパルスの異常は、「ポートの直叩き」で出現しました。
ArduinoのI/O処理で一般的に使われる「digitalWrite」では
これが回避されて、異常パルスは出現しません。
まずは、digitalWriteの中を見てみます。
(ソースはwiring_digital.cの中にあります)
void digitalWrite(uint8_t pin, uint8_t val) {
uint8_t timer = digitalPinToTimer(pin); // PWM出力で使ってる?
uint8_t bit = digitalPinToBitMask(pin); // ビット位置
uint8_t port = digitalPinToPort(pin); // ポート番号
volatile uint8_t *out;
if (port == NOT_A_PIN) return; // ポート間違っている
if (timer != NOT_ON_TIMER) turnOffPWM(timer); // PWM出力オフ
out = portOutputRegister(port); // 出力レジスタアドレス
uint8_t oldSREG = SREG; // SREG(割り込みの状態)をセーブ
cli(); // いったん割り込み禁止に
if (val == LOW) *out &= ~bit; // 出力ピンをLに
else *out |= bit; // Hに
SREG = oldSREG; // SREG復帰
}
出力ポートを操作する「*out &= ~bit」「*out |= bit」の
直前、「cli()」で割り込み禁止状態にしています。
この手順があるから、割り込みで操作されるtone()のポートと
重なっても、異常パルスが出てこないわけです。
digitalWriteを使うと「時間がかかる」「遅くなる」のは、
その中でこんな処理がされているからです。
ポートへのH/L出力だけでもこんな「ポカよけ」機能が入っ
てるわけです。
また。PWM出力と重なっているポートは、ポート出力の前に
PWMをオフにしてからという処理が入っています。
ということは、PWMに使われるポートとPWMとは無関係な
ポートでは出力時間に差が出てきそうです。
ポート D8とポート D9(PWMで使われる)を確かめてみました。
// digitalWriteはPWMポートだと遅くなるのか?
/***** SETUP *****/
void setup() {
pinMode(8, OUTPUT); // 8:PB0
pinMode(9, OUTPUT); // 9:PB1 OC1A PWMポート
}
/***** LOOP *****/
void loop() {
bool x = LOW;
while(1){
digitalWrite(8, x);
digitalWrite(8, !x);
digitalWrite(8, x);
digitalWrite(9, x); // PWMポート
digitalWrite(9, !x);
digitalWrite(9, x);
x = !x;
}
};
ch1がD8で非PWMポート。 ch2がD9でPWMポートです。

PWMポートであるD9のほうが0.5usほど遅く処理されている
のが見えています。
ポートをH/Lしたいだけなのにこんなお節介。
ほんとに必要でしょうか?
こんなのに慣れてしまうと「裸のマイコン」が使えなく
なってしまいますぜ。
※参
・Arduinoのタイマー処理
※追記
PWM出力をオフする『turnOffPWM(timer)』を調べてみたら、
switch文でタイマー番号を区分して、それぞれの出力をオフする
処理を切り替えています。
ということは、ポート番号で微妙に処理時間が変わるかもしれない
ということで、「ポートD3」も入れてみました。
こんな結果です。

D8が非PWMポート、D9とD3がPWMポートで、
D3のほうがswitch文の後に位置しています。
digitalWrite にこんな秘密があったとは・・・
| 固定リンク
「Arduino」カテゴリの記事
- ATtiny1614:タイマレジスタの初期設定を見る(2026.01.06)
- ラジオペンチさんの「ダイソーのゆらゆらLEDキャンドルライト」#2(2025.09.15)
- ラジオペンチさんの「ダイソーのゆらゆらLEDキャンドルライト」(2025.09.11)
- ATtiny402サンプル:"Wire.h"を使わずI2Cで液晶表示 AQM1602だと(2025.09.09)
- ATtiny402サンプル:I2Cで液晶表示 SCL周波数を設定できるようにしたら(2025.09.09)
「重箱の隅」カテゴリの記事
- 1/1023監視団 活動中!(2025.03.10)
- DIPのLMC6482えらい高くなった(2025.03.07)
- 因縁のボリューム記号 トランジスタ技術2025年3月号(2025.02.17)
- ボリューム記号のボヤキ、トラ技2025年3月号の別冊付録に再掲載(2025.02.10)
- NECは3段タイプの発振回路をすすめてる(2025.01.31)


コメント