//********************************************************* // Barometer and Temperature for LP810-DEMO board // // (C)Copyright 2013 All rights reserved by Y.Onodera // http://einstlab.web.fc2.com // // Add. RTC8564 140315 N.Ishii //********************************************************* #include #include #include "LPC8xx.h" #include "mrt.h" #include #include "type.h" #include "lpc8xx_clkconfig.h" #include "lpc8xx_i2c.h" #include "I2C.h" #include "LCD.h" #include "ADT7410.h" #include "LPS331.h" #include "LED.h" #include "RTC8564.h" // Add. 140315 N.Ishii #if defined(__CODE_RED) // #include // #include // __CRP const unsigned int CRP_WORD = CRP_NO_CRP ; #endif void SwitchMatrix_Init(); //void IOCON_Init(); static void ShowTime(void); // Add. 140315 N.Ishii static void ShowDay(void); // Add. 140315 N.Ishii int main(void) { char msg[10]; int temp; int l; long press; // IRC 12MHz /* Configure the core clock/PLL via CMSIS */ SystemCoreClockUpdate(); /* Initialize the GPIO block */ // gpioInit(); /* Initialize the UART0 block for printf output */ // uart0Init(115200); /* Configure the switch matrix (setup pins for UART0 and GPIO) */ SwitchMatrix_Init(); // IOCON_Init(); InitLED(); InitI2C(); mrtInit(SystemCoreClock/1000); InitLCD(); // set 16bit resolution // PutI2C(ADT7410_CONFIG, 0xC0, ADT7410_ADDR); // Power ON Cycle=1Hz // PutI2C(LPS331_CTRL_REG1, 0x90, LPS331_ADDR); #define PCF8591_ADDR 0x92 #define M24LC64_ADDR 0xA0 #define RTC8564_ADDR 0xA2 // Add. 140315 N.Ishii #define RTC8564 // Add. 140315 N.Ishii //#define EEPROM //#define ADC //#define TEMP //#define BAR ///-------< Add. 140315 N.Ishii >----------------------------------------------------------- // initialize RTC8564 Reg WaitN(1000); // Wait internal x'tal stability PutI2C(RTC8564_CONTROL1REG, 0x20, RTC8564_ADDR); // Time Stop PutI2C(RTC8564_CONTROL2REG, 0x00, RTC8564_ADDR); // ALM INT.TIMMER INT Disable PutI2C(RTC8564_SECONDS_REG, 0x00, RTC8564_ADDR); // Set 0 Second PutI2C(RTC8564_MINUTES_REG, 0x20, RTC8564_ADDR); // Set 20 Minutes PutI2C(RTC8564_HOUR_REG, 0x19, RTC8564_ADDR); // Set 19 Hour PutI2C(RTC8564_DAY_REG, 0x15, RTC8564_ADDR); // Set 15 DAY PutI2C(RTC8564_WEEKDAYS_REG, 0x06, RTC8564_ADDR); // Set Sat WEEKDAYS PutI2C(RTC8564_MONTHS_REG, 0x03, RTC8564_ADDR); // Set 3 Months PutI2C(RTC8564_YEARS_REG, 0x14, RTC8564_ADDR); // Set 14 YEARS (not used) PutI2C(RTC8564_MINUTE_ALAM_REG, 0x80, RTC8564_ADDR); // Not Used ALM Interrupt PutI2C(RTC8564_HOUR_ALAM_REG, 0x80, RTC8564_ADDR); // Not Used ALM Interrupt PutI2C(RTC8564_DAY_ALAM_REG, 0x80, RTC8564_ADDR); // Not Used ALM Interrupt PutI2C(RTC8564_WEEKDAY_ALAM_REG, 0x80, RTC8564_ADDR); // Not Used ALM Interrupt PutI2C(RTC8564_CLKOUT_FRQ_REG, 0x80, RTC8564_ADDR); // Not Used CLKOUT PutI2C(RTC8564_TIMER_CONT1_REG, 0x00, RTC8564_ADDR); // Not Used Timer Interrupt PutI2C(RTC8564_TIMER_DWN_COUNT_SET_REG, 0x01, RTC8564_ADDR); // Timer_downcount Set Value (not used) // Start Timer Count PutI2C(RTC8564_CONTROL1REG, 0x00, RTC8564_ADDR); // Time Start ///---------------------------------------------------------------------------------------- while(1) { #ifdef RTC8564 // Add. 140315 N.Ishii // RTC8564 ShowDay(); ShowTime(); onLED(); WaitN(50); offLED(); WaitN(50); #endif #ifdef EEPROM // EEPROM 0x0002=0x5A PutEEPROM(0x00, 0x02, 0x5A, M24LC64_ADDR); WaitN(5); for(l=0;l<0x1FFF;l++){ // EEPROM for 24LC64 GetEEPROM(l>>8, l&0xFF, M24LC64_ADDR); temp=I2CMasterRXBuffer[0]; LocateLCD(0,0); PutsLCD("ADR="); itoa(l,msg,16); PutsLCD(msg); LocateLCD(0,1); PutsLCD("DAT="); itoa(temp,msg,16); PutsLCD(msg); PutsLCD(" "); onLED(); WaitN(500); offLED(); WaitN(500); } #endif #ifdef ADC // A/D for PCF8591 GetI2C(0x40, PCF8591_ADDR); // ch0 with D/A enable // GetI2C(0x01, PCF8591_ADDR); // ch1 // GetI2C(0x02, PCF8591_ADDR); // ch2 // GetI2C(0x03, PCF8591_ADDR); // ch3 temp=I2CMasterRXBuffer[0]; itoa(temp,msg,10); LocateLCD(0,0); PutsLCD("A/D="); PutsLCD(msg); PutsLCD(" "); onLED(); // D/A for PCF8591 PutI2C(0x40, temp, PCF8591_ADDR); WaitN(500); offLED(); WaitN(500); #endif #ifdef TEMP // Temperature // RDY? do{ GetI2C(ADT7410_STATUS, ADT7410_ADDR); temp=I2CMasterRXBuffer[0]; }while(temp & 0x80); // get temp_high GetI2C(ADT7410_TEMP_H, ADT7410_ADDR); temp=I2CMasterRXBuffer[0]*0x100; // get temp_low GetI2C(ADT7410_TEMP_L, ADT7410_ADDR); temp+=I2CMasterRXBuffer[0]; // temp/=128; // for C temp/=13; itoa(temp,msg,10); l=strlen(msg); msg[l]=msg[l-1]; msg[l-1]='.'; msg[l+1]=0; LocateLCD(0,0); PutsLCD(msg); PutsLCD("C "); onLED(); WaitN(500); #endif #ifdef BAR // Barometer // get press_high GetI2C(LPS331_PRESS_OUT_H, LPS331_ADDR); press=I2CMasterRXBuffer[0]*0x10000; // get tpress_low GetI2C(LPS331_PRESS_OUT_L, LPS331_ADDR); press+=I2CMasterRXBuffer[0]*0x100; // get press_xl GetI2C(LPS331_PRESS_POUT_XL_REH, LPS331_ADDR); press+=I2CMasterRXBuffer[0]; // press/=4096; // for hPa press/=41; itoa(press,msg,10); LocateLCD(0,1); PutsLCD(msg); PutsLCD("Pa "); offLED(); WaitN(500); #endif } } ///------------< Add. 140315 N.Ishi >----------------------------------------------- // Disp. Day of the week static void ShowDay(void) { uint8_t val; char str[] = "mm/dd", *ptr; ptr = &str[0]; // Pointer <-- Top Address of Array GetI2C(RTC8564_MONTHS_REG, RTC8564_ADDR); // Read months register val=I2CMasterRXBuffer[0] & 0x1F; *ptr++ = ((val & 0xf0) >> 4) | 0x30; // str[0] <-- Months Upper Ascii after increment *ptr++ = (val & 0x0f) | 0x30; // str[1] <-- Months Lower Ascii after increment ptr++; // Position of '/' GetI2C(RTC8564_DAY_REG, RTC8564_ADDR); // Read day register val=I2CMasterRXBuffer[0] & 0x3F; *ptr++ = ((val & 0xf0) >> 4) | 0x30; // str[3] <-- Day Upper Ascii after increment *ptr++ = (val & 0x0f) | 0x30; // str[4] <-- Day Lower Ascii after increment GetI2C(RTC8564_WEEKDAYS_REG, RTC8564_ADDR); // Read weekdays register val=I2CMasterRXBuffer[0] & 0x07; // Disp. Day LocateLCD(0,0); PutsLCD(str); // Disp. Weekdays LocateLCD(5,0); if (val == 0) PutsLCD("Sun"); if (val == 1) PutsLCD("Mon"); if (val == 2) PutsLCD("Tue"); if (val == 3) PutsLCD("Wed"); if (val == 4) PutsLCD("Thu"); if (val == 5) PutsLCD("Fri"); if (val == 6) PutsLCD("Sat"); } // Disp. Time static void ShowTime(void) { uint8_t val; char str[] = "hh:mm:ss", *ptr; ptr = &str[0]; // Pointer <-- Top Address of Array GetI2C(RTC8564_HOUR_REG, RTC8564_ADDR); // Read hour register val=I2CMasterRXBuffer[0] & 0x3F; *ptr++ = ((val & 0xf0) >> 4) | 0x30; // str[0] <-- Time Upper Ascii after increment *ptr++ = (val & 0x0f) | 0x30; // str[1] <-- Time Lower Ascii after increment ptr++; // Position of ':' GetI2C(RTC8564_MINUTES_REG, RTC8564_ADDR); // Read minutes register val=I2CMasterRXBuffer[0] & 0x7F; *ptr++ = ((val & 0xf0) >> 4) | 0x30; // str[3] <-- Minutes Upper Ascii after increment *ptr++ = (val & 0x0f) | 0x30; // str[4] <-- Minutes Lower Ascii after increment ptr++; // Position of ':' GetI2C(RTC8564_SECONDS_REG, RTC8564_ADDR); // Read seconds register val=I2CMasterRXBuffer[0] & 0x7F; *ptr++ = ((val & 0xf0) >> 4) | 0x30; // str[5] <-- Seconds Upper Ascii after increment *ptr++ = (val & 0x0f) | 0x30; // str[6] <-- Seconds Lower Ascii after increment LocateLCD(0,1); PutsLCD(str); // Disp. Time }