rftgyふじこlp:今は反芻している…JP1NOM

のんべんだらりと生きてしまいましたよ。

今日のDDS

2016年10月29日 13時22分00秒 | DDS
DDSの計算式で算出する周波数と実際に測定される周波数にずれがあるので、表示用データを測定値に合わせるという荒業。



結局IchigoJamではうまく行かなかった、周波数設定用データと表示用データを別にしてトラッキング。とはいっても『大体このぐらい』という目安にしかならんけど。

周波数ステップはおよそ10Hz。シフトボタンと併用するとおよそ1KHz。これもIchigoJamではできなかった方法。

下に転がってるスイッチ類とDINコネクターは、プログラムロード用。I2C液晶を搭載して完成するまでは必需品。これやんないとLPC1114の足がすぐにもげちゃうし、生産性が低くなる。あと付け(思いつき)かつ臨時なのでLPCに直付け。


mbedは確かに楽ちんだった。

ウェブブラウザで作業できるのでプラットフォームを選ばない。WinでもFreeBSDでも同じ。ただプログラムローダーの関係でWinXPで作業してるけど。
GPIOに少々癖があるなと感じた以外は問題はなし。久々に手がけたC言語も、Delphiと同じように考えればいいので、それほど苦ではなかった。begin-endが{-}になったぐらいの違い。でもまだCの作法はわきまえてないので、無駄が多い。

今日のDDS

2016年10月29日 06時17分00秒 | PC
LPC1114を使ったDDS制御。

思考実験のプログラミングでエラーがでなくなってコンパイルできたけど、秋葉に出向くのがめんどかったのでIchigoJamに書き込んで実験しました。GPIOが思ったように使えないトラブルがあって難儀しましたが、クリスタルイヤホン(通称・測定器)で信号をトレースしながらGPIOピンを変更しつつ煮詰めました。

結果、なんとかDDSの制御が成功。ただし指定のI2C液晶がなかったので表示はカット。IchigoJamのBASICに比べるとあまりに速いので、プッシュスイッチを使う場合、プッシュONで関数を呼び出して関数内でプッシュOFFを待つか、ロータリーエンコーダを使うのが吉。

あまりに速くて周波数ステップが計算通り10Hzになっているのか1KHzになってるのがわからない😁

まとまれ一応成功。知恵を貸してくださったネットとHummer師匠に感謝。

今日のC

2016年10月27日 09時28分00秒 | PC
sprintf()を教えてもらった!
なんと拙者のような迷える子羊のための関数!
数字を文字列に変換。

これでlcd.print()に周波数データを文字で簡単に送れる!

※ちなみに教えてもらう前に各桁の数値を取り出して0x30を足してcharにするという「こんな処理は無駄」の見本を書いてしまいましたw

今日のC

2016年10月26日 13時43分00秒 | PC
メインのDDSコントロールプログラムを関数として書き上げることには成功した。

しかしmbedで拾ってきたI2CのLCDコントロールプログラムが文字しか表示できないことが判明。
要するに周波数データ(7,000,000)を文字に変換しないといけない…orz
DDSの性能上、70MHzまで扱えるので

a[7..0]=(周波数データ) div 10^(7..0);
(周波数データ) = (周波数データ) - (周波数データ) * a[7..0];
で各桁の数字を求めて&h30かなんか足してASCIIコードにして文字配列b[7..0]に代入して...

とかやらないといけないのか...orz
あ~ゼロサプレスもつけるの?

もう一つ関数を書かねばならん
しかも文字型なのか整数型なのかも良くわからん…

最後の手段はオフセット付き周波数カウンターを外付けだけど、そこは忍者部隊月光。それはあくまで最後の手段だ。

現状では安全率を見込んでDDSのコントロールに400uSec以上かかるけど、文字列を「作る」となるとさらにペナルティーが…

道のりは遠い

今日のC

2016年10月25日 11時57分00秒 | PC
とりあえず「サブルーチン」という概念を棄てるところから始まるわけだな。
全ては関数。関数型を定義して、その中で引数も定義する。

だからAD9851をドライブするのも関数。戻り値は無し。
引数をf+IFで渡す、f±Δf+IFで渡す、fそのもので渡す、の三種類のケースがあるわけだけど、それぞれを計算して引数にして関数を呼び出せばよい。

f(AD9851)を先に引用したコードで作成してI2CのLCD表示関数を絡め、DigitaiIN入力端子を決めてボタン押したかどうかを見る関数を加える。

f(ボタン1){
f(freq_up)
f(I2C_LCD)
f(f+IF)
f(AD9851)
return()

f(ボタン2){
f(freq_down)
f(IC2_LCD)
f(f+IF)
f(AD9851)
return()
}
f(ボタン3){
f(freq_)
f(I2C_LCD)
f(AD9851)
returrn()


//* もしf(ボタン3)が押されたままなら離されるのを待つ *//
//* あるいはf(ボタン4)でボタンが押されるのを待つ *//

先頭に戻る

fデータはunsigned intを使い、初期値は7040000。IFシフトもubsigned intで455000。分解能は0.04Hzなので刻み値25で1Hz変わる。周波数の変数を25倍すればAD9851に送る数になるはず。IchigoJamの場合、signed int(15bits)でややこしかったけど。32bitsカウンタが使えればうんと楽になるはず。455000*25を加えるかどうかだ。

だいたい形が見えてきた。