LoginSignup
1
1

More than 5 years have passed since last update.

Aruduino > [調査中] 1MHzのクロックを出す方法 > delayMicroseconds() / Digital write takes about 4us / PORTB: なし / GPOS / GPOC

Last updated at Posted at 2016-02-06

チャージポンプ(負電圧)がきっかけで調べ初めたこと。

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()の中身を見た。

esp8266_wiring_digital.c

上記の中で
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()を使っておくほうがやはりいい。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1