• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ATTiny2313のプログラミングについて)

ATTiny2313のプログラミングについて

このQ&Aのポイント
  • AVRマイコン初心者のためのATTiny2313のプログラミング方法
  • ドレミファ……と音が出るピアノを作るためのATTiny2313プログラミングの方法
  • ATTiny2313で「シド(高音)」のプログラムを追加する際のハードウェアの制約について

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ただ単に、プログラムが大きくなりすぎてメモリに入りきらないということです。 機種設定が適切なら、もう少しメモリの大きなものを使うしかないですね。 あと、この部分を見ただけの状態からは、たとえば、こんなコードにすれば、 ちょっとはプログラムサイズが減るかもしれません。 (ただし、このコードには、ひとつ致命的な欠陥があります) int oto = 0; while(1) { switch(~PINB) case 0x01: oto = dl; break; case 0x02: oto = re; break; case 0x04: oto = mi; break; case 0x08: oto = fa; break; case 0x10: oto = so; break; case 0x20: oto = ra; break; case 0x40: oto = si; break; case 0x80: oto = dH; break; } if (oto != 0) { PORTD = 0b0100000; delay_us(oto); PORTD = 0b0000000; delay_us(oto); } } もしくは音階のデータを dl とか re とかに入れるのではなく、 int oto[] = {ドの数値, レの数値……}; と定義すれば、 while(1) { int i; int mask = 0x01; for(i = 0; i < 8; i++, mask <<= 1) { if ((~PINB) & maks) { PORTD = 0b0100000; delay_us(oto[i]); PORTD = 0b0000000; delay_us(oto[i]); break; } } } とか、 あと、このコードの brek を取っ払うと、もしかしたら、和音も ある程度「それっぽく」聞こえるかもしれません。

flugel0000
質問者

お礼

なるほど。単純にメモリが足らなかったんですね。 とある動画で同じ機能のものをATTiny2313で作られてたんで、考えもしませんで した。 どうすればプログラムを軽くするかとかまだあまりよく分かってないので、今は素直に容量の大きいマイコンを買い直します。 プログラムのアドバイスも含め、ありがとうございました!参考にさせていただきます。

関連するQ&A