DDSであそびましょ! その5
| 固定リンク
| コメント (0)
| トラックバック (0)
参考書にしている本がわざわざ外付けのEEPROMを使っているので、
ちょっと、やな予感がありましたけど、問題ありませんでした。
I2Cの使い方を紹介したかった?ようです。
おまけ その2 が動作確認したプログラムで、
Read_b_eep()がEEPROMの読み込みルーチン
Write_b_eep()がEEPROMの書き込みルーチン
Busy_eep ()は書き込み完了待ちルーチン
一応PICライターでEEPROMの内容も確認しました(写真参照)。
ここまでくると、今回の18F2550を使った、
周波数カウンター、DDSの発振器、「なんでもトランシーブ」
の完成型までの技術的問題はクリヤーですね! ?
おまけ その1
使用したC言語のバージョンは
Microchip Solutions v2011-06-02版です。
使用した参考書は
「PICで楽しむUSB機器、自作のすすめ」
おまけ その2
USB通信のテストプログラムに追加した試験プログラム抜粋
以下、書き込みテストをしたプログラムの抜粋
case '0': // OK応答
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART("0 OK \n");
break;
case '1': // EEPROMの読み取り&PCへ送信
for(i=0; i<8; i++)
{
output_buffer[i] = (char)Read_b_eep((unsigned int)i+0);
}
if(mUSBUSARTIsTxTrfReady())
mUSBUSARTTxRam(output_buffer, 8);
break;
case '2': // 周波数設定 発信周波数
for(i=0; i<8; i++)
{
Write_b_eep((unsigned int)i+0,(unsigned char)input_buffer[i+1]);
Busy_eep ();
}
for(i=0; i<8; i++)
{
S_Freq = S_Freq * 10 + (input_buffer[i+1] - 0x30);
}
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART("2 OK \n");
break;
| 固定リンク
| コメント (0)
| トラックバック (0)
せっかくUSBインタフェースを持っているPICなので、
パソコンからEEPROMの内容確認、もしくは編集が出来ると良いかな?
ということなのだけど、パソコン側のプログラムが面倒。
というか、プログラム環境がないので、どうしよう???
で、ターミナルソフトが使えないかと、ためしてみました。
WIN2000に付属するハイパーターミナルで確認すると、
1文字の送信はOKなのですが、複数バイトの送信をファイル送信で送るとうまく行きません。
で、ためしにフリーソフトのテラタームを使ってみたら、、、
うまくいきました。
USBの動作確認とか、EEPROMの書き込み等には十分に使えそう!
ということで、あとはEEPROMの書き込みなのだけど、、、、
PICメーカーさんのフリーのCコンパイラーにはツールが用意されている、
だけど、、、参考書の使用例はなぜか外付けのEEPROMを使ってます。
ちょっと、やな予感。
おまけ、上記テスト時の概要とPIC側プログラム抜粋
0 OK・・・ターミナルより0をキー入力した時のPICからのデータ
2 OK・・・ファイル転送したときのPICからのデータ
ファイルの具体的な内容・・・207000000
07000khz 00・・・ターミナルより1をキー入力した時のPICからのデータ
以下PIC側プログラム抜粋
USBCheckBusStatus();
if(UCFGbits.UTEYE!=1)
USBDriverService();
CDCTxService();
if((usb_device_state >= CONFIGURED_STATE)&&(UCONbits.SUSPND==0))
{
if(getsUSBUSART(input_buffer,64)) // データ受信あり?
{
switch(input_buffer[0]) // command チェック
{
case '0': // 0 OK
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART("0 OK \n");
break;
case '1': // 表示周波数を返す
if(mUSBUSARTIsTxTrfReady())
mUSBUSARTTxRam(Disp_Freq, 16);
break;
case '2': // 周波数設定 発信周波数セット
S_Freq = 0;
for(i=0; i<8; i++)
{
S_Freq = S_Freq * 10 + (input_buffer[i+1] - 0x30);
}
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART("2 OK \n");
break;
case '3': // 周波数設定 表示補正周波数セット
H_Freq = 0;
for(i=0; i<8; i++)
{
H_Freq = H_Freq *10 + (input_buffer[i+1]-0x30);
}
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART("3 OK \n");
break;
default: break;
}
}
}
| 固定リンク
| コメント (0)
| トラックバック (0)
あっさりとプログラムも動きました。
これにはカラクリがあって、ほとんど自分では作っていない。
前回作った周波数カウンターとほぼ同じ構成、
「PICで楽しむUSB機器・自作のすすめ」にあった、
「USB接続低周波発振器の作成」がベース、
AD9834の代わりにAD9850になっただけ、なので、
プログラムもDDSの出力ルーチンを変更しただけなのです。
でも、ソース付で、ここまで動けば、
あとはもう、自由自在ですよね! ?
変更したのがSetupDDS()とそのサブルーチンSIrialOut()
これだけ直せばとりあえず動きます。
//// DDSシリアル出力関数
void SetupDDS(unsigned long freqdata, char flag) {
float SetFreq;
unsigned long temp;
unsigned char w[5];
char i;
///設定周波数から設定パラメータ計算
///クロック 128MHzで計算
SetFreq = 34.359738 * (unsigned long)freqdata; // 設定値
temp = (unsigned long)SetFreq; // 整数に変換
w[0] = 0x00; // COMMAND
w[1] = (temp >> 24) & 0xff; // Freq data 31-24bit
w[2] = (temp >> 16) & 0xff; // Freq data 23-16bit
w[3] = (temp >> 8) & 0xff; // Freq data 15-8bit
w[4] = temp & 0xff; // Freq data 7-0bit
/// DDSへ下位から送信 ///
for(i=4; i>=0; i--) {
SerialOut(w[i]); // 1 char out
}
dds_fsync = 1; // FSYNC High
dds_fsync = 0; // FSYNC low
}
void SerialOut(unsigned char data) {
unsigned char i;
unsigned char mask;
mask = 0x01;
for(i=0; i<8; i++) { // 1charを下位bitから送信
if(data & mask)
dds_sdat = 1;
else
dds_sdat = 0;
dds_sclk = 1; // SCK High
dds_sclk = 0; // SCK low
mask = mask << 1; // next bit
}
}
| 固定リンク
| コメント (0)
| トラックバック (0)
最近のコメント