チャージポンプ(負電圧)がきっかけで調べ初めたこと。
1MHzのクロックをESP8266でどう出力するのか。
link1
「ファンクションジェネレーターが壊れて困っている。Arduinoで50%のDuty比で1MHzを出したい」という質問者に対して、Resinatorさんの回答として delayMicroseconds()使用が記載されている。
delayMicroseconds()のリファレンスは以下。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2595
次に時間ができる時に試す予定。(下の方で試した。)
同じ人の他の回答としては PWM を使う、とやはりある。でもこの人はPWMを使ったことがないとのこと。
あと以下が気になった。
Digital write takes about 4us so thats not an option for even moderate frequencies direct port addressing is what you need
これが本当ならGPIOの変更自体を変えないといけないということだろう。
PORTB = B100000; // Digital pin 13 high
のようにしているのは、この問題の回避なのかもしれない。以下を使うよりは上を使う方がいいのだろうか。
gpio.write(4, gpio.HIGH)
ESP8266で PORTBへの代入例はあった。
http://www.esp8266.com/viewtopic.php?p=29911
(追記 2016/02/08)
delayMicroseconds() > 効果なし
とりあえず usleep()
を delayMicroseconds()
に変更してみたが、速くはならなかった。
PORTB > 宣言なし
Arduino IDEでESP8266のコードに PORTB
を以下のように使おうとしたが、PORTBは見つかりません
となった。
PORTB |= B10000;
PORTBを使っているコードは AVR/io.h をincludeしているなどで、こちらで同じものを探したが見つかっていない。
GPOS, GPOC レジスタ?
別途、digitalWrite()が遅い(複数の処理をしているため)という情報があったので、digitalWrite()の中身を見た。
上記の中で
extern void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
にて複数のifやelseなどを使っているのが遅いのだろうか、と疑問に思った。
見ていると GPOS, GPOC というレジスタ?に値を設定しているようだ。
- GPOS : おそらくset
- GPOC : おそらくclear
GPOS = (1 << 4);
のように使うとIO4のピンがHighレベルとなり、GPOC = (1 << 4);
のようにするとLowレベルとなった。
これらをdigitalWrite()と組合せて試したが、速くはならなかった。
移植性を考えると、GPOS, GPOCを使うよりは digitalWrite()を使っておくほうがやはりいい。