
写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる
それはさておき、
このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。
変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。
まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。
フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。
半田吸い取り線で、余分な半田を吸い取って、出来上がり。
慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。
このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。
今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。

このLCDは秋月電子で購入した3.3V電源のI2CキャラクタLCDです。
I2C LCDは普通のパラレルインターフェースのキャラクタLCDと異なりシリアルのI2Cインターフェースを使用しているため、電源、グランドの他に、制御ラインが2本しか必要としません。このためGPIOピンの少ないマイコンにとって便利に使えます。
PSoC3もあまりGPIOピンが多いとは言えないので、I2C LCDを使用すると他のピンが有効に使えます。
今回は、PSoC3に用意されているI2Cコンポーネントを用いて、簡単な接続テストを行ってみました。
使用するコンポーネントは、I2Cのみです。(なお、パラレルインターフェースの普通のLCDであれば、LCDコンポーネントが使えます。LCDコンポーネント使用例)
このI2Cコンポーネントには出力ピンも付いています。
出力ピンはI2Cインターフェースのクロック(SDL)とデータ(SDA)につなぎます。今回はSDLをP12[0]に、SDAをP12[1]につなぎました。
SDLとSDAは2.2KΩでプルアップしておきます。
【schematic】

LCDは固有の制御の仕方があるので、手順に従ってプログラミングします。
処理が遅いので適当にディレイ(CyDelay())を入れます。
サンプルコードが秋月電子の商品欄に掲載されているデータシートに載っているので、参考にしました。
今回用意した関数は、
I2C_LCD_Init() I2C LCDの初期化(カーソルオフ、ブリンクオフ、2行モード)
I2C_LCD_ClearAll() 全画面クリア
I2C_LCD_ClearLine1() 1行目のみクリア
I2C_LCD_ClearLine2() 2行目のみクリア
I2C_LCD_SetPosition(col, row) 表示位置指定
I2C_LCD_WriteChar(chr) 現在の表示位置に一文字書く
I2C_LCD_WriteString(col, row, string) 指定の行、カラムに文字列を書く
このI2C LCDの7ビット・スレーブアドレスは1010000b = 0x50です。
【Program】
//main.c
#include <device.h>
#define SLAVE_ADDRESS 0x50 //スレーブアドレス Right Justified
void I2C_LCD_WriteCommand(char8 command){
I2C_MasterSendStart(SLAVE_ADDRESS, 0);
CyDelay(1);
I2C_MasterWriteByte(0x00);
CyDelay(1);
I2C_MasterWriteByte(command);
CyDelay(1);
I2C_MasterSendStop();
CyDelay(1);
}
void I2C_LCD_WriteChar(char8 databyte){
I2C_MasterSendStart(SLAVE_ADDRESS, 0);
CyDelay(1);
I2C_MasterWriteByte(0x80);
CyDelay(1);
I2C_MasterWriteByte(databyte);
CyDelay(1);
I2C_MasterSendStop();
CyDelay(1);
}
void I2C_LCD_SetPosition(uint8 col, uint8 row){
uint8 pos;
row != 0? (pos = 0xC0 + col) : (pos = 0x80 + col);
I2C_LCD_WriteCommand(pos);
CyDelay(1);
}
void I2C_LCD_WriteString(uint8 col, uint8 row, uint8 *str){
I2C_LCD_SetPosition(col, row);
I2C_MasterSendStart(SLAVE_ADDRESS, 0);
while(*str){
I2C_MasterWriteByte(0x80);
CyDelay(1);
I2C_MasterWriteByte(*str++);
CyDelay(1);
}
I2C_MasterSendStop();
CyDelay(1);
}
void I2C_LCD_ClearAll(void){
I2C_LCD_WriteCommand(0x01); //Clear Display
}
void I2C_LCD_ClearLine1(void){
I2C_LCD_WriteString(0, 0, " " );
}
void I2C_LCD_ClearLine2(void){
I2C_LCD_WriteString(0, 1, " " );
}
void I2C_LCD_Init(void){
I2C_LCD_WriteCommand(0x01); //Clear Display
CyDelay(3);
I2C_LCD_WriteCommand(0x38); //Function Set 8bit, 2line
CyDelay(1);
I2C_LCD_WriteCommand(0x0c); //Display Control Disp On, Cursor off, Blink off
CyDelay(1);
I2C_LCD_WriteCommand(0x06); //Entry Mode Set
CyDelay(1);
}
void main(){
uint8 i;
I2C_Start();
I2C_LCD_Init();
for ( ;; ){
I2C_LCD_WriteString(0, 0, "12345ABCDEabcdef" );
for(i = 0; i < 16; i++){
I2C_LCD_SetPosition(i, 1);
I2C_LCD_WriteChar('*');
CyDelay(500);
}
CyDelay(2000);
I2C_LCD_ClearLine1();
I2C_LCD_WriteString(0, 0, "!#$%&'()-+=~|<>?" );
CyDelay(2000);
I2C_LCD_ClearAll();
}
}
(JF1VRR)