自前のsprintf関数と、データフラッシュ

もう少し、周波数合わせを、せねば....

プッシュSWで、増減する為の、桁を変化させます。今は、x100Hzなので、

ロータリーエンコーダーを回すと、100Hz台が、変化します。

1.自前のsprintf関数

    前節で、<stido.h>に含まれる、標準関数sprintfで、プログラムが、おかしくなってしまいました。

    これは、私の使い方が、悪いのだと、思いますが....

    私は、使い難いので、自前で行く事に、しました。

 

    unsigned char str[10]="";    //これは、グローバル変数として、登録

    void my_sprintf(unsigned long x)        
    {

        char z_flag=1; //このフラグがゼロ以降は、空白に変わらないで数字のゼロを表示

    //ここで、reverseされた 文字列が、出来上がる

        for(i=0;i<10;i++)
        {
            *(str + i) = (x % 10) + 0x30;
        x = x /10;
        }

    //ここで、上位のゼロを、空白に変える

        for(i=0;i<10;i++)
        {
            if( *(str + 9 - i) != 0x30) z_flag=0;
            if( (z_flag) && *(str + 9 - i) ==0x30 ) *(str + 9 -i) =0x20;
        } 

    }

    単に、10で、割っただけです....簡単すぎて、スマソ。

 

    青い文字のところで、数字を逆転して、配列します。

    例えば、freq=1200Hz ならば、str[]="0021000000" と、なります。

    次に、下のfor文の所で、上位のゼロを、空白に、変えます。

    この例では、 str[]="0021      " と、なります。

    できたstr[]を、set_comma()関数で、再び、フォーマットして、ピリオドを、打ちます。

    unsigned char j=0;     //global

    void set_comma(unsigned long x) //simulate=417uS
    {

        my_sprintf(x);    //さっき、作った関数です。
        j=0;
        for (i=0;i<10;i++)
        {
            *(result + 9 - j) = *(str + i);
            if( ( (i % 3) == 2 ) && ( i !=0 ) && ( *(str + i+1) != 0x20) )
            {
                j++;
                *(result + 9 - j) = '.';
            }

            j++;
        }
    }

    my_sprintf()関数で作った、str[]は、逆に並んでいますので、

    ここで、ピリオドを打ちながら、result[11](グローバル)に、逆に並べて行きます。

    文字列resukt[]の配列数を、11に、したのは、文字列の最後に、\0 を、入れたいからです。

    自前の、my_sprintf()関数、及び、set_comma()関数を使いますと、

    あら、うれしや..... 

    LCD制御と、DDS制御のプログラムとの2つを、同時に、タイマーXの2mS毎の、割り込みに、収めることが、出来ました  \(^_^)

 

    2.データフラッシュ領域とは ?

    R8C/15では、データフラッシュ領域(2400h〜2BFFh)が、存在します。

    これの存在は知っていたのですが、何に使う?、使い方? 全く、知りませんでした。

    実は、この領域は2つに別れていて、ブロックA(1kB)、ブロックB(1KB)です。

    これが、何と! 擬似EEPROMになるのです!

   ちゅうことは、設定した周波数とかを、記録及び呼び出し、できるのです!

   資料が、なかったのですが、

    この10月、発刊されました「R8C/Tinyマイコンリファレンスブック 新海先生 CQ出版」に、書いてあるのです!

    「第9章 データフラッシュ領域を擬似的EEPROMとして使用する方法」!!!

    是非、御一読ください。

    私は、まだ、試していませんが、2KBの領域と言えば、4バイトのlong型のデータでしたら、512個、保存呼び出しできる!!!

    ちゅうことに、なります。

    これは、凄いぞ....R8C/15 恐るべし....

    プログラムが、難しいと言う事は、ありませんので、是非、御一読され、お試しください。

    わたしゃあ、できても、この部分だけは、公開できませぬ...    この本に、ぞっこんなんですから。.

      p.s

       renesasのHPで、検索してみましたら、

      EW1 モードを用いたデータフラッシュの書き換えプログラムが、ありました。

    M16C/TinyシリーズのEW1モードを使用したフラッシュメモリの書き換え方法 も、発見。

    えらい、すまんのウ。

    でも、この本は、価値あります、きっぱり。

 

    H17.11.29