AD9851と、LCD及び、その制御
0.バグフィックス
LCDに、周波数を、カンマ入りで表示するプログラムなんですが、
バグが、ありました。
7桁の時は、周波数が、正しく表示されるのですが
これが、6桁に変化すると、この通り、おかしくなります。(1MHZから、999.6KHzに変わった時)
そんで、これを、修正(加筆訂正)しました。
青い字が、追加部分です。
void set_comma(unsigned long x) //simulate=664uS
{
unsigned char str[10]="";
*result=0x00; //clear result[]
sprintf(str,"%10lu",x);
for (i=0;i<10;i++)
{
strncat(result,str+i,1);
if( ( !(i % 3) ) && ( *(str+i) !=0x20 ) && (i !=9) ) strncat(result, "." ,1);
if( ( !(i % 3) ) && ( *(str+i) ==0x20 ) ) strncat(result," ",1);
}
}
要するに、数字がゼロ(空白)の時、1字分の空白を、いれないと、駄目だったわけです、sorry
以上、ご迷惑をおかけしました。
1.AD9851の性能は?
前節で、回路を、ショートさせてしまいましたので、正確な性能か、どうか...
液晶キャラクタ表示器は、OPTREXの白液晶(C−51505NFQJ−LW−AD)です。
かっこいい!
1MHz (以降、0Hz〜120MHzのFULL SPANで、観測)
10MHz
20MHz
30MHz
40MHz
50MHz
60MHz
2.LCD制御プログラムについて
結構、手間取りました、はまる事、はまる事。
最初は、LCDの初期化さえ、うまくできませんでした。
Dmcman_full.pdfを、参考にしました。
解らない所は、勿論、諸先輩のHPを、参考にさせて頂きました。(御礼申し上げます。)
3桁毎に、ピリオドを打つ関数は、こんな風です。
void set_comma(unsigned long x) //simulate=693uS
{
unsigned char str[10]="";
*result=0x00; //clear result[] これをしないと、表示が変になる。
sprintf(str,"%10lu",x);
for (i=0;i<10;i++)
{
strncat(result,str+i,1);
if( ( !(i % 3) ) && ( *(str+i) !=0x20 ) && (i !=9) ) strncat(result, &com ,1);
}
}
unsigned long xを、10桁固定右寄せに、文字列表示。( sprintf関数、<string..h>と、<stdio.h>を、includeして置いた。 )
10桁固定にすると、ピリオドを、打ちやすいのです。
strncat関数(n文字を、新しい文字列関数resultに、n文字ずつ、コピーします。
そうしますと、
if( ( !(i % 3) ) && ( *(str+i) !=0x20 ) && (i !=9) ) strncat(result, &com ,1);
(i%3)==0の時が、ピリオドを打つ場所に、なりますので、
!(i%3)==1の時、が、ピリオドを打つ場所です。
他にも、条件が2つ、あります。
( *(str+i) !=0x20 ) 空白の場所は、ピリオドを打たない。
(i !=9) 最終桁は、ピリオドを打たない。
そんで、条件が、3つに、なってしまいました。
スピードが、心配ですね。
これは、HEWのシミュレートモードで、確かめます。(delayも、この方法で確かめました。CLK=8MHz)
大体 0.7mSですね...遅いかな...ロータリーエンコーダは、まだ出来てないので、心配。
手動(プッシュSW)で、やるなら、充分ですね。
webによると、文字列配列を、reverseする方法も、あるようですが、まだ、試していません。
まだまだ、途中のプログラムです。
スィッチをどうするか? 自由度が多すぎて、これも又、悩みの種です、hi 。
3.AD9859の件
既に、3個、Digi-Keyから、入手していますが (分厚いカタログも、送ってくれはった、感謝。)
AD9851より、CLKが高くて、それでいて、安いねん。(\2,000位)、 コンパレータ? 要らんし )
serialが、同期型で、これは、試した事がなっかたし、
それに、CLKが、400MHzと、なると、チップ抵抗等を使わないと、具合が悪いんちゃうか?
とか、疑問点ばかりで、設計以前の状態です。
H.17.11.16