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

RTC8564NB 利用の時計 ntpサーバでスタート時刻が設定される
RTC8564NBを使用したデジタル時計を作ってみました。
RTC8564NBはセイコーエプソン32768Hz発振子内蔵の高精度RTCです。これを8PIN DIPのモジュールにして秋月電子通商からリアルタイムクロックモジュールが販売されています。
配線はブレッドボードで行い、たった4本の配線です。I2Cのプルアップは、モジュール内の2.2KΩを使用しています。
簡単にするために最低限のことしかやっていません。アラームや時間調整などの機能は実装していません。
スタート時刻はntpサーバから得たものを使いますので、面倒な手入力は不要です。
スタート年月日時刻を設定した後は、すべてRTCモジュールに任せ、mbedは1秒毎に現在時刻を読んでLCDに表示するだけです。
回路図

回路図
I2Cはp9,p10を使用。電源はmbedの3.3V
5000字制限のためコメント入れられません。^-^;
#include "mbed.h"
#include "TextLCD.h"
#include "EthernetNetIf.h"
#include "NTPClient.h"
#define RTC8564NB_ADR 0xA2
#define CONTROL1 0x00
#define CONTROL2 0x01
#define SECONDS 0x02
#define MINUTES 0x03
#define HOURS 0x04
#define DAYS 0x05
#define WEEKDAYS 0x06
#define MONTHS 0x07
#define YEARS 0x08
#define MINUTE_ALARM 0x09
#define HOUR_ALARM 0x0A
#define DAY_ALARM 0x0B
#define WEEKDAY_ALARM 0x0C
#define CLOCKOUT_FREQ 0x0D
#define TIMER_CINTROL 0x0E
#define TIMER 0x0F
#define _READ 0x01
TextLCD lcd(p24, p26, p27, p28, p29, p30);
EthernetNetIf eth;
NTPClient ntp;
I2C i2c(p9, p10);
int offset_JAPAN = 32400;
char year, month, day, week;
char hour, minute, sec;
char ntp_year[3], ntp_month[3], ntp_day[3], ntp_week[4];
char ntp_hour[3], ntp_minute[3], ntp_sec[3];
char week_val;
char week_chr[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
void rtc_write(char address, char value)
{
i2c.start();
i2c.write(RTC8564NB_ADR);
i2c.write(address);
i2c.write(value);
i2c.stop();
}
char rtc_read(char address)
{
char value;
i2c.start();
i2c.write(RTC8564NB_ADR);
i2c.write(address);
i2c.start();
i2c.write(RTC8564NB_ADR | _READ);
value = i2c.read(0);
i2c.stop();
return value;
}
int main() {
lcd.cls();
lcd.printf("RTC8564NB CLOCK" );
wait(2.0);
/* Set up Ethernet */
lcd.cls();
lcd.printf("Setting up Eth\n" );
EthernetErr ethErr = eth.setup();
if (ethErr) {
lcd.cls();
lcd.printf("Error with Eth\nNum: %d", ethErr);
return -1;
}
/* Set up NTP */
lcd.printf("Setting up NTP\n" );
Host server(IpAddr(), 123, "ntp1.jst.mfeed.ad.jp" );
ntp.setTime(server);
time_t seconds = time(NULL)+offset_JAPAN;
lcd.cls();
strftime(ntp_year, 16, "%y", localtime(&seconds));
strftime(ntp_month, 16, "%m", localtime(&seconds));
strftime(ntp_day, 16, "%d", localtime(&seconds));
strftime(ntp_week, 16, "%a", localtime(&seconds));
strftime(ntp_hour, 16, "%H", localtime(&seconds));
strftime(ntp_minute, 16, "%M", localtime(&seconds));
strftime(ntp_sec, 16, "%S", localtime(&seconds));
switch (ntp_week[0]){
case 'S':
switch (ntp_week[1]) {
case 'u': week_val = 0x00; break;
case 'a': week_val = 0x06; break;
}
break;
case 'M': week_val = 0x01; break;
case 'T':
switch (ntp_week[1]) {
case 'u': week_val = 0x02; break;
case 'h': week_val = 0x04; break;
}
break;
case 'W': week_val = 0x03; break;
case 'F': week_val = 0x05; break;
}
rtc_write(CONTROL1, 0x20); //stop
rtc_write(CONTROL2, 0x00);
rtc_write(YEARS, ((ntp_year[0]-0x30)<<4)+(ntp_year[1]-0x30));
rtc_write(MONTHS, ((ntp_month[0]-0x30)<<4)+(ntp_month[1]-0x30));
rtc_write(DAYS, ((ntp_day[0]-0x30)<<4)+(ntp_day[1]-0x30));
rtc_write(HOURS, ((ntp_hour[0]-0x30)<<4)+(ntp_hour[1]-0x30));
rtc_write(MINUTES, ((ntp_minute[0]-0x30)<<4)+(ntp_minute[1]-0x30));
rtc_write(SECONDS, ((ntp_sec[0]-0x30)<<4)+(ntp_sec[1]-0x30));
rtc_write(WEEKDAYS, week_val);
rtc_write(CLOCKOUT_FREQ, 0x00); // 0x83 = TE on & 1Hz
rtc_write(TIMER_CINTROL, 0x00);
rtc_write(CONTROL1, 0x00); //start
while(1) {
year = rtc_read(YEARS);
month = rtc_read(MONTHS);
day = rtc_read(DAYS);
week = rtc_read(WEEKDAYS);
hour = rtc_read(HOURS);
minute = rtc_read(MINUTES);
sec = rtc_read(SECONDS);
lcd.locate(0,0);
lcd.printf("20%c%c/%c%c/%c%c %s",
((year >> 4) & 0x03) + 0x30, (year & 0x0F) + 0x30,
((month >> 4) & 0x01) + 0x30, (month & 0x0F) + 0x30,
((day >> 4) & 0x03)+ 0x30, (day & 0x0F) + 0x30,
week_chr[week & 0x07]);
lcd.locate(0,1);
lcd.printf("%c%c:%c%c:%c%c",
((hour >> 4) & 0x03) + 0x30, (hour & 0x0F) + 0x30,
(minute >> 4) + 0x30, (minute & 0x0F) + 0x30,
(sec >> 4) + 0x30, (sec & 0x0F) + 0x30 );
wait(1.0);
}
}
http://mbed.org/users/jf1vrr/programs/RTC8564NB_Clock/lq7xi2
(JF1VRR)