電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

進捗

進捗

週末に限らず時間のあるときに少しずつソフトウェアを書いている。

逆にこれが災いしている。つまり、少しずつ→書きたいところから→ソフトウェアを書いている、ということになってしまっていて、面白そうなところからツマミ食いしていて、初期化ルーチンとかちょっとデータシートの調べが必要そうなところとかがすっかりあとまわしである。

とりあえずまだ不足はあれど、無理矢理(※1)コンパイルを通してエラー類が無くなり、そしてきちんと動かない(※2)、というのが現状。

以下、個人的なメモ

※1

「構造体宣言において、構造体に、その構造体へのポインタをパラメータとする関数のポインタをメンバに」しようとしたら怒られました。void * とかにして誤魔化しても通りましたが、詳しい人に相談したら typedefの使い方がまずいんじゃないの?という話になって解決しました。

NG記述
typedef struct _Tr909Inst {
	uint8_t num;
	uint8_t Note;
	uint8_t LastCNT;
	uint8_t CurrentCNT;
	void    (*Trigger)(TR909Inst *, uint8_t);
	void    (*SetGatePort)(void);
	void    (*ClearGatePort)(void);
} TR909Inst;
OK記述
typedef struct _Tr909Inst *TR909Inst_P;
typedef struct _Tr909Inst {
	uint8_t num;
	uint8_t Note;
	uint8_t LastCNT;
	uint8_t CurrentCNT;
	void    (*Trigger)(TR909Inst_P, uint8_t);
	void    (*SetGatePort)(void);
	void    (*ClearGatePort)(void);
} TR909Inst;

※2

こちらは未解決。プラットフォームはATmega128。

TIMER0で約200μs、TIMER1で32kHz(31.25μs)のタイマオーバーフロー割り込みを発生させていて、TIMER1 OVF割り込みが発生して割り込みベクタにジャンプしたときに、まだTCNT0がオーバーフローしていないにもかかわらず TIMER0 OVFのビットが立ってしまう。そのためTIMER1 ISR終了にTIMER0 ISRへジャンプして、ぜんぜん200μsのカウントにならない。

なんでや。

とりあえずTIMER1の時間をより正確に作りたいのでオーバーフローからアウトプットコンペアに替えてまた実験してみること>自分