自前の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