電音の工場ブログ

当ブログは…

自作エフェクターシンセサイザ製作のネタや開発覚え書きなど、筆者の電音活動を記録しています。お探しの記事が見つからない方は、検索カテゴリ一覧をご利用ください。

スパマーが来訪すると、ときどきコメントをはてなユーザのみに絞ったり開放したりすることがあります。

2008-06-05

進捗

| 進捗 - 電音の工場ブログ を含むブックマーク はてなブックマーク - 進捗 - 電音の工場ブログ 進捗 - 電音の工場ブログ のブックマークコメント

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

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

とりあえずまだ不足はあれど、無理矢理(※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の時間をより正確に作りたいのでオーバーフローからアウトプットコンペアに替えてまた実験してみること>自分

analoganalog2008/06/05 10:15をぉ! またまた勉強させてもらえそうなコードの予感! 楽しみにしてます。
しかし全然工作できない(ショボン。そんななか昨日ラッキーにも仕事で秋葉原へ! 約半年ぶりに秋月等お参りしました。無意味にMEGA644をご祝儀買い。40pinDIPってやっぱりデカイ

pcm1723pcm17232008/06/05 12:54「※1」と全く同じことを悩んでいました。
現状のFM音源プログラム (V1.01) では (void *) にして逃げていました。
以降の版では、これを参考に変更し、スッキリしたいと思います。

アルゴ算法堂アルゴ算法堂2008/06/05 14:06 構造体で自分自身のポインタを書くときには、上の例ならば、

struct _Tr909Inst *p;

 とか、書くと、通るはずです。
 これは、以前に出てきた名前しか使えないという制限から来るもので、未出関数のとき関数の前方参照定義が必要なのと同じ理由ですね、きっと。
 本質的に1パスで処理している都合なのでしょう。

ChuckChuck2008/06/06 08:01みなさん、こめんとありがとうございます。
analogさん、今回はちょっとコード量が多くなりそうです。部分的にでもライブラリ化できればとは思うのですがオーバーヘッドがあります。ATmega128は容量は余裕なのでそちら方面のオーバーヘッドは許容して楽に書いています。

pcm1723さん、おお、同じようにお悩みだったとは。オープンっていいなぁ。

アルゴ算法堂さん、ありがとうございます。そうなんです、上のOK事例がOKならありじゃん?とその記述にしてみたらOKでした。逆に、
  typedef struct _Tr909Inst *TR909Inst_P;
が、struct _Tr909Inst がまだ記述されていない位置にあるのが心に引っかかっています。

通りすがり通りすがり2008/06/06 10:50ポインタを"宣言のみ"する場合、指している型の詳細は分からなくてよい(構造体の実体としてはvoid*一個分確保すればOK)、ので大丈夫です。
もちろんポインタ経由で構造体メンバにアクセスするようなコードはその構造体の宣言が完了するまで使えません。
909楽しみにしています。

ChuckChuck2008/06/09 06:59通りすがりさん、どうもありがとうございます。
確かにメモリ的にはそうですね。K&R 第2版でもこれといった説明もなく(付録AのBNFは見ずに書いてます)そのような記述になっていました。