写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる

 

それはさておき、

 

このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。

 

変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。

 

まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。

 

フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。

 

半田吸い取り線で、余分な半田を吸い取って、出来上がり。

 

慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。

 

このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。

 

今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。

FM3 LCDハンドラー ソースコード

投稿日 2012/05/06

FM3_5.jpg

関連記事: FM3 LCDをつなぐ

 

これはインターフェース2012年6月号付録のFM3評価ボード用のLCDハンドラです。

 

//LCD TEST 2012/05/06 JF1VRR

 

/*** main.c ***/
#include "mcu.h"

 

void Init_Port(void);
void delay_ms(__IO uint32_t nTime);
void Init_LCD(void);
void lcd_xy(uint8_t x, uint8_t y);
void lcd_puts(uint8_t *str);
void lcd_write(uint8_t x, uint8_t y, uint8_t *str);
void lcd_clearall(void);
void lcd_clearline1(void);
void lcd_clearline2(void);

 

void Init_LED(void)
{

FM3_GPIO->PFRF_f.P3 = 0; //PF3 set to GPIO
FM3_GPIO->PZRF_f.P3 = 1; //PF3 set to open drain mode
FM3_GPIO->DDRF_f.P3 = 1; //FP3 set to output
FM3_GPIO->PDORF_f.P3 = 0; //FP3 set to init value low

}

 

int32_t main(void){
SysTick_Config(SystemCoreClock / 1000);
Init_LED();
Init_LCD();

while(1) {
lcd_xy(1, 1);
lcd_puts("Hello! FM3 ^o^" );
delay_ms(3000);
lcd_write(1,2,"1234567890ABCDEF" );
delay_ms(3000);

uint8_t i;
for (i = 1; i <= 16; i++){

lcd_clearline2();
lcd_xy(i, 2);
lcd_puts("*" );
delay_ms(1000);

}

lcd_clearall();
lcd_write(1, 2, "アイウエオカキクケコサシスセソタ" );
delay_ms(3000);
}

}

 

/*** Delay_Handler.c ***/
#include "mcu.h"

 

void delay_ms(__IO uint32_t nTime);

 

static __IO uint32_t TimingDelay;

 

void SysTick_Handler(void){
static uint16_t cnt = 0;

if (TimingDelay != 0x00) {

TimingDelay--;

}

cnt++;
if (cnt >= 500) {

FM3_GPIO->PDORF_f.P3 = ~FM3_GPIO->PDORF_f.P3; //Heartbeat
cnt = 0;

}
}

 

void delay_ms(__IO uint32_t nTime){

TimingDelay = nTime;

while(TimingDelay != 0);

}

 

/*** LCD HAndler.c ***/
#include "mcu.h"

 

#define LCD_CMD 0
#define LCD_DAT 1
#define LCD_INIT8B 0x3
#define LCD_INIT4B 0x2
#define LCD_CLAR 0x01
#define LCD_HOME 0x02
#define LCD_ENTSET 0x06

 

#define LCD_DISP_OFF 0x08
#define LCD_DISP_NCUR 0x0c
#define LCD_DISP_CUR 0x0e
#define LCD_DISP_BNK 0x0d
#define LCD_DISP_ALL 0x0f
#define LCD_FCSET4B 0x28

 

void delay_ms(__IO uint32_t nTime);

 

void LCD_DB_SetBits(uint8_t data_4bits){

if((data_4bits >> 0) & 0x01) FM3_GPIO->PDOR4_f.P2 = 1; else FM3_GPIO->PDOR4_f.P2 = 0;
if((data_4bits >> 1) & 0x01) FM3_GPIO->PDOR4_f.P3 = 1; else FM3_GPIO->PDOR4_f.P3 = 0;
if((data_4bits >> 2) & 0x01) FM3_GPIO->PDOR4_f.P4 = 1; else FM3_GPIO->PDOR4_f.P4 = 0;
if((data_4bits >> 3) & 0x01) FM3_GPIO->PDOR4_f.P5 = 1; else FM3_GPIO->PDOR4_f.P5 = 0;

}

 

void write_lcd_data(uint8_t data, uint8_t rs){
uint8_t upper_data;
uint8_t lower_data;

upper_data = data >> 4;
lower_data = data & 0x0f;

delay_ms(5);

if(rs == 1) {

FM3_GPIO->PDOR4_f.P0 = 1; //RS -> 1

} else {

FM3_GPIO->PDOR4_f.P0 = 0; //RS -> 0

}

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(upper_data);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

delay_ms(1);

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(lower_data);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0
}

 

void Init_LCD(void){

 

FM3_GPIO->PDOR4 = 0x0000; //P40 ~ P45に0を出力
FM3_GPIO->PZR4 = 0x003F; //P40 ~ P45をオープンドレインにする
FM3_GPIO->PFR4 = 0x0000; //P40 = P45をGPIOとして使用
FM3_GPIO->DDR4 = 0x003F; //P40 ~ P45を出力にする

FM3_GPIO->PDOR4_f.P0 = 0; //RS -> 0
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

delay_ms(15);

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(LCD_INIT8B);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

delay_ms(5);

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(LCD_INIT8B);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

delay_ms(1);

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(LCD_INIT8B);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

delay_ms(1);

FM3_GPIO->PDOR4_f.P1 = 1; //E -> 1
LCD_DB_SetBits(LCD_INIT4B);
FM3_GPIO->PDOR4_f.P1 = 0; //E -> 0

write_lcd_data(LCD_FCSET4B, LCD_CMD);

write_lcd_data(LCD_DISP_OFF, LCD_CMD);

write_lcd_data(LCD_CLAR, LCD_CMD);

write_lcd_data(LCD_ENTSET, LCD_CMD);

write_lcd_data(LCD_DISP_CUR, LCD_CMD);

}

 

void lcd_puts(uint8_t *str){
while(*str) {

write_lcd_data(*str, LCD_DAT);
str++;

}
}

 

void lcd_xy(uint8_t x, uint8_t y){

uint8_t adr;
adr = ((x - 1) + (y - 1) * 0x40) | 0x80;
write_lcd_data(adr, LCD_CMD);

}

 

void lcd_write(uint8_t x, uint8_t y, uint8_t *str){
uint8_t adr;
adr = ((x - 1) + (y - 1) * 0x40) | 0x80;
write_lcd_data(adr, LCD_CMD);

while(*str) {

write_lcd_data(*str, LCD_DAT);
str++;

}
}

 

void lcd_clearall(void){

write_lcd_data(LCD_CLAR, LCD_CMD);

}

 

void lcd_clearline1(void){

lcd_write(1,1, " " ); //16文字分の半角スペース

}

 

void lcd_clearline2(void){

lcd_write(1,2, " " ); //16文字分の半角スペース

}

 

(JF1VRR)