« iTAX-irDAで「お父さんってしゃべるんだー!ストラップ」を作ってみた(その2) | トップページ | はちゅねミク一人小型化戦争 »

2009年2月 8日 (日曜日)

iTAX-irDAで「お父さんってしゃべるんだー!ストラップ」を作ってみた(最終回)

前回一旦終了とか書いておきながら、プログラムも一応紹介しておきます。とは言え、実機で動いていたものは継ぎ接ぎだらけなので整形したのと、iTAX-irDAの改造の際に参考にさせていただいたサイトのサンプルがベースとなっている部分は本家を参照と言う事で省略してあります。整形後のコードでの実機確認はしていないのでもしかしたらおかしい部分があるかも。その点はご了承を。

なお、HEWの設定は「H8S/2134F」の「アドバンスドモード」ならば大丈夫かと思います。

まずはメインソース「OtosanStrapByiTAXirDA.c」

/***********************************************************************/
/*                                                                     */
/*  FILE        :OtosanStrapByiTAXirDA.c                               */
/*  DATE        :Sun, Feb 08, 2009                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8S/2134F                                             */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.4.9).     */
/*                                                                     */
/* [補足説明]                                                          */
/* main関数内で呼び出されているIG_KEY/IG_WAITKEY/IG_LED関数は          */
/* 本ソース内に記載されていません。以下のURLを参考にしてください       */
/* http://mobilehackerz.jp/archive/irgear/index.html                   */
/*                                                                     */
/***********************************************************************/

#include <machine.h>
#include <stdlib.h>
#include "iodefine.h"
#include "waveDataOtosan.h"

#define OFF  0
#define ON   1
#define NEG  2

#define CMFA_BASE 229
#define CMFB_BASE 255
#define SEED_OFFSET 255

void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

void main(void)
{
    char* dataptr;
    char data;
    unsigned int rnd;
    int isplay = 0;
    int dataoffset = 0;
    int no = 0;
    int cmfacount = 0;
    int seed = 0;
    int isfirst = 1;
    long size;

    set_imask_ccr(0);
    IG_LED(OFF);

    // タイマー電源供給
    MSTPCR.BYTE.H &= 0xEF;

    // TMR0を擬似乱数のSEED値に使用
    // TMR0の設定
    TMR0.TCORA  = 0xff;                // タイムコンスタントA
    TMR0.TCR.BIT.CCLR = 0x01;    // CMFAでTCNTクリア
    TMR0.TCNT = 0;
    STCR.BIT.ICKS0 = 0x00;    // TIM0のΦ/1024のため
    TMR0.TCR.BIT.CKS = 0x03;    // Φ/1024

    // mainループ
    while(1) {
        IG_WAITKEY();
        IG_LED(ON);

        // 初回だけSEED値取得
        if(isfirst == 1){
            isfirst = 0;
            seed = TMR0.TCNT;
            TMR0.TCR.BIT.CKS = 0x00;    // TMR0クロック供給停止
            MSTPCR.BYTE.H |= 0x10;            // タイマモジュール電源Cut
            srand(seed);
        }

        // no決定、データセット
        rnd = rand();
        no = rnd % 5;
        dataptr = waveData[no];
        size = waveSize[no];
        dataoffset = 0;
        isplay = 1;
        data = *(dataptr + dataoffset);
        // CMFA_BASEより大きいデータは強制的にCMFA_BASEにしてます
        // 再生するWAVEデータはツールにも拠りますが、
        // 80%程度でノーマライズすると大体CMFA_BASE以内に収まります
        if(data > (CMFA_BASE + 1)){
            data = CMFA_BASE;   
        }

        // タイマー電源供給
        MSTPCR.BYTE.H &= 0xEF;

        // TMR1の設定   
        TMR1.TCORB = data;            // タイムコンスタントB
        TMR1.TCORA = CMFA_BASE;        // タイムコンスタントA
        TMR1.TCSR.BYTE = 0x06;        // コンペアマッチAで1、マッチBで0出力
        TMR1.TCR.BIT.CCLR = 0x01;    // CMFAでTCNTクリア
        STCR.BIT.ICKS1 = 0x01;        // TIM1のΦ/2のため
        TMR1.TCNT = 0;
        // タイマスタート
        TMR1.TCR.BIT.CKS = 0x01;    // Φ/2

        while(isplay == 1){
            cmfacount = 0;
            // CMFAを2回分カウント
            while(cmfacount < 2){
                while(TMR1.TCSR.BIT.CMFA == 0);
                TMR1.TCSR.BIT.CMFA = 0;
                cmfacount++;
            }
            // TMR1停止
            TMR1.TCR.BIT.CKS = 0x00;
            // 次のデータへ
            dataoffset++;
            // 最後まで再生したらループ脱出
            if(dataoffset >= size){
                isplay = 0;
            }
            else{
                data = *(dataptr + dataoffset);
                if(data > (CMFA_BASE + 1)){
                    data = CMFA_BASE;   
                }
                TMR1.TCORB  = data;    // タイムコンスタントB
                TMR1.TCNT   = 0;
                // TMR1再開       
                TMR1.TCR.BIT.CKS = 0x01;    // Φ/2
            }
        }
        MSTPCR.BYTE.H |= 0x10;        // タイマモジュール電源Cut
        IG_LED(OFF);
    }
}

#ifdef __cplusplus
void abort(void)
{

}
#endif

続いてWAVEデータの部分「waveDataOtosan.h」

// お前付いてくるな
const char waveData1[] = {
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
// 省略
128,128,128,128,128,128,128,128,
128};

// お前にはまだ早い
const char waveData2[] = {
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
// 省略
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128};

// ちょっと待った
const char waveData3[] = {
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
// 省略
128,128,128,128,128,128,128,128,
128,128,128};

// ややこしいなぁ
const char waveData4[] = {
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
// 省略
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128};

// 意志が弱い
const char waveData5[] = {
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
// 省略
128,128,128,128,128,128,128,128,
128,128,128,128,128,128,128,128,
128,128,128,128,128};

// まとめ
const char* waveData[] = {
    &waveData1[0],
    &waveData2[0],
    &waveData3[0],
    &waveData4[0],
    &waveData5[0]
};

const int waveSize[] = {
    sizeof(waveData1),
    sizeof(waveData2),
    sizeof(waveData3),
    sizeof(waveData4),
    sizeof(waveData5)
};

はい、WAVEデータはさすがにアレなので全部は載せてません。実際に試してみたい方は(多分いないと思うが・・・)自前で用意したWAVEデータを以前のエントリ「ΔΣ型D-Aコンバータを作ってみる(その3)」で作成したツールで加工&結果をコピペして、変数名変えればOKです。

という事でこのシリーズはこれで終了ですが、実はこのマイコン、8bitのD/Aコンバータを2chも持っているので本当はもっと高音質で鳴らせるはずです。今回iTAX-irDAの内部構成を極力維持するポリシーだったので8bitタイマ+圧電ブザーにて実現しましたが、また機会があればいじってみようかなと思います(今回の取り組みの中で、秋月のH8Sマイコン基板の存在も知ってしまったので・・・)。

|

« iTAX-irDAで「お父さんってしゃべるんだー!ストラップ」を作ってみた(その2) | トップページ | はちゅねミク一人小型化戦争 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/44000743

この記事へのトラックバック一覧です: iTAX-irDAで「お父さんってしゃべるんだー!ストラップ」を作ってみた(最終回):

« iTAX-irDAで「お父さんってしゃべるんだー!ストラップ」を作ってみた(その2) | トップページ | はちゅねミク一人小型化戦争 »