2013/01/19

[arduino]digitalWrite()とdigitalRead()

本を読みながら、スケッチというやつを作ってみた。
今のところ、普通のCプログラムと同じだ。
avr-gcc.exe、というのがあるから、GCCでできることはだいたいできるのかな。

 

setup()とloop()を実装しておくと、勝手に動いてくれる。
割り込みハンドラの定義もできるようだが、まあそれは後の話だな。
AVRは8bitマイコンのようだから、そこは気をつけておかないかん。

 

ポートの方向設定がpinMode()、出力がdigitalWrite()、入力がdigitalRead()。
これらは、#includeしなくても使えた。
検索すると、Arduino.hに定義があり、実装はwriteing_digital.cにあった。
digitalWrite()を見てみよう。

  1. 引数pinから、該当するポート番号を探す(よくわからんが、lpmというアセンブラ命令を使ってる)
  2. PWMのタイマが動いているかどうかも探す
  3. pinがポートの何ビット目になるかも探す
  4. ポート番号が探せなかったら、終わり
  5. PWMタイマが動いていたら、終わり
  6. ポート番号からアドレスを取得
  7. SREGの現在値をバックアップ
  8. 割込禁止
  9. ビットを立てるならOR、落とすならAND~
  10. 7で保存した値をSREGに書き込む

書き込みだけで、けっこう多い。
まあ、他のマイコンでもArduino互換というものがあるから使っておいた方が無難だが、「今回はPWM使わん」というような場合は、もうちょっと端折りたい気がするな。

よくわからんのが、SREG。
これは状態レジスタらしい。Status REGisterか。
割込禁止にしてから、書き込んで、SREGを戻して割込禁止も解除される、ということになりそうだ。
状態レジスタって、なんとなくReadOnlyって気がするのだが、そうでもないということか。
(そういうのは自分で調べよう。)

 

割込禁止と許可を逆に覚えてて、CLIが許可でSTIが禁止かと思ってた(8086の知識)。
AVRでは、CLIは禁止で、SEIが許可らしい。
もちろん8086でも、CLIが禁止で、STIが許可、だ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。