arduinoのスケッチの書き方 小ネタ

最近arduinoで色々とプログラムを書いているのですが、どうにもあのdegitalWrite(3,HIGH);が書くの面倒w

例えばD1〜D7を全部点滅させる様なプログラムの時とか(あまり無いでしょうがw)

で、色々ネットをみているとAtmel Studioで書く様式でスケッチを書いてもいいとの記事を発見!!

むしろその書き方の方が必要なフラッシュメモリーの節約にもなるとか!

これはAtmel Studioで今までプログラムを書いていた私には朗報。今までのプログラムをコピペできちゃうかもw

てなことで、上記のD1~D7を点滅させるプログラムで試してみました。

まずは馬鹿正直なスケッチ

フラッシュメモリ1112バイト使っています。

まっ、通常ならfor文で回すと思いますので、

こうすると979バイトまで減ります。

で、これを私が普段Atmel Studioで書いている形式にすると

なんと662バイトまで減っています。

さらにこの書き方だとたくさんのピンの変更が一度にできます。

さらに、もっと簡単に書くと

658バイトまでなりますw元から500バイト近く減っていますw

これはフラッシュメモリの容量がギリギリの時とかには結構なポイントになるかもですね。

自分で作れない関数のみarduinoの関数使って他はAtmel Studioと同じ形式で書いていけばフラッシュメモリの節約になり、AVRに書き込むときにメモリーオーバーにならないかも^^。

ちなみにピンの割り振りは

こんな感じです。

なるほど〜ちゃんとPORTの種類によってメスピンも分けてあったんですね〜

これなら覚えやすいです。

ちなみにAVR側から見るとこの様なピン割り当てです。

ただ、arduinoに慣れている人から見るとわかりにくいプログラムになっちゃうでしょうね・・・・・。

関連すると思われる記事:

6 comments

  1. こんばんは。
    これはもしかして私のための記事ですか?(笑)
    AtmelStudioは全く知りませんが、最後の記述方法とかPICと全く同じですね。
    なるほど、1ピン1ピン記述しなくても使えちゃうんですね~、またその日が来たら使わせていただきます!

  2. なーるほど。
    二番目までのfor構文はよく使うし読めるのですが、それ以降のものはネットでたまに見かけても意味が分からずスルーしていました。
    が、なんとなく利点が分かりました!
    正直今も正確には理解していませんがw

    要するにそれぞれのピンのON/OFFの状態をダイレクトに指定しているってことなんですよね?
    使ってみればピンと来るんでしょうが、眺めているだけだとイメージ沸かない・・・

    これって、コンパイルするときに最適化してくれればいいのにって思いますが、それはお門違いなのかな??

  3. なおさん こんばんは!
    なおさんも通常のPICの書き方で慣れておられるのでこの書き方が便利かもですね。
    私はAVRですので設定の書き方もそのままで使えるのですごく楽になりました^^。
    PICとAVRは基本的に設定部分の書き方が違うだけですからね^^。
    1ピン1ピン書き込むの面倒ですもんね^^;

  4. gyoさん こんばんは!
    流石gyoさん 鋭い!
    おっしゃる様にダイレクトにポートを操作しているだけなんです。

    設定部分のとこなんて実は簡単な意味なんですよ。
    DDRB=0b00000001;
    はPORTBのPB0(arduinoのポートで言えばD8です)を出力に設定します。という意味です。
    要はポートが順番に並んでいて、出力にしたいポートの部分を1にするだけなんです。
    例えばPB1(D9)、PB4(D12)を出力にする場合は
    DDRB=0b00010010;と書きます。。
    最初の0bは2進数で表していますよ。という意味で気にしなくていいですw

    その後のPORTB=0b00000001;
    は先程と同様の感じでPB0(D8)をhighにしますよ。という意味です。
    PB1、PB4をhighにするときは・・・・もうわかられたと思いますが、
    PORTB=0b00010010;
    となります。つまりhighにするポートを1にするだけなんですw

    あのdegitalWrite()はやはり関数であって、あれで動かすために裏で色々な変数や工程を使ったりしている様なんですよね。そのため最適化してもダイレクトにポートを操作するものと比べるとメモリの消費が大きくなる様です。まっ、言ってみればc言語で直接命令するのと違って、arduino語を一旦通訳を通してc言語にして命令する感じなんではないでしょうかね。

  5. こんばんは
    Arduinoのピン指定は、通常だと結構面倒なんですね。
    最もメモリを食わない方法は、なおさんのおっしゃるようにPICと同じなんですね。
    最近はPICのMCCを使用しているので、最初にMPLABXのMCCでピンアサインをGUI上でクリックしておくと、あとは勝手にXC8が設定を吐き出してくれますので、あまり意識していませんでした。ただしプログラム中で、In/Outを変更するときは、6jiroさんの様にTRISレジスタを直接触ります。

  6. Vividさん こんばんは!
    そうなんですよ。
    わかりやすい代わりにその分少し面倒です^^;
    MCCは未だに使ったことがないのですが、なるほどGUI上で設定ができるなら随分簡単かもしれませんね。今度チャレンジしてみます^^。
    最後の書き方は、私もはじめPICのプログラムを見たときにAVRと一緒なんだ〜!と思いましたが、同じC言語だから同じで当たり前なんですよね^^;ピンのアウトプットの設定はAVRではDDRですがPICではTRISではじめ少しその辺の作法を覚えるまで戸惑いました^^;
    VividさんのLEDマネージャーで随分勉強させていただきました^^。ありがとうございます!

Leave a Reply

メールアドレスが公開されることはありません。

wp-puzzle.com logo