あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

Arduboy 実験31

書くことがないので適当に書いてみようと思います。
devkitのスピーカーはPWMに対応しておらず、配線としても
不味いつなぎ方をしているようです。

However, looking at the following board layout picture,
I can see that pins A2 and A3 (physical pins 38 and 39) are actually directly shorted together!

Everyone with a dev kit, unit make sure you don't set A2 and A3 as digital outputs at the same time!
You risk damaging the chip by shorting two outputs together.

Dev Kit Hardware - Guides - Community
調べてみると38、39ピンは以下のようになっています。

38 Analog In 2
39 Analog In 3

Arduino - PinMapping32u4
ただ自分を含めてサンプル(Tunes.ino)を鳴らした開発者は多いと思いますが、
壊れたという報告はないので極端に怖がる必要はないのかもしれません。
最新のライブラリでは片方のピンだけdefineして、
もう片方は使わないように処置していました。


ちなみにArduby 1.0はPWMピンで、問題ない場所を使用しています。

31 Digital Pin 5 (PWM)
32 Digital Pin 13 (PWM)

もう1点。開発中にバグでしょこれ、ということに遭遇したのは2点だけでした。
前に話しましたけど、SRAM領域を2000以上使った状態で焼いて、2回目以降はうまく焼けなくなる問題。
もう1つはグローバル変数の配列の値が、構造体に入らなかった問題。

// 注:PROGMEMしていません。
const s8 AstRadiusTable[3] = {
	8,
	4,
	2,
};

typedef struct {
	s8 cnt;
	ST_AST_DATA d[AST_MAX_CNT];

	s8 wave;
} ST_AST;

ST_AST Ast;

void AstSetUnit(u8 num, s8 x, s8 y, u8 type, u8 step)
{
	ST_AST_DATA* p = &Ast.d[num];

	// 中略
	p->r = AstRadiusTable[step];
}

p->rに正しい値が入りませんでした。
構造体の宣言順番を変えて、たとえばs8 waveを先頭に持ってくるとうまく動きます。
8bit cpuでアライメント問題なんて嘘だー、と大声を出したくなるのですけど、
マジだからしょうがないです。


検索しても同じケースがないのでこれは自分のコードがおかしいかも。
むしろそっちの方が大きいっぽいので眉唾程度に見て頂ければ幸いです。


ちなみに対処として、PROGMEMと__LPMで根本的に片づけました。