digitalWriteの秘密をもうちょっと
・toneパルスの異常 もうちょっと掘り下げて
・Arduino-UNOでtone()の挙動を調べる
もうちょっとお付き合いを・・・
「digitalWrite」にはお節介な機能があるぞっと
記しましたが、そのお節介を外したらどれだけ
速くなるかをArduino UNOで試してみました。
お節介その1:ポート番号のチェック
ちゃんとした番号以外は除外
お節介その2:PWMに割り当てられたポートは
PWM出力を止めてからポートの操作
この順番でH/Lのパルスを2回づつ出力します。
ch1 2:PD2 SBI、CBI命令を使って最高速で
ch2 8:PB0 digitalWriteで非PWMポート
ch3 3:PD3 digitalWriteでPWMポート
ch4 9:PB1 お節介削除ルーチンで
使ったスケッチ↓です。
/***** 簡易デジタル出力 *****/
// ポート番号のチェックなしに
// PWMの停止処理なしに
void digWr(uint8_t pin, uint8_t val) {
uint8_t bit = digitalPinToBitMask(pin); // ビット位置
uint8_t port = digitalPinToPort(pin); // ポート番号
volatile uint8_t *out;
out = portOutputRegister(port); // 出力レジスタアドレス
uint8_t oldSREG = SREG; // SREG(割り込みの状態)をセーブ
cli(); // いったん割り込み禁止に
if (val == LOW) *out &= ~bit; // 出力ピンをLに
else *out |= bit; // Hに
SREG = oldSREG; // SREG復帰
}
/***** SETUP *****/
void setup() {
pinMode(8, OUTPUT); // 8:PB0
pinMode(9, OUTPUT); // 9:PB1 OC1A PWMポート
pinMode(3, OUTPUT); // 3:PD3 OC2B PWMポート
pinMode(2, OUTPUT); // 2:PD2
}
/***** LOOP *****/
void loop() {
while(1){
PORTD |= (1 << PD2); // PD2 H SBI
PORTD &= ~(1 << PD2); // L CBI
PORTD |= (1 << PD2);
PORTD &= ~(1 << PD2);
digitalWrite(8, HIGH); // PB0 非PWM
digitalWrite(8, LOW);
digitalWrite(8, HIGH);
digitalWrite(8, LOW);
digitalWrite(3, HIGH); // PD3 PWM OC2B
digitalWrite(3, LOW);
digitalWrite(3, HIGH);
digitalWrite(3, LOW);
digWr(9, HIGH); // PB1 簡易出力で
digWr(9, LOW);
digWr(9, HIGH);
digWr(9, LOW);
}
};
波形、2パルスのよりこっち↓のほうが見やすいかな。
パルス幅はオシロのリードアウト機能を使っていますんで、
多少の誤差は生じます。
ch1に出ているパルスが、「SBI」「CBI」命令による
最高速のビット操作です。 2クロックで実行。
しかし、I/Oアドレス0x00~0x1Fの範囲にしか使えません。
| 固定リンク
「Arduino」カテゴリの記事
- 「UART←→IrDA」変換IC、MCP2122のクロック供給(2022.06.20)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2(2022.06.18)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す)(2022.06.17)
- 4046・VCO回路の直線性改善方法その2(2022.06.13)
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
「重箱の隅」カテゴリの記事
- AVRマイコンのSUT、BODヒューズ(2022.06.25)
- DC-DCコンバータテスト回路の資料(2022.05.31)
- Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常(2022.04.19)
- Arduino IDEでRaspberry Pi Pico:32bitマイコンがバグを生む(2022.04.14)
- Arduino-UNO 割り込み処理のミスあれこれ:割り込み禁止にして書かないとダメよ (2022.03.21)
コメント