メモ:ArduinoのPROGMEM使用 | Tamesuke-Goto Maker的Blog

Tamesuke-Goto Maker的Blog

地域ISP管理者だけれど、ここ3年ほどMakerなJobが増えたのでまとめてみたいと思います 旧ハンドル Ringoro

ArduinoのYMF825 MIDI音源モジュールで音色データをグローバル変数領域に記述すると、データがRAM上展開されてメモリ不足になりそうです。

固定の音色データはフラッシュ上に持っておきたいです。

フラッシュ上にデータを持つ為に PPRGMEM を使います。コンパイルするとグローバル変数領域が減少しました

 

RAM展開時

 

 

PROGMEM使用時

 

 

PROGMEM領域のデータにアクセスするには普通のポインタなどは使えず専用のマクロ(関数?)を使ってアクセスしなければなりません。

今回音色データは「配列の配列」で定義したのですが、この場合のマクロの使い方がイマイチ不明だったのですが、以下の様な記述でアクセスが出来ましたのでメモしておきます。

 

 

---定義---

 

const  unsigned char PROGMEM  program[4][30]={
{
/*
Piano-1
*/  
0x01,0x85,
0x00,0x72,0xF9,0xD6,0x00,0x20,0x40,
0x00,0xA3,0xFC,0x02,0x03,0x10,0x40,
0x00,0x92,0xF3,0xA2,0x00,0x20,0x41,
0x00,0xA3,0xFC,0x1A,0x01,0x10,0x40
},
{
/*
Piano-2
*/  
0x01,0x85,
0x30,0x75,0xF2,0x7F,0x00,0x40,0x40,
0x30,0x73,0xF0,0x12,0x03,0x10,0x40,
0x60,0x76,0xF3,0x5B,0x00,0x20,0x41,
0x50,0xA7,0xF0,0x12,0x01,0x10,0x40
},

 

--- アクセス ---


/*
 *   Prog change
 */
extern unsigned char tone_data[35];
void progchang(unsigned char p)
{
  int i;
  p = p & 0x3;
 
  for(i=0;i<30;i++){
    tone_data[i+1]=pgm_read_byte_near(&(program[p][0])+i);
  }
  set_tone();
 
}

 

 

------