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