質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

ArduinoでコンストラクタでPROGMEMで定数を設定した場合ループで取り出すとき数値が変わる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 285

himhong

score 2

arduinoでプログラムを書いています。

コンストラクタ定数でPROGMEMで設定した場合、ループで取り出すときとそうでないときで値が変わってしまいます。
一つずつ値を入れて取り出すときは大丈夫です。
また同じ値をsetup内に入れて取り出す場合はループで取り出しても問題ありません。
これはなぜでしょうか?

また、ループから正常に取り出す方法も教えていただけると助かります。

何卒よろしくお願いいたします。

const static byte tableConst[8] PROGMEM =  {
    B00000001,
    B00000010,
    B00000011,
    B00000100,
    B00000101,
    B00000110,
    B00000111,
    B00001000
};
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.println("const01:");
  Serial.println(tableConst[0]);
  Serial.println(tableConst[1]);
  Serial.println(tableConst[2]);
  Serial.println(tableConst[3]);
  Serial.println(tableConst[4]);
  Serial.println(tableConst[5]);
  Serial.println(tableConst[6]);
  Serial.println(tableConst[7]);

  Serial.println("const02:");
  for (int i=0;i<8;i++) {
    Serial.println(tableConst[i]);
  }

  byte tableVar[8] PROGMEM =  {
    B00000001,
    B00000010,
    B00000011,
    B00000100,
    B00000101,
    B00000110,
    B00000111,
    B00001000
  };

  Serial.println("variable:");
  for (int i=0;i<8;i++) {
    Serial.println(tableVar[i]);
  }
}


出力結果

const01:
1
2
3
4
5
6
7
8
const02:
0
0
128
0
0
0
1
0
variable:
1
2
3
4
5
6
7
8
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

PROGMEM使ったことありませんが、通常の変数とは扱いが異なるようです。
すなわちbyteのかわりにprog_uchar型で宣言し、読込時にはpgm_read_byte_near()を利用する必要があるようです。
詳細とサンプルコードは以下に記載されています。
Arduino入門:Flash領域へのデータ格納

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/04 15:23

    pgm_read_byte_near()にて動作しました!
    ありがとうございます。

    キャンセル

+1

一次資料と、関連日本語サイト例

PROGMEM
https://www.arduino.cc/en/Reference/PROGMEM

Arduino 日本語リファレンス
PROGMEMとFマクロ 
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=1830

Arduinoリファレンス
PROGMEM 
https://garretlab.web.fc2.com/arduino_reference/language/values/utilities/progmem.html

書込み回数、特性等は、チップのリファレンスマニュアルを参照の事
探し方がが正しければ、秋月のAVRサイトが見つかります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/04 15:26

    ありがとうございます。
    先にいただいたcan110さんをベストアンサーにさせていただきましたが、とても有益な情報でした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。