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

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

今日の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を加えるかどうかだ。

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

今日のDDS

2016年10月25日 07時32分00秒 | DDS
unsigned int ShiftOut = FreqDiv;
unsigned int TestOut = FreqDiv;
char i = 0;
for(i=0; i<32; i++) {
TestOut = ShiftOut & 1;
if(TestOut==1) {
_sdo = 1;
} else {
_sdo = 0;
}
_clk = 1;
ShiftOut = ShiftOut >> 1;
_clk = 0;
}
ShiftOut = FortyBitWd;
for(i=0; i<8; i++) {
TestOut = ShiftOut & 1;
if(TestOut==1) {
_sdo = 1;
} else {
_sdo = 0;
}
_clk = 1;
ShiftOut = ShiftOut >> 1;
_clk = 0;
}
_len = 1;
_len = 0;
}

mbedのライブラリから抜粋。
LPC1114でAD9851を制御する場合の核心部分。
(スペースを無視して表示するのは何とかならんのか?)

Delphiだと多少はわかるのだが、Cだとサブルーチンの使い方が良くわからん。考え方は同じだろうけど、Cの教科書を読み直すか。コンパイラが優秀なら同じルーチンをサブルーチン化してくれるのだろうけど、mbedがどんなコンパイラだかわからん。

冒頭に引用した処理はサブルーチン化しないと同じ処理を四回書かないといかん。