2006-05-23
リアルタイムクロックを接続してみた。
テスト段階なので時間合わせ等はまだ出来ない。
写真がちょっとピンぼけ(汗
上の行は時分秒、コントロールレジスタ1、コントロールレジスタ2
下の行は年月日、曜日(日曜が0、月曜が1、・・・)
ユーザーモジュールはLCDとI2Cmだけ。
プログラムはI2Cmのサンプルコードが大変参考になった、というよりそのまんまパクった。
未整理なので無駄なコードがあるかも。
起動すると、2006年5月22日10時00分00秒にセットして、後はひたすら表示するだけの簡単なもの。
RTC-8564は設定によりCLKOUTに1Hzを出せるのでそれで割り込みをかけて表示するようにすればいいだろう(多分)
読み出したデータで不必要なビットは必ずマスクしておくこと、これは
アプリケーションマニュアルに書いてある。
//----------------------------------------------------------------------------
// C main line
// RTC-8564
// 2006/5/23
//----------------------------------------------------------------------------
#include
// part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
const BYTE txCBuf[] = { 0x00, // Slave internal sub-address 0
0x00, // control 1
0x00, // control 2
0x00, // Seconds
0x00, // Miunites
0x10, // Hours
0x22, // Days
0x01, // Weekdays
0x05, // Month/Century
0x06};// Years
void main()
{
BYTE rxBuf[15];
BYTE status; // I2C communication status
BYTE i; // Temp counter variable
I2Cm_1_Start(); // Initialize I2C Master interface
LCD_1_Start();
status = I2Cm_1_bWriteCBytes(0x51,txCBuf,10,I2Cm_1_CompleteXfer); // Set the time
while(1) {
status = I2Cm_1_bWriteCBytes(0x51,txCBuf,1,I2Cm_1_NoStop);
status = I2Cm_1_fReadBytes(0x51,rxBuf,10,I2Cm_1_RepStart );
if(status == 0) {
LCD_1_Position(0,0);
LCD_1_PrCString("Error");
}
else {
LCD_1_Position(0,0);
LCD_1_PrHexByte(rxBuf[4] & 0x3f); // Hours
LCD_1_PrCString(":");
LCD_1_PrHexByte(rxBuf[3] & 0x7f); // Muinites
LCD_1_PrCString(":");
LCD_1_PrHexByte(rxBuf[2]); // Seconds
LCD_1_PrCString(" ");
LCD_1_PrHexByte(rxBuf[0]);
LCD_1_PrCString(" ");
LCD_1_PrHexByte(rxBuf[1] & 0xbf);
LCD_1_Position(1,0);
LCD_1_PrHexByte(rxBuf[8]); // Years
LCD_1_PrCString("/");
LCD_1_PrHexByte(rxBuf[7] & 0x9f); // Century/Months
LCD_1_PrCString("/");
LCD_1_PrHexByte(rxBuf[5] & 0x3f); // Days
LCD_1_PrCString(" ");
LCD_1_PrHexByte(rxBuf[6] & 0x07); // Weekdays
}
}
}
Comment