Barometer program : Data Logger function includes Barometer & temperature (BMP180), Humidity & temp. (RHT03), Sunshine (Cds), RTC(M41T62) data. : Logging data saves into EEPROM (AT24C1024) using ring buffer function.

Dependencies:   AT24C1024 RHT03 TextLCD BMP180 M41T62

Fork of mbed_blinky by Mbed

Please see https://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-barometer-with-data-logging/#

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Sun Jun 29 06:58:00 2014 +0000
Parent:
14:18a98cad6109
Child:
16:f164f8912201
Commit message:
Barometer program / Step by step approach -> final step,; Barometer, Humidity, Sunshine, RTC data into EEPROM (logging)

Changed in this revision

AT24C1024.lib Show annotated file Show diff for this revision Revisions of this file
BMP180.lib Show annotated file Show diff for this revision Revisions of this file
dt_log.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main_aqm0802.h Show diff for this revision Revisions of this file
main_at24c1024.h Show diff for this revision Revisions of this file
main_bmp180.h Show diff for this revision Revisions of this file
main_m41t62.h Show diff for this revision Revisions of this file
main_normal.h Show diff for this revision Revisions of this file
mon.cpp Show annotated file Show diff for this revision Revisions of this file
mon_hw.cpp Show annotated file Show diff for this revision Revisions of this file
mon_hw_config.h Show annotated file Show diff for this revision Revisions of this file
--- a/AT24C1024.lib	Sun Jun 22 06:10:57 2014 +0000
+++ b/AT24C1024.lib	Sun Jun 29 06:58:00 2014 +0000
@@ -1,1 +1,1 @@
-AT24C1024#b9f5cf0309af
+AT24C1024#05012e75c050
--- a/BMP180.lib	Sun Jun 22 06:10:57 2014 +0000
+++ b/BMP180.lib	Sun Jun 29 06:58:00 2014 +0000
@@ -1,1 +1,1 @@
-BMP180#b81e7659be7a
+BMP180#20e0c6b19c24
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dt_log.h	Sun Jun 29 06:58:00 2014 +0000
@@ -0,0 +1,67 @@
+/*
+ * mbed Application program for the mbed LPC1114FN28
+ * Data Logging 
+ *
+ * Copyright (c) 2013,'14 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: June      16th, 2013
+ *      Revised: June      29th, 2014
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+//  Definition  -----------------------------------------------------------------------------------
+// Buffer size
+#define EEP_SIZE    128 * 1024  // 1Mbits = 128 KBytes
+#define PKT_SIZE    16          // Packet size
+#define BLK_NO      8192        // 128KB/16 = 8192
+#define ALL_SIZE    (PKT_SIZE) * (BLK_NO)
+#if ALL_SIZ > EEP_SIZE
+#error "Data size in EEPROM is too big!"
+#endif
+#define PTR_SIZE    16
+
+// Buffer control
+#define BUF_HEAD    0x0001
+#define BUF_RD_ALL  0
+#define BLK_SIZE    16
+
+// Buffer Status
+#define BUF_FULL    0xff
+
+// Packet pointer
+#define READ_POINTER()  \
+            ((uint16_t)(( buf_pointer[0] << 8) + buf_pointer[1]))
+#define WRITE_POINTER(x)    \
+            buf_pointer[0] = (uint8_t)( x >> 8); \
+            buf_pointer[1] = (uint8_t)x;
+#define RD_STATUS() \
+            (buf_pointer[2])
+#define WR_STATUS(x)    \
+            buf_pointer[2] = (uint8_t)x;
+
+// Pointer structure
+typedef struct EEPROM_BUF_INF{
+    uint16_t wr_pointer;
+    uint16_t max;
+    uint16_t ptr;
+    uint8_t  size;
+    uint8_t  status;    
+} xEeprom_ptr;
+
+// RAM definition
+extern uint8_t data_pack[PKT_SIZE];
+
+//  Function prototypes ---------------------------------------------------------------------------
+void dtlog_data_pack(void);
+void dtlog_one_write(void);
+void dtlog_rd_buf_inf(xEeprom_ptr *);
+void dtlog_clear_all_buff(xEeprom_ptr *);
+void dtlog_block_read(xEeprom_ptr *);
+void dtlog_num_of_block(xEeprom_ptr *);
+uint16_t dtlog_buf_occupation(void);
--- a/main.cpp	Sun Jun 22 06:10:57 2014 +0000
+++ b/main.cpp	Sun Jun 29 06:58:00 2014 +0000
@@ -1,12 +1,12 @@
 /*
  * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check I2C line control
+ * Barometer program for only for LPC1114FN28  
  *
  * Copyright (c) 2014 Kenji Arai / JH1PJL
  *  http://www.page.sannet.ne.jp/kenjia/index.html
  *  http://mbed.org/users/kenjiArai/
- *      Created: June      22nd, 2014
- *      Revised: June      22nd, 2014
+ *      Created: May       21st, 2014
+ *      Revised: June      28th, 2014
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
@@ -14,30 +14,315 @@
  * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-// You need to select (set 1) only one from blow
-#define TST_NORMAL      1
-#define TST_LCD8x2      0
-#define TST_EEPROM      0
-#define TST_BMP180      0
-#define TST_M41T62      0
-// You need to select (set 1) only one from above
+/*
+ * Function
+ *  measure atmospheric pressure and temprerature using Bosch BMP180 pressure sensor
+ *  show measured data on AQM0802A LCD and logging such data in EEPROM
+ */
+
+//  Include ---------------------------------------------------------------------------------------
+#include "mbed.h"
+#include "BMP180.h"             // Own lib. / Pressure sensor             
+#include "RHT03.h"              // Std. lib./ Humidity sensor
+#include "TextLCD.h"            // Std. lib./ LCD control
+#include "m41t62_rtc.h"         // Own lib. / RTC control
+#include "dt_log.h"
+
+//  Definition ------------------------------------------------------------------------------------
+#define USE_MON         1
+#define USE_BARO        0
+
+#define BOUND   5               // chattering
+
+// Define cyclic period
+#define SHOW_LED        1       // Time for LED on x mS
+#define CNV_WAIT_T      25      // Waiting time for temp. conversion
+#define CNV_WAIT_P      50      // Waiting time for pressure conversion
+#define LOOP_WAIT       (1000 - (SHOW_LED + CNV_WAIT_T +CNV_WAIT_P))
+
+// ADC related definition
+#define VREF_VOLT       2.482   // TA76431F Vref real measued data
+#define R_FIX           9930    // 10K ohm <- real measued data
+#define VOL_OFFSET      3       // Offset data ,= real measured data
+#define CDS_TBL_SIZE    13
+
+// Waiting time
+#define STATE_CHANGE_TIME       3
+
+typedef enum {CDS = 0, VREF, VOL} ADC_Select;
+
+//  Object ----------------------------------------------------------------------------------------
+Timeout     to;                // wake-up from sleep()
+I2C         i2c(dp5,dp27);      // SDA, SCL
+DigitalOut  myled0(dp28);       // LED for Debug
+DigitalOut  myled1(dp14);       // Indicate state transition
+DigitalOut  analog_pwr(dp6);    // VCC for analog interface (vol, cds and vref)
+DigitalOut  vref_pwr(dp4);      // VCC for Vref
+DigitalIn   sw_chng(dp1,PullUp);// SW for select
+DigitalIn   sw_mode(dp2,PullUp);// SW for Mode change
+AnalogIn    cds(dp11);          // Input / CDS data
+AnalogIn    vref(dp9);          // Input / Bandgap 2.5V
+AnalogIn    vol(dp10);          // Input / contrast volume
+RHT03       humtemp(dp26);      // RHT03 interface
+BMP180      bmp180(i2c);        // Bosch sensor
+M41T62      m41t62(i2c);        // STmicro RTC(M41T62)
+TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2);  // LCD(Akizuki AQM0802A)
+
+//  Function prototypes ---------------------------------------------------------------------------
+extern int mon( void);          // only use for debug purpose
+
+//  RAM -------------------------------------------------------------------------------------------
+int flag;
+
+//  ADC
+float av_cds, av_vref, av_vol, cal_vcc;
+float r_cds, lux;
+uint32_t nor_vol;
+
+//  Humidity Sensor
+float humidity_temp, humidity;
+
+//  EEPROM
+uint8_t eep_buf[256 + 2];
 
-#if TST_NORMAL 
-#include "main_normal.h"
-#endif
+// Barometer
+float baro;
+float baro_temp;
+
+// EEPROM
+extern xEeprom_ptr log_inf;
+
+//  ROM / Constant data ---------------------------------------------------------------------------
+// Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD.
+//      Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm
+const float lux_cds[CDS_TBL_SIZE][2] =
+    {{50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202},{3200,79.6},{6400,31.4},
+    {12800,12.4},{25600,4.88},{51200,1.92},{102400,0.758},{409600,0.118}};
+
+// LCD screen data
+enum Screen{
+    SCRN_Clear=0, SCRN_Opening, SCRN_Goto_mon, SCRN_Backto_normal
+};
+//                        Clear       Opening      Goto_mon     Backto_normal 
+char scrn_1st[4][10] = { "        ", "LPC1114F",  "GOTO MON",  "Back to"};
+char scrn_2nd[4][10] = { "        ", " JH1PJL ",  " 9600BPS",  " Normal"};
+
+// Disply on LCD
+enum Disp_num{
+    DSP_INIT=0, DSP_BARO, DSP_HUMD, DSP_LUX, DSP_TIME, DSP_LOG, DSP_RTURN
+};
+
+// rule 1) DSP_INIT is top position, 2)DSP_RTURN is end position, 3) Total number 20
+const uint8_t lcd_disp_tbl[20]
+//         1,        2,        3,       4,         5,        6,        7,        8,       9,      10,
+ = {DSP_INIT, DSP_BARO, DSP_BARO, DSP_BARO, DSP_TIME, DSP_TIME, DSP_HUMD, DSP_HUMD, DSP_LUX, DSP_LUX,
+//        11,       12,       13,      14,        15,       16,      17,      18,      19,        20 
+    DSP_BARO, DSP_BARO, DSP_TIME, DSP_TIME, DSP_HUMD, DSP_HUMD, DSP_LUX, DSP_LUX, DSP_LOG, DSP_RTURN};
+ 
+//-------------------------------------------------------------------------------------------------
+//  Control Program
+//-------------------------------------------------------------------------------------------------
+// Normalize ADC data
+void adc_normalize (ADC_Select n){
+int i;
+float x1,y1,dx;
+
+    switch (n){
+    case CDS:
+        // v_adc = Rfix / (Rcds + Rfix) ->  Rcds = ( Rfix / v_adc ) - Rfix 
+        r_cds = (R_FIX / av_cds) - R_FIX;
+        // CDS resistance to Lux conversion using convertion table (luc_cds[][])
+        for (i =0; i < CDS_TBL_SIZE; i++){  // search table
+            if ( r_cds <= lux_cds[i][0]){ break; }
+        }
+        // Check table position
+        if (i == 0){    lux = lux_cds[0][1];    break;
+        } else if ( i == CDS_TBL_SIZE ){
+            if ( r_cds <= lux_cds[i][0] ){
+                lux = lux_cds[i-1][1];
+                break;
+            }
+        }
+        //  Linear interpolation
+        y1 = lux_cds[i-1][1] - lux_cds[i][1];
+        x1 = lux_cds[i][0] - lux_cds[i-1][0];
+        dx = r_cds - lux_cds[i-1][0];
+        lux = lux_cds[i-1][1] - ((dx/x1) * y1);
+        break;
+    case VREF:  //  vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref
+        cal_vcc = VREF_VOLT / vref;
+        break;
+    case VOL:   // Vol center = 1.00 (actual 100)
+        nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET;
+        break;
+    }
+}
 
-#if TST_LCD8x2 
-#include "main_aqm0802.h"
-#endif
+//  Read adc data and averaging
+void adc_all_read (void){
+    if (av_cds == 0){   av_cds = cds.read();
+    } else {            av_cds = av_cds *0.5 + cds.read() * 0.5;
+    }
+    if (av_vref == 0){  av_vref = vref.read();
+    } else {            av_vref = av_vref *0.9 + vref.read() * 0.1;
+    }
+    if (av_vol == 0){   av_vol = vol.read();
+    } else {            av_vol = av_vol *0.2 + vol.read() * 0.8;
+    } 
+}
 
-#if TST_EEPROM 
-#include "main_at24c1024.h"
-#endif
+// Read Humidity sensor data
+void hum_RHT03_read (void){
+    while (true){   // wait data
+        if ( humtemp.readData() == RHT_ERROR_NONE ){ break; }
+    }
+    if (humidity_temp == 0){humidity_temp = humtemp.getTemperatureC();
+    } else {                humidity_temp = humidity_temp * 0.9 + humtemp.getTemperatureC() * 0.1;
+    }
+    if ( humidity == 0 ){   humidity = humtemp.getHumidity();
+    } else {                humidity = humidity * 0.9 + humtemp.getHumidity() * 0.1;
+    }
+}
+
+void set_lcd_screen(int n){
+    i2clcd.locate(0, 0);
+    i2clcd.printf("%s", scrn_1st[n]);
+    i2clcd.locate(0, 1);
+    i2clcd.printf("%s", scrn_2nd[n]);
+}
+
+//-------------------------------------------------------------------------------------------------
+// Application program
+//-------------------------------------------------------------------------------------------------
+// Nothing is done but just wake-up from sleep condition
+void wakeup() {
+    flag = 1;
+    myled1 = !myled1;
+}
+
+// Measure pressure and show it on LCD
+void conv_and_disp(void) {
+tm t;
+uint32_t    step = 0;
+uint8_t     num;
 
-#if TST_BMP180 
-#include "main_bmp180.h"
-#endif
+    while (true) {          // infinit loop for measure and display
+        // Call wakeup()function after specific time
+        to.attach(&wakeup, STATE_CHANGE_TIME);    // this is for wake-up
+//---- State Control ----
+        num = lcd_disp_tbl[step++];
+        switch (num){
+    //  ---------- Initialize data ----------------------------------------------------------------
+        case DSP_INIT:
+            av_cds = 0;
+            av_vref = 0;
+            av_vol = 0;
+            humidity_temp = 0;
+            humidity = 0;
+            // RTC
+            m41t62.set_sq_wave(RTC_SQW_NONE); 
+            break;
+    //  ---------- Cds Sensor, Vref, Volume -------------------------------------------------------
+        case DSP_LUX:
+            // Power on / Analog sensor
+            analog_pwr = 1;
+            vref_pwr = 1;
+            wait(0.2);
+            adc_all_read();
+            // Power off / Analog sensor
+            analog_pwr = 0; 
+            // Normalize
+            adc_normalize(CDS);
+            adc_normalize(VREF);
+            adc_normalize(VOL);
+            set_lcd_screen(SCRN_Clear);
+            i2clcd.locate(0, 0);    // 1st line top
+            //             12345678
+            i2clcd.printf("L:%.1f", lux);
+            i2clcd.locate(0, 1);    // 2nd line top
+            i2clcd.printf("V:%.3f", cal_vcc);
+            break;
+    //  ---------- Barometer Sensor / BMP180 ------------------------------------------------------
+        case DSP_BARO:
+            bmp180.normalize();
+            baro = bmp180.read_pressure();
+            baro_temp = bmp180.read_temperature();
+            set_lcd_screen(SCRN_Clear);
+            i2clcd.locate(0, 0);    // 1st line top
+            i2clcd.printf("P:%.1f", baro);
+            i2clcd.locate(0, 1);    // 2nd line top
+            i2clcd.printf("T:%\+-6.1f", baro_temp);
+            break;
+    //  ---------- Humidity Sensor / RHT03 --------------------------------------------------------
+        case DSP_HUMD:
+            hum_RHT03_read();       // Read Humidity data then avaraging
+            set_lcd_screen(SCRN_Clear);
+            i2clcd.locate(0, 0);    // 1st line top
+            i2clcd.printf("H:%.1f", humidity);
+            i2clcd.locate(0, 1);    // 2nd line top
+            i2clcd.printf("T:%\+-6.1f", humidity_temp);
+            break;
+    //  ---------- RTC ----------------------------------------------------------------------------
+        case DSP_TIME:
+            m41t62.read_rtc_std(&t);;
+            set_lcd_screen(SCRN_Clear);
+            i2clcd.locate(0, 0);    // 1st line top
+            i2clcd.printf("%02d/%02d/%02d", t.tm_year % 100, t.tm_mon + 1, t.tm_mday);
+            i2clcd.locate(0, 1);    // 2nd line top
+            i2clcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
+            break;
+    //  ---------- EEPROM Logging -----------------------------------------------------------------
+        case DSP_LOG:
+            dtlog_data_pack();  // Get EEPROM resource
+            dtlog_one_write();  // Write data to EEPROM      
+            set_lcd_screen(SCRN_Clear);
+            i2clcd.locate(0, 0);    // 1st line top
+            i2clcd.printf("Logging");
+            i2clcd.locate(0, 1);    // 2nd line top
+            i2clcd.printf("%d.1", dtlog_buf_occupation() / 10);
+            break;
+    //  ---------- return (loop) ------------------------------------------------------------------
+        case DSP_RTURN:
+        default:
+            //  <State> State change 
+            step = 1;   // if something wrong, go to reset condition
+        }
+    //  ---------- back to top --------------------------------------------------------------------
+        myled0 = !myled0;
+        while (flag == 0){ wait(0.01);}
+        wait(0.1);
+        myled1 = !myled1;
+        flag = 0;
+    }
+}
 
-#if TST_M41T62 
-#include "main_m41t62.h"
-#endif
+// Application program starts here
+int main() {
+    flag = 0;
+    i2clcd.setContrast(25);
+    set_lcd_screen(SCRN_Opening);
+    if (sw_chng == 0){  // SW ON
+    //--  Enter Monitor Mode  --
+        myled1 = 1;     wait(0.5);
+        myled1 = 0;     wait(0.5);
+        myled1 = 1;     wait(0.5);
+        if (sw_chng == 0){  // Still SW ON
+            myled1 = 0;     wait(0.5);
+            myled1 = 1;     wait(0.5);
+            if (sw_mode == 0){ // SW ON
+                set_lcd_screen(SCRN_Clear);
+                set_lcd_screen(SCRN_Goto_mon);
+                myled1 = 0;
+                mon();          // mon.cpp
+            }
+            set_lcd_screen(SCRN_Clear);
+            set_lcd_screen(SCRN_Backto_normal);
+        }
+    }
+    //--  Enter Normal Mode  --
+    myled0 = 1;
+    myled1 = 0;
+    while (true) {  // Start main program
+        conv_and_disp();
+    }
+}
--- a/main_aqm0802.h	Sun Jun 22 06:10:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check RTC module
- *
- * Copyright (c) 2014 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created: June      22nd, 2014
- *      Revised: June      22nd, 2014
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#include "mbed.h"
-#include "TextLCD.h"            // Std. lib./ LCD control
-
-I2C         i2c(dp5,dp27);      // SDA, SCL
-TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2);  // LCD(Akizuki AQM0802A)
-   
-//-------------------------------------------------------------------------------------------------
-//  Control Program
-//-------------------------------------------------------------------------------------------------
-// Clear LCD
-void cls(void){
-    i2clcd.locate(0, 0);
-    i2clcd.printf("        ");
-    i2clcd.locate(0, 1);
-    i2clcd.printf("        ");
-}
-
-//-------------------------------------
-// Application program starts here
-//-------------------------------------
-int main() {
-uint16_t no = 0;
-
-    i2clcd.setContrast(25);
-    i2clcd.locate(0, 0);
-    i2clcd.printf("LPC1114F");
-    i2clcd.locate(0, 1);
-    i2clcd.printf(" JH1PJL ");
-    // Show initial screen
-    wait(5.0);    
-    while(1) {
-        cls();       
-        i2clcd.locate(0, 0);    // 1st line top
-        //             12345678
-        i2clcd.printf(" test");
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("%8d", ++no);
-        wait(1.0);       
-    }
-}
--- a/main_at24c1024.h	Sun Jun 22 06:10:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-/*
- * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check RTC module
- *
- * Copyright (c) 2014 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created: June      22nd, 2014
- *      Revised: June      22nd, 2014
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include "mbed.h"
-#include "AT24C1024.h"          // Own lib. / EEPROM control
-
-Serial      pc(dp16,dp15);      // UART (vertual COM)
-#if 1
-AT24C1024   at24c1024(dp5,dp27);// Atmel 1Mbit EE-PROM 
-#else
-I2C         i2c(dp5,dp27);      // SDA, SCL
-AT24C1024   at24c1024(i2c);     // Atmel 1Mbit EE-PROM 
-#endif
-
-//  EEPROM
-uint8_t eep_buf[256 + 2];
-
-// EEPROM test charcters
-const uint8_t eep_char[256] =
-//0        1         2         3         4         5         6         7
-//12345678901234567890123456789012345678901234567890123456789012345678901
- "The AT24C1024 provides 1048576 bits of serial electrically erasable and"
-//7       8         9        10        11        12        13        14        15
-//2345678901234567890123456789012345678901234567890123456789012345678901234567890123
- " programmable read only memory (EEPROM) organized as 131,072 words of 8 bits each."
-//15   16        17        18        19        20        21        22        23        24
-//45678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
- " The devices cascadable feature allows up to four devices to share a common two-wire bus."
-//24    25   256
-//34567890123456
- "  JH1PJL Arai"; // eep_char[255] = 0;
-  
-//-------------------------------------------------------------------------------------------------
-//  Control Program
-//-------------------------------------------------------------------------------------------------
-int main() {
-int no =0;
-uint8_t dt[4];
-AT24C_STATUS status;
-
-    pc.baud(9600);
-    pc.printf("\r\nmbed LPC1114FN28 EEPROM test by JH1PJL created on "__DATE__"(UTC)\r\n");
-    dt[0] = 0;     dt[1] = 0;     dt[2] = 0;     dt[3] = 0; //initialize data 
-    while(1) {
-    //  ---------- Check EEPROM ----------------------------------------------------
-        if (no == 4) {  // check page write mode (part1)
-            ++no;
-            strcpy((char *)eep_buf,(char *)eep_char);   // copy the data         
-            status = at24c1024.write_page(0x100, eep_buf, sizeof(eep_buf)); // 0x100= page address
-            pc.printf("(Status: %d) ", status);
-            if (status == AT24C_OK){    // wrote without trouble
-                wait(1.0);
-                for (int i=0; i < 256; i++){    // clear buffer for read data checking
-                    eep_buf[i] = 0;
-                }
-                status = at24c1024.read_page(0x100, eep_buf, sizeof(eep_buf));
-                pc.printf("(Status: %d) ", status);
-                if (status == AT24C_OK){    // read w/o trouble
-                    pc.printf("\r\n%s\r\n", eep_buf);
-                    if (strncmp((char *)eep_buf, (char *)eep_char, 256) == 0){ // equal R/W data
-                        pc.printf("Page access OK\r\n");
-                    } else {    // Read != Wrote
-                        pc.printf("Page access Comp NG\r\n");
-                    }
-                } else {    // read w/ trouble
-                    pc.printf("Page access read NG\r\n");
-                }
-            } else {        // write w/ trouble
-                pc.printf("Write NG\r\n");
-            }
-            wait(2.0);       
-        } else if (no == 5) {  // check page write mode (part2)
-            no = 0;
-            for (int i=0; i < 256; i++){    // set writing data 255,254,,,,,3,2,1,0
-                eep_buf[i] = 255 - (uint8_t)i;
-            }        
-            status = at24c1024.write_page(0x1ff00, eep_buf, sizeof(eep_buf));
-            pc.printf("(Status: %d) ", status);
-            if (status == AT24C_OK){
-                wait(1.0);
-                for (int i=0; i < 256; i++){    // clear buffer
-                    eep_buf[i] = 0;
-                }
-                status = at24c1024.read_page(0x1ff00, eep_buf, sizeof(eep_buf));
-                pc.printf("(Status: %d) ", status);
-                if (status == AT24C_OK){
-                    pc.printf("\r\n0:%d, 64:%d, 128:%d, 254:%d, 255:%d\r\n",
-                            eep_buf[0], eep_buf[64], eep_buf[128], eep_buf[254], eep_buf[255]);
-                    if ((eep_buf[0] == 255) && (eep_buf[64] == 255 - 64)
-                            && (eep_buf[128] == 255-128) && (eep_buf[255] == 0)){
-                        pc.printf("Page access OK\r\n");
-                    } else {
-                        pc.printf("Page access Comp NG\r\n");
-                    }
-                } else {
-                    pc.printf("Page access read NG\r\n");
-                }
-            } else {
-                pc.printf("Write NG\r\n");
-            }
-            wait(2.0);
-        } else {    // Write and read (single byte)
-            if (no == 0){   // Initial setting
-                // Check EEPROM (step0)
-                at24c1024.write(0,no);
-                wait(0.1);
-                at24c1024.write(1,0);
-                wait(0.1);
-                at24c1024.write(2,0x55);
-                wait(0.1);
-                at24c1024.write(3,0xaa);
-                wait(0.1);
-                dt[0] = 0xff;
-                dt[1] = 1;
-                dt[2] = 2;
-                dt[3] = 3;
-            }
-            // read 4 bytes
-            dt[0] = at24c1024.read(0);
-            dt[1] = at24c1024.read(1);
-            dt[2] = at24c1024.read(2);
-            dt[3] = at24c1024.read(3);     
-            if (dt[0] != no){
-                pc.printf("NG\r\n");
-            } else {           
-                if ((dt[1] == 0) && (dt[2] == 0x55) && (dt[3] == 0xaa)){
-                    pc.printf("OK\r\n");        
-                } else {
-                    pc.printf("NG\r\n");
-                }
-            }
-            pc.printf("EEPROM 0x%x,0x%x,0x%x,0x%x\r\n", dt[0],dt[1],dt[2],dt[3]);
-            at24c1024.write(0,++no);    // write sequence number into EEPROM
-            wait(2.0);
-        }
-    }
-}
--- a/main_bmp180.h	Sun Jun 22 06:10:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check RTC module
- *
- * Copyright (c) 2014 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created: June      22nd, 2014
- *      Revised: June      22nd, 2014
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include "mbed.h"
-#include "BMP180.h"             // Own lib. / Pressure sensor             
-
-Serial      pc(dp16,dp15);      // UART (vertual COM)
-#if 1
-BMP180      bmp180(dp5,dp27);   // Bosch sensor
-#else
-I2C         i2c(dp5,dp27);      // SDA, SCL
-BMP180      bmp180(i2c);        // Bosch sensor
-#endif
-   
-//-------------------------------------------------------------------------------------------------
-//  Control Program
-//-------------------------------------------------------------------------------------------------
-int main() {
-    pc.baud(9600);
-    pc.printf("\r\nmbed LPC1114FN28 BMP180 test by JH1PJL created on "__DATE__"(UTC)\r\n"); 
-    while(1) {
-    //  ---------- Barometer Sensor / BMP180 --------------------------------------------------
-        bmp180.normalize();
-        pc.printf("Pres:%4.1fhPa, Temp:%\+-0.1fdegC\r\n",
-                bmp180.read_pressure(), bmp180.read_temperature());
-        wait(1.0);
-    }
-}
--- a/main_m41t62.h	Sun Jun 22 06:10:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check RTC module
- *
- * Copyright (c) 2014 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created: June      22nd, 2014
- *      Revised: June      22nd, 2014
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include "mbed.h"
-#include "m41t62_rtc.h"         // Own lib. / RTC control
-
-Serial      pc(dp16,dp15);      // UART (vertual COM)
-#if 1
-M41T62      m41t62(dp5,dp27);   // STmicro RTC(M41T62) 
-#else
-I2C         i2c(dp5,dp27);      // SDA, SCL
-M41T62      m41t62(i2c);        // STmicro RTC(M41T62) 
-#endif
-   
-//-------------------------------------------------------------------------------------------------
-//  Control Program
-//-------------------------------------------------------------------------------------------------
-int main() {
-    pc.baud(9600);
-    pc.printf("\r\nmbed LPC1114FN28 test program by JH1PJL created on "__DATE__"(UTC)\r\n");
-    // RTC
-    m41t62.set_sq_wave(RTC_SQW_NONE);  
-    while(1) {
-    //  ---------- Check RTC ------------------------------------------------------------------
-tm t;
-time_t seconds;
-char buf[40];
-
-        m41t62.read_rtc_std(&t);
-        seconds = mktime(&t);
-        // Show Time with several example
-#if 0
-        // ex.1
-        pc.printf("Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
-                    t.tm_year + 1900, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
-#endif
-#if 0
-        // ex.2
-        strftime(buf, 40, "%x %X", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-#endif
-#if 1
-        // ex.3
-        strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-#endif
-#if 0
-        // ex.4
-        strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-#endif
-        wait(1.0); 
-    }
-}
--- a/main_normal.h	Sun Jun 22 06:10:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,299 +0,0 @@
-/*
- * mbed Application program for the mbed LPC1114FN28
- * Test program -> same as LPC1114_test_step_7
- *
- * Copyright (c) 2014 Kenji Arai / JH1PJL
- *  http://www.page.sannet.ne.jp/kenjia/index.html
- *  http://mbed.org/users/kenjiArai/
- *      Created: June      13th, 2014
- *      Revised: June      22nd, 2014
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include "mbed.h"
-#include "BMP180.h"             // Own lib. / Pressure sensor             
-#include "RHT03.h"              // Std. lib./ Humidity sensor
-#include "TextLCD.h"            // Std. lib./ LCD control
-#include "AT24C1024.h"          // Own lib. / EEPROM control
-#include "m41t62_rtc.h"         // Own lib. / RTC control
-
-#define USE_C_STD_LIB   1
-
-#define VREF_VOLT       2.482   // TA76431F Vref real measued data
-#define R_FIX           9930    // 10K ohm <- real measued data
-#define VOL_OFFSET      3       // Offset data ,= real measured data
-#define CDS_TBL_SIZE    13
-
-I2C         i2c(dp5,dp27);      // SDA, SCL
-DigitalOut  myled0(dp28);       // LED for Debug
-DigitalOut  myled1(dp14);       // Indicate state transition
-DigitalOut  analog_pwr(dp6);    // VCC for analog interface (vol, cds and vref)
-DigitalOut  vref_pwr(dp4);      // VCC for Vref
-DigitalIn   sw_chng(dp1,PullUp);// SW for select
-DigitalIn   sw_mode(dp2,PullUp);// SW for Mode change
-AnalogIn    cds(dp11);          // Input / CDS data
-AnalogIn    vref(dp9);          // Input / Bandgap 2.5V
-AnalogIn    vol(dp10);          // Input / contrast volume
-RHT03       humtemp(dp26);      // RHT03 interface
-Serial      pc(dp16,dp15);      // UART (vertual COM)
-BMP180      bmp180(i2c);        // Bosch sensor
-TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2);  // LCD(Akizuki AQM0802A)
-AT24C1024   at24c1024(i2c);     // Atmel 1Mbit EE-PROM 
-M41T62      m41t62(i2c);        // STmicro RTC(M41T62) 
-
-typedef enum {CDS = 0, VREF, VOL} ADC_Select;
-
-//  ADC
-float av_cds, av_vref, av_vol, cal_vcc;
-float r_cds, lux;
-uint32_t nor_vol;
-
-//  Humidity Sensor
-float humidity_temp, humidity;
-
-//  EEPROM
-uint8_t eep_buf[256 + 2];
-
-// Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD.
-//      Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm
-const float lux_cds[CDS_TBL_SIZE][2] =
-    {{50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202},{3200,79.6},{6400,31.4},
-    {12800,12.4},{25600,4.88},{51200,1.92},{102400,0.758},{409600,0.118}};
-
-#if USE_C_STD_LIB == 0
-const char week[7][4] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
-#endif
-      
-//-------------------------------------------------------------------------------------------------
-//  Control Program
-//-------------------------------------------------------------------------------------------------
-// Normalize ADC data
-void adc_normalize (ADC_Select n){
-int i;
-float x1,y1,dx;
-
-    switch (n){
-    case CDS:
-        // v_adc = Rfix / (Rcds + Rfix) ->  Rcds = ( Rfix / v_adc ) - Rfix 
-        r_cds = (R_FIX / av_cds) - R_FIX;
-        // CDS resistance to Lux conversion using convertion table (luc_cds[][])
-        for (i =0; i < CDS_TBL_SIZE; i++){  // search table
-            if ( r_cds <= lux_cds[i][0]){ break; }
-        }
-        // Check table position
-        if (i == 0){
-            lux = lux_cds[0][1];
-            break;
-        } else if ( i == CDS_TBL_SIZE ){
-            if ( r_cds <= lux_cds[i][0] ){
-                lux = lux_cds[i-1][1];
-                break;
-            }
-        }
-        //  Linear interpolation
-        y1 = lux_cds[i-1][1] - lux_cds[i][1];
-        x1 = lux_cds[i][0] - lux_cds[i-1][0];
-        dx = r_cds - lux_cds[i-1][0];
-        lux = lux_cds[i-1][1] - ((dx/x1) * y1);
-        break;
-    case VREF:
-        //  vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref
-        cal_vcc = VREF_VOLT / vref;
-        break;
-    case VOL:
-        // Vol center = 1.00 (actual 100)
-        nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET;
-        break;
-    }
-}
-
-//  Read adc data and averaging
-void adc_all_read (void){
-    if (av_cds == 0){   av_cds = cds.read();
-    } else {            av_cds = av_cds *0.5 + cds.read() * 0.5;
-    }
-    if (av_vref == 0){  av_vref = vref.read();
-    } else {            av_vref = av_vref *0.9 + vref.read() * 0.1;
-    }
-    if (av_vol == 0){   av_vol = vol.read();
-    } else {            av_vol = av_vol *0.2 + vol.read() * 0.8;
-    } 
-}
-
-// Read Humidity sensor data
-void hum_RHT03_read (void){
-    while (true){   // wait data
-        if ( humtemp.readData() == RHT_ERROR_NONE ){ break; }
-    }
-    if (humidity_temp == 0){humidity_temp = humtemp.getTemperatureC();
-    } else {                humidity_temp = humidity_temp * 0.9 + humtemp.getTemperatureC() * 0.1;
-    }
-    if ( humidity == 0 ){   humidity = humtemp.getHumidity();
-    } else {                humidity = humidity * 0.9 + humtemp.getHumidity() * 0.1;
-    }
-}
-
-// Clear LCD
-void cls(void){
-    i2clcd.locate(0, 0);
-    i2clcd.printf("        ");
-    i2clcd.locate(0, 1);
-    i2clcd.printf("        ");
-}
-
-// Set initial time
-void set_initial_time (void){
-    // Set Initial data -> 2014/06/22 10:20:00
-#if USE_C_STD_LIB
-struct tm t;
-
-    m41t62.read_rtc_std(&t);
-    if ((sw_chng == 0) && (sw_mode == 0)){  
-        t.tm_sec  = 0;
-        t.tm_min  = 20;
-        t.tm_hour = 10;
-        t.tm_mday = 22;
-        t.tm_wday = 0; // Sun is not 7 but 0
-        t.tm_mon  = 5; // Jan. = 0
-        t.tm_year = 14 + 100; // 1900+x = now
-        m41t62.write_rtc_std(&t);
-    }
-#else
-rtc_time t;
-
-    m41t62.read_rtc_direct(&t);
-    if ((sw_chng == 0) && (sw_mode == 0)){   
-        t.rtc_seconds = 0;
-        t.rtc_minutes = 20;
-        t.rtc_hours   = 10;
-        t.rtc_date    = 22;
-        t.rtc_weekday = RTC_Wk_Sunday;
-        t.rtc_month   = 6;
-        t.rtc_year_raw= 14;
-        m41t62.write_rtc_direct(&t);
-    }
-#endif
-}
-
-//-------------------------------------
-// Application program starts here
-//-------------------------------------
-int main() {
-    pc.baud(9600);
-    pc.printf("\r\nmbed LPC1114FN28 test program by JH1PJL created on "__DATE__"(UTC)\r\n");
-    i2clcd.setContrast(25);
-    i2clcd.locate(0, 0);
-    i2clcd.printf("LPC1114F");
-    i2clcd.locate(0, 1);
-    i2clcd.printf(" JH1PJL ");
-    // Initialize data
-    av_cds = 0;
-    av_vref = 0;
-    av_vol = 0;
-    humidity_temp = 0;
-    humidity = 0;
-    // RTC
-    m41t62.set_sq_wave(RTC_SQW_NONE);
-    set_initial_time();
-    // Show initial screen
-    wait(5.0);    
-    while(1) {
-    //  ---------- Cds Sensor, Vref, Volume ---------------------------------------------------
-        // Power on / Analog sensor
-        analog_pwr = 1;
-        vref_pwr = 1;
-        wait(0.2);
-        adc_all_read();
-        // Power off / Analog sensor
-        analog_pwr = 0; 
-        // Normalize
-        adc_normalize(CDS);
-        adc_normalize(VREF);
-        adc_normalize(VOL);
-        cls();       
-        i2clcd.locate(0, 0);    // 1st line top
-        //             12345678
-        i2clcd.printf("L:%.1f", lux);
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("V:%.3f", cal_vcc);       
-        myled0 = 1;
-        pc.printf( "\r\nCds:%.0fohm->%.1flux, Vcc:%.3fV, Vol:%d\r\n",
-            r_cds, lux, cal_vcc, nor_vol );
-        myled0 = 0;
-        wait(4.0);
-    //  ---------- Barometer Sensor / BMP180 --------------------------------------------------
-        bmp180.normalize();
-        cls();
-        i2clcd.locate(0, 0);    // 1st line top
-        i2clcd.printf("P:%.1f", bmp180.read_pressure());
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("T:%\+-6.1f", bmp180.read_temperature());
-        myled1 = 1;
-        pc.printf("Pres:%4.1fhPa, Temp:%\+-0.1fdegC\r\n",
-                bmp180.read_pressure(), bmp180.read_temperature());
-        myled1 = 0;
-        wait(4.0);
-    //  ---------- Humidity Sensor / RHT03 ----------------------------------------------------
-        hum_RHT03_read();       // Read Humidity data then avaraging
-        cls();
-        i2clcd.locate(0, 0);    // 1st line top
-        i2clcd.printf("H:%.1f", humidity);
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("T:%\+-6.1f", humidity_temp);
-        myled1 = 1;
-        pc.printf("Humid: %0.1f%%RH, Temp:%\+-0.1fdegC\r\n", humidity, humidity_temp);          
-        myled1 = 0; 
-        wait(4.0);
-    //  ---------- Check RTC ------------------------------------------------------------------
-#if USE_C_STD_LIB
-tm t;
-time_t seconds;
-char buf[40];
-
-        m41t62.read_rtc_std(&t);
-        seconds = mktime(&t);
-        cls();
-        i2clcd.locate(0, 0);    // 1st line top
-        i2clcd.printf("%02d/%02d/%02d", t.tm_year % 100, t.tm_mon + 1, t.tm_mday);
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
-        myled1 = 1;
-        // Show Time with several example
-        // ex.1
-        pc.printf("Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
-                    t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
-        // ex.2
-        strftime(buf, 40, "%x %X", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-        // ex.3
-        strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-        // ex.4
-        strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
-        printf("Date: %s\r\n", buf);
-        myled1 = 0;
-        wait(4.0);
-#else
-rtc_time t;
- 
-        m41t62.read_rtc_direct(&t);
-        cls();
-        i2clcd.locate(0, 0);    // 1st line top
-        i2clcd.printf("%02d/%02d/%02d", t.rtc_year, t.rtc_month, t.rtc_date);
-        i2clcd.locate(0, 1);    // 2nd line top
-        i2clcd.printf("%02d:%02d:%02d", t.rtc_hours, t.rtc_minutes, t.rtc_seconds);
-        myled1 = 1;
-        pc.printf("Date:%04d/%02d/%02d(%s), Time:%02d:%02d:%02d\r\n",
-            t.rtc_year, t.rtc_month, t.rtc_date, &week[t.rtc_weekday-1][0],
-            t.rtc_hours, t.rtc_minutes, t.rtc_seconds);          
-        myled1 = 0;
-        wait(4.0);
-#endif  
-    }
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mon.cpp	Sun Jun 29 06:58:00 2014 +0000
@@ -0,0 +1,586 @@
+/*
+ * mbed Application program
+ * Data logging & Monitor program for only LPC1114FN28 
+ *
+ *  Copyright (c) 2010-2014 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created:  May  	    15th, 2010
+ *		Spareted: June		25th, 2014		mon() & mon_hw()
+ *      Revised:  June      29th, 2014
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+//  Include ---------------------------------------------------------------------------------------
+#include "mbed.h"
+#include "m41t62_rtc.h"         // Own lib. / RTC control
+#include "AT24C1024.h"          // Own lib. / EEPROM control
+#include "dt_log.h"
+
+//  Object ----------------------------------------------------------------------------------------
+Serial pc(dp16,dp15);
+extern I2C    xi2c(dp5,dp27);	// SDA, SCL
+extern M41T62 xm41t62(xi2c);	// STmicro RTC(M41T62)
+AT24C1024   at24c1024(xi2c);    // Atmel 1Mbit EE-PROM 
+
+//  Definition ------------------------------------------------------------------------------------
+#define BAUD(x)         	pc.baud(x)
+#define GETC(x)         	pc.getc(x)
+#define PUTC(x)				pc.putc(x)
+#define PRINTF(...)     	pc.printf(__VA_ARGS__)
+#define READABLE(x)     	pc.readable(x)
+
+// EEPROM
+#define EEP_TOP				0x0
+
+//  RAM -------------------------------------------------------------------------------------------
+char linebuf[64];
+int buf_size = sizeof(linebuf);
+
+// 	for EEPROM control
+uint8_t buf_pointer[PTR_SIZE];
+xEeprom_ptr log_inf;
+
+struct one_log{
+	uint32_t	time;
+	uint16_t	vcc;
+	uint16_t	baro;
+	int16_t		b_temp;
+	uint16_t	humi;
+	int16_t		h_temp;
+	uint16_t	lux;
+};		// 16 bytes total
+
+one_log lg;
+uint8_t bf[PKT_SIZE];
+
+extern float baro;
+extern float baro_temp;
+extern float cal_vcc;
+extern float lux;
+extern float humidity;
+extern float humidity_temp;
+extern float lux;
+
+//  ROM / Constant data ---------------------------------------------------------------------------
+static char *const mon_msg = "Monitor for mbed system, created on "__DATE__"";
+
+//                      $, 2014/6/29,12:43:16,3.293,1004.5,+29.3,45.8,+29.2,1234,*
+char *const log_head = "$,YYYY/MM/DD,HH:MM:SS,Vcc  ,Press ,Temp ,Humi,Temp ,Lux  ,*";
+char *const msg_emty = "Data empty";
+
+//  Function prototypes ---------------------------------------------------------------------------
+extern void mon_hw(void);
+
+//-------------------------------------------------------------------------------------------------
+//  Control Program
+//-------------------------------------------------------------------------------------------------
+//  Put \r\n
+void put_rn ( void ){	PUTC('\r');		PUTC('\n');}
+
+//  Put \r
+void put_r ( void ){	PUTC('\r');}
+
+// Put ", "
+void put_lin ( void ){	PRINTF(", ");}
+
+// Put space n
+void put_spc( uint8_t n){	for(;n > 0; n--){ PUTC(' '); }}
+
+//  Change string -> integer
+int xatoi (char **str, unsigned long *res){
+unsigned long val;
+unsigned char c, radix, s = 0;
+
+    while ((c = **str) == ' ') (*str)++;
+    if (c == '-') {
+        s = 1;
+        c = *(++(*str));
+    }
+    if (c == '0') {
+        c = *(++(*str));
+        if (c <= ' ') {	*res = 0;	return 1; }
+        if (c == 'x') {
+            radix = 16;
+            c = *(++(*str));
+        } else {
+            if (c == 'b') {
+                radix = 2;
+                c = *(++(*str));
+            } else {
+                if ((c >= '0')&&(c <= '9')){	radix = 8;
+                }	else {   return 0;}
+            }
+        }
+    } else {
+        if ((c < '1')||(c > '9')){	return 0;}
+        radix = 10;
+    }
+    val = 0;
+    while (c > ' ') {
+        if (c >= 'a') c -= 0x20;
+        c -= '0';
+        if (c >= 17) {
+            c -= 7;
+            if (c <= 9) return 0;
+        }
+        if (c >= radix) return 0;
+        val = val * radix + c;
+        c = *(++(*str));
+    }
+    if (s) val = -val;
+    *res = val;
+    return 1;
+}
+
+//-------------------------------------------------------------------------------------------------
+// Data Logging / Save into EEPROM
+//-------------------------------------------------------------------------------------------------
+// Read buffer pointer
+static void dtlog_pointer_read(void){
+uint8_t i;
+uint8_t *addr;
+
+    /* Read EEPROM and save to buf_pointer[] */
+    for ( i = 0; i < PTR_SIZE; i++ ){
+        addr = (uint8_t *)(EEP_TOP + i);
+        buf_pointer[i]  = at24c1024.read((int)addr);
+        wait(0.002);
+    }
+}
+
+//  Make one data packet data structure
+void dtlog_data_pack(void){
+struct tm t;
+
+    xm41t62.read_rtc_std(&t);
+    lg.time = mktime(&t);
+    bf[0] = (uint8_t)(lg.time >> 24);
+    bf[1] = (uint8_t)(lg.time >> 16);
+    bf[2] = (uint8_t)(lg.time >> 8);
+    bf[3] = (uint8_t)(lg.time >> 0);
+    lg.vcc = (uint16_t)(cal_vcc * 1000);
+    bf[4] = (uint8_t)(lg.vcc >> 8);
+    bf[5] = (uint8_t)(lg.vcc >> 0);
+    lg.baro = (uint16_t)(baro * 10);
+    bf[6] = (uint8_t)(lg.baro >> 8);
+    bf[7] = (uint8_t)(lg.baro >> 0);
+    lg.b_temp = (int16_t)(baro_temp * 10);
+    bf[8] = (uint8_t)(lg.b_temp >> 8);
+    bf[9] = (uint8_t)(lg.b_temp >> 0);
+    lg.humi = (uint16_t)(humidity * 10);
+    bf[10] = (uint8_t)(lg.humi >> 8);
+    bf[11] = (uint8_t)(lg.humi >> 0);
+    lg.h_temp = (int16_t)(humidity_temp * 10);
+    bf[12] = (uint8_t)(lg.h_temp >> 8);
+    bf[13] = (uint8_t)(lg.h_temp >> 0);
+    lg.lux = (uint16_t)lux;
+    bf[14] = (uint8_t)(lg.lux >> 8);
+    bf[15] = (uint8_t)(lg.lux >> 0);
+}
+
+//  Print one packet as normalized data
+void print_one_block_data(void){
+struct tm *t;
+time_t seconds;
+uint16_t dt0;
+int16_t dt1;
+
+    put_rn();
+    PUTC( '$' );
+    //--- Time
+    seconds = (time_t)bf[0] * 16777216 + (time_t)bf[1] * 65536 + (time_t)bf[2] * 256 + (time_t)bf[3];
+	//PRINTF(",0x%x,",seconds);
+    t = localtime(&seconds);
+	PRINTF(",%04d/%02d/%02d,%02d:%02d:%02d,",
+			t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+	//--- Vcc
+	dt0 = (uint16_t)bf[4] * 256 + (uint16_t)bf[5];
+	//PRINTF("0x%x,",dt0);
+	PRINTF("%01d.%03d,", dt0/1000, dt0%1000);
+	//--- Pressure
+	dt0 = (uint16_t)bf[6] * 256 + (uint16_t)bf[7];
+	//PRINTF("0x%x,",dt0);
+	PRINTF("%04d.%01d,", dt0/10, dt0%10 );
+	//--- Temp.
+	dt1 = (int16_t)bf[8] * 256 + (int16_t)bf[9];
+	//PRINTF("0x%x,",dt1);
+	PRINTF("%\+-03d.%01d,", dt1/10, abs(dt1)%10 );
+	//--- Humidity	   
+	dt0 = (uint16_t)bf[10] * 256 + (uint16_t)bf[11];
+	//PRINTF("0x%x,",dt0);
+	PRINTF("%02d.%01d,", dt0/10, dt0%10 );
+	//--- Temp.
+	dt1 = (int16_t)bf[12] * 256 + (int16_t)bf[13];
+	//PRINTF("0x%x,",dt1);
+	PRINTF("%\+-03d.%01d,", dt1/10, abs(dt1)%10 );
+	//--- Lux
+	dt0 = (uint16_t)bf[14] * 256 + (uint16_t)bf[15];
+	//PRINTF("0x%x",dt0);
+	PRINTF("%05d,*", dt0);
+}
+
+//  Read block data
+static void dtlog_blk_read(xEeprom_ptr *read_inf){
+uint8_t i;
+uint8_t *addr;
+
+    PRINTF( log_head );
+    for ( ; ; ){
+        /* Read EEPROM and save to data_pack[] */
+        for (i = 0; i < PKT_SIZE; i++){
+            addr = (uint8_t *)(EEP_TOP + (read_inf->ptr * PTR_SIZE) + i);
+            bf[i]  =at24c1024.read((int)addr);
+            wait(0.002);
+        }
+        print_one_block_data();
+        wait(0.001);
+        if (++read_inf->ptr >= read_inf->max){
+            break;
+        }
+        if (READABLE() != 0){
+            break;
+        }
+    }
+    put_rn();
+}
+
+//  Write one packet
+void dtlog_one_write(void){
+xEeprom_ptr write_inf;
+uint8_t i;
+uint8_t *addr;
+
+    /* Read buffer pointer */
+    dtlog_pointer_read();
+    write_inf.wr_pointer = READ_POINTER();
+    write_inf.status = RD_STATUS();
+    if (write_inf.status == BUF_FULL){  return;}
+    /* Write data_pack[] into  EEPROM */
+    for (i = 0; i < PKT_SIZE; i++){
+        addr = (uint8_t *)(EEP_TOP + (write_inf.wr_pointer * PTR_SIZE) + i); 
+        at24c1024.write((int)addr, bf[i]);
+        wait(0.008);
+    }
+    /* Write buffer pointer */
+    if (++write_inf.wr_pointer == BLK_NO){
+        write_inf.status = BUF_FULL;
+    } else {
+        write_inf.status = 0;
+    }
+    WRITE_POINTER(write_inf.wr_pointer);
+    WR_STATUS(write_inf.status); 
+    for (i = 0; i < PTR_SIZE; i++){
+        addr = (uint8_t *)(EEP_TOP + i);    
+        at24c1024.write((int)addr, buf_pointer[i]);
+        wait(0.008);
+    }   
+}
+
+//  Read Data Pointer Information
+void dtlog_rd_buf_inf(xEeprom_ptr *log_ptr_inf){
+    dtlog_pointer_read();
+    log_ptr_inf->wr_pointer = READ_POINTER();
+    log_ptr_inf->status = RD_STATUS();  
+}
+
+//  Clear all buffer
+void dtlog_clear_all_buff(xEeprom_ptr *log_ptr_inf){
+uint8_t i;
+uint8_t *addr;
+
+    /* Set initial data */
+    WRITE_POINTER(1);
+    log_ptr_inf->wr_pointer = 1;
+    WR_STATUS(0);
+    log_ptr_inf->status = 0;
+    log_ptr_inf->max = BLK_NO;
+    log_ptr_inf->ptr = 1;
+    log_ptr_inf->size = BLK_SIZE;   
+    /* Write buffer pointer */
+    for (i = 0; i < PTR_SIZE; i++){
+        addr = (uint8_t *)(EEP_TOP + i);
+        at24c1024.write((int)addr, buf_pointer[i]);
+        wait(0.008);
+    }
+}
+
+// Read some block from buffer
+void dtlog_block_read(xEeprom_ptr *read_inf){
+    if (read_inf->wr_pointer == BUF_HEAD){ // Check pointer
+        PRINTF(msg_emty);
+        put_rn();
+        return;
+    }
+    if (read_inf->ptr >= read_inf->wr_pointer){
+        PRINTF("Reach to end!");
+        put_rn();
+        return;
+    }
+    if (read_inf->wr_pointer > (read_inf->ptr + read_inf->size)){
+        read_inf->max = read_inf->ptr + read_inf->size;
+    } else {
+        read_inf->max = read_inf->wr_pointer;
+    }
+    dtlog_blk_read(read_inf);
+}
+
+// EEPROM buffer occupation 
+uint16_t dtlog_buf_occupation(void){
+    return (uint16_t)(((uint32_t)READ_POINTER() * 1000 )/ BLK_NO);
+}
+
+//  Read block number
+void dtlog_num_of_block(xEeprom_ptr *read_inf){
+uint16_t dt;
+
+    if (read_inf->wr_pointer == BUF_HEAD){
+        PRINTF(msg_emty);
+        put_rn();
+        return;
+    }
+    dt = read_inf->wr_pointer - 1;
+    PRINTF("Number of data = %d", dt);    
+    put_rn();
+    dt = dtlog_buf_occupation();
+    PRINTF("EEPROM Occupation = %d.%01d%%", dt/10, dt%10);
+    put_rn();
+}
+
+//-------------------------------------------------------------------------------------------------
+//	Monitor
+//-------------------------------------------------------------------------------------------------
+//  Help Massage
+void msg_hlp (void){
+    PRINTF(mon_msg);						put_rn();
+    PRINTF("d - Data logger");				put_rn();
+    PRINTF("t - Check and set RTC");		put_rn();
+    PRINTF("x - Goto HW monitor");			put_rn();
+    PRINTF("q - Return to main");			put_rn();
+}
+
+//  Get key input data
+void get_line (char *buff, int len){
+char c;
+int idx = 0;
+
+    for (;;) {
+        c = GETC();
+        //    Added by Kenji Arai / JH1PJL   May 9th, 2010
+        if (c == '\r') {
+            buff[idx++] = c;
+            break;
+        }
+        if ((c == '\b') && idx) {
+            idx--;
+            PUTC(c);
+            PUTC(' ');
+            PUTC(c);
+        }
+        if (((uint8_t)c >= ' ') && (idx < len - 1)) {
+            buff[idx++] = c;
+            PUTC(c);
+        }
+    }
+    buff[idx] = 0;
+    PUTC('\n');
+}
+
+
+// RTC related subroutines
+void chk_and_set_time(char *ptr){
+unsigned long p1;
+struct tm t;
+
+	if (xatoi(&ptr, &p1)){
+		t.tm_year		= (uint8_t)p1 + 100;
+		PRINTF("Year:%d ",p1);
+		xatoi( &ptr, &p1 );
+		t.tm_mon		= (uint8_t)p1 - 1;
+		PRINTF("Month:%d ",p1);
+		xatoi( &ptr, &p1 );
+		t.tm_mday		= (uint8_t)p1;
+		PRINTF("Day:%d ",p1);
+		xatoi( &ptr, &p1 );
+		t.tm_hour		= (uint8_t)p1;
+		PRINTF("Hour:%d ",p1);
+		xatoi( &ptr, &p1 );
+		t.tm_min    	= (uint8_t)p1;
+		PRINTF("Min:%d ",p1);
+		t.tm_sec 		= (uint8_t)p1;
+		PRINTF("Sec: %d \r\n",p1);
+		xm41t62.write_rtc_std(&t);
+	}
+    xm41t62.read_rtc_std(&t);
+    // Show Time with several example
+    // ex.1
+    PRINTF("Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
+    		t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
+#if 0
+time_t seconds;
+char buf[40];
+	
+	seconds = mktime(&t);
+    // ex.2
+    strftime(buf, 40, "%x %X", localtime(&seconds));
+    PRINTF("Date: %s\r\n", buf);
+    // ex.3
+    strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
+    PRINTF("Date: %s\r\n", buf);
+    // ex.4
+    strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
+    PRINTF("Date: %s\r\n", buf);
+#endif
+}
+
+//	Data Logger / Check status and Output data
+static void data_logger(char *ptr){
+char c;
+unsigned long dt;
+char *const Msg  = "Data Logger Mode, ?[Help]";
+
+	PRINTF(Msg);
+	put_rn();
+	/* Get EEPROM resource */
+	dtlog_rd_buf_inf(&log_inf);
+	while (1){
+		PRINTF("DL>");
+        ptr = linebuf;
+        get_line(ptr, buf_size);
+		switch (*ptr++) {
+			case 'a' :
+				put_r();
+				log_inf.ptr = BUF_HEAD;
+				log_inf.size = log_inf.wr_pointer;
+				dtlog_block_read(&log_inf);
+				log_inf.ptr = BUF_HEAD;
+				log_inf.size = BLK_SIZE;
+				break;
+			case 'c' :	// Clear data
+				put_r();
+				PRINTF("Delete all data?");
+				put_rn();
+				PRINTF("Enter y/n (n-cancel)");
+				put_rn();
+				c = GETC();
+				PUTC(c);
+				put_rn();
+				if (c == 'y'){
+					PRINTF("Cleared all logging data");
+					dtlog_clear_all_buff(&log_inf);
+				} else {
+					PRINTF("Canceled");
+				}
+				put_rn();
+				break;
+			case 'd' :	// d <pointer> [<count>] - Dump buffer
+				put_r();
+				log_inf.size = BLK_SIZE;
+				if (xatoi(&ptr, &dt)){	log_inf.ptr = (uint16_t)dt;
+				} else {				log_inf.ptr = BUF_HEAD;		}	
+				if (xatoi(&ptr, &dt)){	log_inf.size = (uint8_t)dt;				
+				} else {				log_inf.size = BLK_SIZE;	}
+				dtlog_block_read(&log_inf);
+				break;
+			case 0x0d :	// CR
+				put_r();
+				log_inf.size = BLK_SIZE;
+				dtlog_block_read(&log_inf);
+				break;
+			case 'b' :	// Back
+				put_r();
+				log_inf.size = BLK_SIZE;
+				if (log_inf.ptr > log_inf.size){
+					log_inf.ptr -= log_inf.size;
+					if (log_inf.ptr == 0){
+						log_inf.ptr = 1;
+						--log_inf.size;
+					}
+				} else {
+					log_inf.size = log_inf.ptr - 1;
+					log_inf.ptr = 1;
+				}
+				dtlog_block_read(&log_inf);
+				break;
+			case 'n' :
+			case 's' :	// Status
+				put_r();
+				dtlog_num_of_block(&log_inf);
+				break;
+			case 'q' :	// exit
+				linebuf[0] = 0;
+				return;
+			case '?' :
+				put_r();
+			    PRINTF("d - <pointer> [<count>] Dump one block data");	put_rn();
+			    PRINTF("a - Dump all log data");		put_rn();
+			    PRINTF("c - Clear log data");			put_rn();
+			    PRINTF("s - Logger status");			put_rn();
+			    PRINTF("q - Exit DL mode");				put_rn();  
+				break;
+			default:
+				PUTC('?');
+				put_rn();
+				break;
+		}
+	}
+}
+
+// ---------- Program starts here! ---------------------------------------------------------------
+int mon(void) {
+char *ptr;
+
+    BAUD(9600);
+    put_rn();
+    put_rn();
+    PRINTF("%s [Help:'?' key]", mon_msg);
+    put_rn();
+    for (;;) {
+        put_r();
+        PUTC('>');
+        ptr = linebuf;
+        get_line(ptr, sizeof(linebuf));
+        switch (*ptr++) {
+    //---------------------------------------------------------------------------------
+    //  check and set RTC
+    //---------------------------------------------------------------------------------
+        case 't' :
+        	put_r(); 
+            chk_and_set_time(ptr);               
+            break;
+    //---------------------------------------------------------------------------------
+    //  check EEPROM status
+    //---------------------------------------------------------------------------------
+        case 'd' :
+        	put_r(); 
+            data_logger(ptr);               
+            break;
+    //---------------------------------------------------------------------------------
+    //  help
+    //---------------------------------------------------------------------------------
+        case '?' :
+        	put_r(); 
+            msg_hlp();                 
+            break;
+    //---------------------------------------------------------------------------------
+    //  Go to special command
+    //---------------------------------------------------------------------------------
+        case 'x' :    // 
+            mon_hw();
+            PRINTF("->Came back monitor\r\n");            
+            break;
+    //---------------------------------------------------------------------------------
+    //  Go back to main()
+    //---------------------------------------------------------------------------------
+        case 'q' :        // Quit
+            PRINTF("\rReturn to main\r\n");
+            PRINTF("cannot control anymore from here\r\n");
+            return 0;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mon_hw.cpp	Sun Jun 29 06:58:00 2014 +0000
@@ -0,0 +1,1806 @@
+/*
+ * mbed Application program for the mbed LPC1114FN28
+ * Monitor program Ver.2 for only LPC1114FN28 
+ *
+ *  Copyright (c) 2010-2014 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created:  May  	    15th, 2010
+ *		Spareted: June		25th, 2014		mon() & mon_hw()
+ *      Revised:  June      29th, 2014
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*
+ * Function
+ *  Show Memory contents, Digital port, Analog input port, CPU clock and others in the mbed board
+ *      Connection
+ *          uart            USB Vertual com
+ */
+
+//  Include ---------------------------------------------------------------------------------------
+#include "mbed.h"
+#include "AT24C1024.h"          // Own lib. / EEPROM control
+#include "mon_hw_config.h"
+
+//  Object ----------------------------------------------------------------------------------------
+extern Serial pcx(dp16,dp15);
+extern I2C    xxi2c(dp5,dp27);			// SDA, SCL
+extern AT24C1024   xat24c1024(xxi2c);	// Atmel 1Mbit EE-PROM
+
+//  Definition ------------------------------------------------------------------------------------
+// Define clocks
+#define __XTAL				(12000000UL)    // Oscillator frequency
+#define __SYS_OSC_CLK		(    __XTAL)    // Main oscillator frequency
+#define __IRC_OSC_CLK		(12000000UL)    // Internal RC oscillator frequency
+
+// Range check status
+#define ERR_NOTHING         0
+#define ERR_MODIFY_SIZ      1
+#define ERR_OUT_OF_RANGE    2
+
+// Reg. Size
+#define SIZE8				32
+#define SIZE16				16
+#define SIZE_FULL			32
+#define SIZE_X				32
+
+// IO Cinfig
+#define IO_ALL				0
+#define IO_I2C				1
+
+#define BAUD(x)         	pcx.baud(x)
+#define GETC(x)         	pcx.getc(x)
+#define PUTC(x)				pcx.putc(x)
+#define PRINTF(...)     	pcx.printf(__VA_ARGS__)
+#define READABLE(x)     	pcx.readable(x)
+
+typedef struct {
+    unsigned long mstr;
+    unsigned long msiz;
+    unsigned long mtmp;
+    unsigned long mold;
+    unsigned char mflg;
+    unsigned char mbhw;
+} MEMO;
+
+#define DW_CHAR			sizeof(char)
+#define DW_SHORT		sizeof(short)
+#define DW_LONG			sizeof(long)
+
+typedef unsigned long	DWORD;
+typedef unsigned short	WORD;
+typedef unsigned char	BYTE;
+typedef unsigned int	UINT;
+
+//  RAM -------------------------------------------------------------------------------------------
+//  Memory management
+unsigned long SystemFrequency;
+
+#if USE_MEM
+//  RAM -------------------------------------------------------------------------------------------
+static MEMO mem;
+
+//  ROM / Constant data ---------------------------------------------------------------------------
+//  Memory range data
+const uint32_t mem_range[][2] = {          // Memory access range
+    { 0x00000000, 0x00007fff },            // On-chip non-volatile memory     //32KB Flash memory
+    { 0x10000000, 0x10000fff },            // On-chip SRAM                    //4KB local RAM
+    { 0x1fff0000, 0x1fff3fff },            // Boot ROM                        //16KB Boot ROM
+    { 0x40000000, 0x4007ffff },            // IO area
+    { 0x50000000, 0x501fffff }             // IO area
+};
+
+static char *const rmsg0 = "FLASH    ";
+static char *const rmsg1 = "SRAM     ";
+static char *const rmsg2 = "BOOT ROM ";
+static char *const rmsg3 = "IO       ";
+static char *const rmsg4 = "IO       ";
+#endif  // USE_MEM
+
+#if USE_EEP
+//  RAM -------------------------------------------------------------------------------------------
+static MEMO eepmem;
+
+//  ROM / Constant data ---------------------------------------------------------------------------
+const uint32_t eepmem_range[2] = { /* Memory access range */
+	0x00000, 0x1ffff 	/* EEPROM 1Mbits 128Kbytes */
+};
+#endif
+
+//  ROM / Constant data ---------------------------------------------------------------------------
+static char *const mon_msg_hw = "HW monitor only for mbed LPC1114FN28";
+
+//  Function prototypes ---------------------------------------------------------------------------
+extern char linebuf[];
+extern int buf_size;
+
+extern void put_rn ( void );
+extern void put_r ( void );
+extern void put_lin ( void );
+extern void put_spc( uint8_t n);
+extern void get_line (char *buff, int len);
+extern int xatoi (char **str, unsigned long *res);
+
+//-------------------------------------------------------------------------------------------------
+//  Control Program
+//-------------------------------------------------------------------------------------------------
+//  Help Massage
+void msg_hlp_hw (void){
+    PRINTF(mon_msg_hw);
+    put_rn();
+#if USE_MEM
+    PRINTF("m  - Entry Memory Mode");
+    put_rn();
+    PRINTF("m>? -> Help ");
+    put_rn();
+#endif   // USE_MEM
+#if USE_EEP
+    PRINTF("e -Enter EEPROM Memory Mode ");
+    put_rn();
+    PRINTF("e>? -> Help ");
+    put_rn();
+#endif   // USE_EEP
+#if USE_REG_SPI_UART
+    PRINTF("r  - Show SPI & UART Reg.");
+    put_rn();
+    PRINTF("r>? -> Help ");
+    put_rn();
+#endif   // USE_REG_SPI_UART
+#if USE_PORT
+    PRINTF("p  - Show port configration");
+    put_rn();
+#endif   // USE_PORT
+#if USE_REG_I2C
+    PRINTF("i  - Show I2C Reg.");
+    put_rn();
+#endif   // USE_REG_I2C
+#if USE_SYS
+    PRINTF("sf - System Clock");
+    put_rn();
+    PRINTF("sc - System / CPU information");
+    put_rn();
+#endif   // USE_SYS
+#if USE_RPT
+    PRINTF("/    [a],[p] commands every 1 sec  Exit =hit any key (not ENTER key) ");
+    put_rn();
+#endif
+#if DEBUG
+    PRINTF("x     Special command for Debug ");
+    put_rn();
+#endif   // DEBUG
+    PRINTF("q  - Quit (back to called routine)");
+    put_rn();
+}
+
+// No function
+static void not_yet_impliment( void ){
+	PRINTF( "Not implimented yet" );
+	put_rn();
+}
+
+char *const imsg2 = "-->Control Reg.";
+char *const imsg3 = "-->Status Reg.";
+char *const imsg4 = "-->Data Reg.";
+//static char *const imsg5 = "-->Baud rate Reg.";
+//static char *const imsg6 = "-->Own address Reg.";
+char *const imsg7 = "-->Clock control Reg.";
+//static char *const imsg8 = "-->TRISE Reg.";
+
+static char *const io_port_name0 = "PIO0_";
+static char *const io_port_name1 = "PIO1_";
+static char *const iomsg0 = "Func->select ";
+static char *const iomsg1 = "IO";
+static char *const iomsg2 = "Reserved";
+static char *const iomsg30 = "B0_MAT";
+static char *const iomsg31 = "B1_MAT";
+static char *const iomsg4 = "Std/F-md I2C";
+static char *const iomsg5 = "func. R";
+static char *const iomsg6 = "D-Mode";
+static char *const iomsg7 = "A-Mode";
+
+//  Show 16bit register contents
+void reg_print(uint16_t size, uint16_t reg){
+uint16_t i, j, k, n;
+
+    if (size == 8){
+        PRINTF(" 7, 6, 5, 4, 3, 2, 1, 0");
+        put_rn();
+        i = 8;
+        n = 0x80;
+    } else if (size == 16){
+        PRINTF( "15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0" );
+        put_rn();
+        i = 16;
+        n = 0x8000;
+    } else {
+        PRINTF("0x%08x", reg);
+        return;
+    }
+    PUTC(' ');
+    for (; i>0; i--){
+        k = n >> (size-i);
+        j = reg & k;
+        if (j){
+            PUTC('1');
+        } else {
+            PUTC('0');
+        }
+        PUTC(' ');
+        PUTC(' ');
+    }
+    PRINTF("  (0x%04x)", reg);
+}
+
+#if USE_PORT
+void io_mode(uint32_t reg){
+    PRINTF("MODE->");
+    switch (reg){
+    case 0:
+        PRINTF("Inactive");
+        break;
+    case 1:
+        PRINTF("P-DWN");
+        break;
+    case 2:
+        PRINTF("P-UP");
+        break;
+    case 3:
+        PRINTF("Repeater");
+        break;
+    }
+}
+
+void io_hys(uint32_t reg){
+    PRINTF("HIS->");
+    switch (reg){
+    case 0:
+        PRINTF("Dis");
+        break;
+    case 1:
+        PRINTF("Ena");
+        break;
+    }
+}
+
+void io_od(uint32_t reg){
+    PRINTF("OD->");
+    switch (reg){
+    case 0:
+        PRINTF("no OD");
+        break;
+    case 1:
+        PRINTF("OD");
+        break;
+    }
+}
+
+void io_mode_hys_od(uint32_t reg){
+    io_mode ((reg >>  3) & 0x3);
+    put_lin();
+    io_hys (( reg >>  5) & 0x1); 
+    put_lin();
+    io_od (( reg >> 10) & 0x1);
+}
+
+// I/O Config IO0_x
+void io_config0(void){
+uint32_t r0;
+
+    // P0_0
+    r0 = LPC_IOCON->RESET_PIO0_0;
+    PRINTF("RESET_%s0(dp23)", io_port_name0);
+    put_spc(1);
+    reg_print( SIZE_X, r0 );
+    put_spc(2);
+    PRINTF( iomsg0 );
+    if ((r0 & 0x7) == 0){	PRINTF("RESET");
+    } else {				PRINTF( iomsg1 );    }
+    put_lin();
+    io_mode_hys_od( r0 );
+    put_rn();
+    // P0_1
+    r0 = LPC_IOCON->PIO0_1;
+    PRINTF("%s1(dp24)", io_port_name0);
+    put_spc(3);
+    reg_print( SIZE_X, r0 );
+    put_spc(2);
+    PRINTF( iomsg0 );
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("CLKOUT");			break;
+    case 2:	PRINTF("32%s2", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn(); 
+    // P0_2
+    r0 = LPC_IOCON->PIO0_2;
+    PRINTF("%s2(dp25)",io_port_name0);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("SSEL0");			break;
+    case 2:	PRINTF("16B0_CAP0");		break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P0_3
+    r0 = LPC_IOCON->PIO0_3;
+    PRINTF("%s3(dp26)",io_port_name0);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P0_4
+    r0 = LPC_IOCON->PIO0_4;
+    PRINTF("%s4(dp27)",io_port_name0);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("SCL");				break;
+    }
+    put_lin();
+    switch (( r0 >> 8 ) & 0x3){
+    case 0:	PRINTF(iomsg4);				break;
+    case 1:	PRINTF(iomsg1);				break;
+    case 2:	PRINTF("Fast md");			break;
+    case 3:	PRINTF(iomsg2 ;				break;
+    }
+    put_rn();
+    // P0_5
+    r0 = LPC_IOCON->PIO0_5;
+    PRINTF("%s5(dp5)",io_port_name0);
+    put_spc(4);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("SDA");				break;
+    }
+    put_lin();
+    switch ( ( r0 >> 8 ) & 0x3 ){
+    case 0:	PRINTF(iomsg4);	        	break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("Fast md");	        break;
+    case 3:	PRINTF(iomsg2);	        	break;
+    }
+    put_rn();
+    // P0_6
+    r0 = LPC_IOCON->PIO0_6;
+    PRINTF("%s6(dp6)", io_port_name0);
+    put_spc(4);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);	        	break;
+    case 1:	PRINTF(iomsg2);	        	break;
+    case 2:	PRINTF("SCK0");		        break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();    
+    // P0_7
+    r0 = LPC_IOCON->PIO0_7;
+    PRINTF("%s7(dp28)", io_port_name0);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0 ;
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);	        	break;
+    case 1:	PRINTF("CTS");		        break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn(); 
+    // P0_8
+    r0 = LPC_IOCON->PIO0_8;
+    PRINTF("%s8(dp1)", io_port_name0);
+    put_spc(4);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);	        	break;
+    case 1:	PRINTF("MISO0");	        break;
+    case 2:	PRINTF("16%s0", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P0_9
+    r0 = LPC_IOCON->PIO0_9;
+    PRINTF("%s9(dp2)", io_port_name0);
+    put_spc(4);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);	        	break;
+    case 1:	PRINTF("MOSI0");	        break;
+    case 2:	PRINTF("16%s1", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P0_10
+    r0 = LPC_IOCON->SWCLK_PIO0_10;
+    PRINTF("SWCLK_%s10(dp3)", io_port_name0);
+    put_spc(1);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7 {
+    case 0:	PRINTF("SWCLK");	        break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("SCK0");		        break;
+    case 3:	PRINTF("16%s2", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P0_11
+    r0 = LPC_IOCON->R_PIO0_11;
+    PRINTF("R_%s11(dp4)", io_port_name0);
+    put_spc(1);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF( iomsg0 );
+    switch ( r0 & 0x7 ){
+    case 0:	PRINTF(iomsg5);	        	break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("AD0");		        break;
+    case 3:	PRINTF("32%s3", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    if ( r0 & 0x80 ){	PRINTF(", %s", iomsg6);
+    } else {			PRINTF(", %s", iomsg7);
+    } 
+    put_rn();
+}
+
+// I/O Config IO1_x
+void io_config1(void){
+uint32_t r0;
+
+    // P1_0
+    r0 = LPC_IOCON->R_PIO1_0;
+    PRINTF("R_%s0(dp9)", io_port_name1);
+    put_spc(2);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF( iomsg0 );
+    switch ( r0 & 0x7 ){
+    case 0:	PRINTF(iomsg5);				break;
+    case 1:	PRINTF(iomsg1);				break;
+    case 2:	PRINTF("AD1");				break;
+    case 3:	PRINTF("32B1_CAP0");		break;
+    }
+    io_mode_hys_od(r0);
+    if (r0 & 0x80){		PRINTF(", %s", iomsg6);
+    } else {			PRINTF(", %s", iomsg7);
+    } 
+    put_rn();
+    // P1_1
+    r0 = LPC_IOCON->R_PIO1_1;
+    PRINTF("R_%s1(dp10)", io_port_name1);
+    put_spc(1);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg5);	        	break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("AD2");		        break;
+    case 3:	PRINTF("32%s0", iomsg31);	break;
+    }
+    io_mode_hys_od(r0);
+    if (r0 & 0x80){		PRINTF(", %s", iomsg6);
+    } else {			PRINTF(", %s", iomsg7);
+    } 
+    put_rn(); 
+    // P1_2
+    r0 = LPC_IOCON->R_PIO1_2;
+    PRINTF("R_%s2(dp11)", io_port_name1);
+    put_spc(1);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg5);	        	break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("AD3");		        break;
+    case 3:	PRINTF("32%s1", iomsg31);	break;
+    }
+    io_mode_hys_od( r0 );
+    if (r0 & 0x80){		PRINTF(", %s", iomsg6);
+    } else {			PRINTF(", %s", iomsg7);
+    }   
+    put_rn(); 
+    // P1_3
+    r0 = LPC_IOCON->SWDIO_PIO1_3;
+    PRINTF("SWDIO_%s3(dp12)",io_port_name1);
+    put_spc(1);
+    reg_print(SIZE_X, r0);
+    put_spc(3);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF("SWDIO");	        break;
+    case 1:	PRINTF(iomsg1);	        	break;
+    case 2:	PRINTF("AD4");		        break;
+    case 3:	PRINTF("32%s2", iomsg31);	break;
+    }
+    io_mode_hys_od(r0);
+    if (r0 & 0x80){		PRINTF(", %s", iomsg6);
+    } else {			PRINTF(", %s", iomsg7);
+    }   
+    put_rn();
+    // P1_4
+    r0 = LPC_IOCON->PIO1_4;
+    PRINTF("%s4(dp13)",io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF( iomsg0 );
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("AD5");				break;
+    case 2:	PRINTF("32%s3", iomsg31);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+	put_rn();
+    // P1_5
+    r0 = LPC_IOCON->PIO1_5;
+    PRINTF("%s5(dp14)",io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("RTS");				break;
+    case 2:	PRINTF("32B0_CAP0");		break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P1_6
+    r0 = LPC_IOCON->PIO1_6;
+    PRINTF("%s6(dp15)", io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("RXD");				break;
+    case 2:	PRINTF( "32%s0", iomsg30 );	break;
+    }
+    put_lin();
+    io_mode_hys_od( r0 );
+    put_rn();  
+    // P1_7
+    r0 = LPC_IOCON->PIO1_7;
+    PRINTF("%s7(dp16)", io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("TXD");				break;
+    case 2:	PRINTF("32%s1", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P1_8
+    r0 = LPC_IOCON->PIO1_8;
+    PRINTF("%s8(dp17)", io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("32%s1", iomsg30);	break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+    // P1_9
+    r0 = LPC_IOCON->PIO1_9;
+    PRINTF("%s9(dp18)", io_port_name1);
+    put_spc(3);
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:	PRINTF(iomsg1);				break;
+    case 1:	PRINTF("16%s0", iomsg31);	break;
+    case 2:	PRINTF("MOSI1");			break;
+    }
+    put_lin();
+    io_mode_hys_od(r0);
+    put_rn();
+}
+#endif	// USE_PORT
+
+#if USE_REG_SPI_UART
+void spi_reg(int no){
+uint32_t n, r0, r1 ,r2, r3, r4, r5, r6, r7, r8;
+
+    if (no == SPI_0){
+        n = 0;
+        r0 = LPC_SSP0->CR1;
+        r1 = LPC_SSP0->DR;
+        r2 = LPC_SSP0->SR;
+        r3 = LPC_SSP0->CPSR;
+        r4 = LPC_SSP0->IMSC;
+        r5 = LPC_SSP0->RIS;
+        r6 = LPC_SSP0->MIS;
+        r7 = LPC_SSP0->ICR;
+        r8 = LPC_SSP0->CR0;
+    } else if (no == SPI_1){
+        n = 1;
+        r0 = LPC_SSP1->CR1;
+        r1 = LPC_SSP1->DR;
+        r2 = LPC_SSP1->SR;
+        r3 = LPC_SSP1->CPSR;
+        r4 = LPC_SSP1->IMSC;
+        r5 = LPC_SSP1->RIS;
+        r6 = LPC_SSP1->MIS;
+        r7 = LPC_SSP1->ICR;
+        r8 = LPC_SSP1->CR0;        
+    } else {
+        return;
+    }
+    PRINTF("Show SSP%1d(SPI%1d) Registers", n, n);
+    put_rn();
+    PRINTF("CR0");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r8);
+    put_rn();
+    PRINTF("CR1");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r0);
+    put_rn();
+    PRINTF("DR");
+    PRINTF(imsg4);
+    reg_print(SIZE8, r1);
+    put_rn();
+    PRINTF("SR");
+    PRINTF(imsg3);
+    reg_print(SIZE8, r2);
+    put_rn();
+    PRINTF("CPSR");
+    PRINTF(imsg7);
+    reg_print(SIZE8, r3);
+    put_rn();
+    PRINTF("IMSC");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r4);
+    put_rn();
+    PRINTF("RIS");
+    PRINTF(imsg3);
+    reg_print(SIZE8, r5);
+    put_rn();
+    PRINTF("MIS");
+    PRINTF(imsg3);
+    reg_print(SIZE8, r6);
+    put_rn();
+    PRINTF("ICR");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r7);
+    put_rn();
+}
+
+void uart_reg(void){
+uint32_t r0,r1,r2,r3,r4,r5,r6;
+
+    // clear LCR[DLAB] to read registers
+    LPC_UART->LCR &= ~(1 << 7);
+    r0 = LPC_UART->RBR;
+    r1 = LPC_UART->IER;
+    r2 = LPC_UART->IIR;
+    r3 = LPC_UART->TER;   
+    // set LCR[DLAB] to enable writing to divider registers
+    LPC_UART->LCR |= (1 << 7);   
+    r4 = LPC_UART->DLL;
+    r5 = LPC_UART->DLM;
+    r6 = LPC_UART->FDR;
+    // clear LCR[DLAB]
+    LPC_UART->LCR &= ~(1 << 7);
+    // Print each register 
+    PRINTF("Show UART Registers");   
+    put_rn();
+    PRINTF("RBR");
+    PRINTF(imsg4);
+    reg_print(SIZE8, r0);
+    put_rn();
+    PRINTF("THR--Write only");
+    PRINTF(imsg4);
+    put_rn();
+    PRINTF("DLL");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r4);
+    put_rn();
+    PRINTF("DLM");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r5);
+    put_rn();
+    PRINTF("IER");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r1);
+    put_rn();
+    PRINTF("IIR");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r2);
+    put_rn();
+    PRINTF("FCR--Write only");
+    PRINTF(imsg2);
+    put_rn();
+    PRINTF("LCR,MCR,MSR,SCR,ACR--Not support");
+    put_rn();
+    PRINTF("FDR");
+    PRINTF(imsg2);
+    reg_print(SIZE8, r6);
+    put_rn();
+    PRINTF("TER");
+    PRINTF(imsg3);
+    reg_print(SIZE8, r3);
+    put_rn();
+    PRINTF("RS485CTRL,485ADRMATCH,485DLY--Not support");
+    put_rn();
+}
+#endif  //USE_REG_SPI_UART
+
+#if USE_SYS
+void cpu_inf (void){
+    unsigned long m1, m2;
+
+    m1 = SCB->CPUID;
+    m2 = (m1 >> 24);
+    if (m2 == 0x41) {
+        put_r();
+        PRINTF("CPU = ARM ");
+    } else {
+        put_r();
+        PRINTF("CPU = NOT ARM ");
+    }
+    m2 = (m1 >> 4) & 0xfff;
+    if (m2 == 0xc23) {
+        PRINTF("Cortex-M3");
+        put_rn();
+    } else if (m2 == 0xc20){
+        PRINTF("Cortex-M0");
+        put_rn();
+    } else {
+        PRINTF("NOT Cortex-M3,M0");
+        put_rn();
+    }   
+    m2 = (m1 >> 20) & 0x0f;
+    PRINTF("Variant:%x", m2);
+    put_rn();
+    m2 = m1 & 0x7;
+    PRINTF("Revision:%x", m2);
+    put_rn();
+}
+
+//  Calculate CPU System Clock Frequency /refrence: system_LPCxx.c
+static char *const fmsg0 = "Internal RC Oscillator";
+static char *const fmsg1 = "Xtal Osc Clock";
+static char *const fmsg2 = "Watch dog Osc Clock";
+static char *const fmsg3 = "with PLL";
+static char *const fmsg4 = "System Clock =";
+static char *const fmsg5 = "PLL Post divider ratio =";
+static char *const fmsg6 = "feedback devider =";
+static char *const fmsg7 = "NO Clock ?!";
+
+void get_freq_w_print (void){	// Get Core Clock Frequency
+uint32_t wdt_osc = 0, pll_fct0 = 0, pll_fct1 = 0;
+
+    // Determine clock frequency according to clock register values
+    switch ((LPC_SYSCON->WDTOSCCTRL >> 5) & 0x0F) {
+        case 0:  wdt_osc =  400000; break;
+        case 1:  wdt_osc =  500000; break;
+        case 2:  wdt_osc =  800000; break;
+        case 3:  wdt_osc = 1100000; break;
+        case 4:  wdt_osc = 1400000; break;
+        case 5:  wdt_osc = 1600000; break;
+        case 6:  wdt_osc = 1800000; break;
+        case 7:  wdt_osc = 2000000; break;
+        case 8:  wdt_osc = 2200000; break;
+        case 9:  wdt_osc = 2400000; break;
+        case 10: wdt_osc = 2600000; break;
+        case 11: wdt_osc = 2700000; break;
+        case 12: wdt_osc = 2900000; break;
+        case 13: wdt_osc = 3100000; break;
+        case 14: wdt_osc = 3200000; break;
+        case 15: wdt_osc = 3400000; break;
+    }
+    wdt_osc /= ((LPC_SYSCON->WDTOSCCTRL & 0x1F) << 1) + 2;
+        put_r();
+    switch (LPC_SYSCON->MAINCLKSEL & 0x03) {
+    case 0:                             // Internal RC oscillator 
+        SystemCoreClock = __IRC_OSC_CLK;
+        PRINTF("%s = %dHz", fmsg0, SystemCoreClock);
+        break;
+    case 1:                             // Input Clock to System PLL
+        switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
+        case 0:                         // Internal RC oscillator
+            SystemCoreClock = __IRC_OSC_CLK;
+            PRINTF("%s = %dHz", fmsg0, SystemCoreClock);
+            break;
+        case 1:                         // System oscillator
+            SystemCoreClock = __SYS_OSC_CLK;
+            PRINTF("%s = %dHz", fmsg1, SystemCoreClock );
+            break;
+        case 2:                         // WDT Oscillator
+            SystemCoreClock = wdt_osc;
+            PRINTF("%s = %dHz", fmsg2, wdt_osc );
+            break;
+        case 3:                         // Reserved
+            SystemCoreClock = 0;
+            PRINTF(fmsg7);
+            break;
+        }
+        break;
+    case 2:                             // WDT Oscillator
+        SystemCoreClock = wdt_osc;
+        PRINTF("%s = %dHz", fmsg2, wdt_osc );
+        break;
+    case 3:                             // System PLL Clock Out
+        switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
+        case 0:                         // Internal RC oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = __IRC_OSC_CLK;
+                PRINTF("%s = %dHz", fmsg0, SystemCoreClock);
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = __IRC_OSC_CLK *  pll_fct0;
+                PRINTF("Use Internal RC = %dHz", __IRC_OSC_CLK);
+                put_rn();
+                PRINTF("%s %s = %dHz", fmsg0, fmsg3, SystemCoreClock);
+                put_rn();
+                PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0);
+            }
+            break;
+        case 1:                         // System oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = __SYS_OSC_CLK;
+                PRINTF("%s = %dHz", fmsg1, SystemCoreClock );
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = __SYS_OSC_CLK * pll_fct0;
+                PRINTF("Use XTAL = %dHz", __XTAL);
+                put_rn();
+                PRINTF("%s %s = %dHz", fmsg1, fmsg3, SystemCoreClock);
+                put_rn();
+                PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0);
+            }
+            break;
+        case 2:                         // WDT Oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = wdt_osc;
+                PRINTF("%s = %dHz", fmsg2, wdt_osc );
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = wdt_osc *  pll_fct0;
+                PRINTF("Use WDT OSC = %dHz", wdt_osc);
+                put_rn();
+                PRINTF("%s %s = %dHz", fmsg2, fmsg3, SystemCoreClock);
+                put_rn();
+                PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0);
+            }
+            break;
+        case 3:                         // Reserved
+            SystemCoreClock = 0;
+            PRINTF("fmsg7");
+            break;
+        }
+        break;
+    }
+    SystemCoreClock /= LPC_SYSCON->SYSAHBCLKDIV;
+    put_rn();
+    PRINTF("%s %dHz", fmsg4, SystemCoreClock);
+    put_rn();
+}
+#endif  //USE_SYS
+
+void get_freq  (void){	// Get Core Clock Frequency
+uint32_t wdt_osc = 0, pll_fct0 = 0, pll_fct1 = 0;
+
+    // Determine clock frequency according to clock register values
+    switch ((LPC_SYSCON->WDTOSCCTRL >> 5) & 0x0F) {
+        case 0:  wdt_osc =  400000; break;
+        case 1:  wdt_osc =  500000; break;
+        case 2:  wdt_osc =  800000; break;
+        case 3:  wdt_osc = 1100000; break;
+        case 4:  wdt_osc = 1400000; break;
+        case 5:  wdt_osc = 1600000; break;
+        case 6:  wdt_osc = 1800000; break;
+        case 7:  wdt_osc = 2000000; break;
+        case 8:  wdt_osc = 2200000; break;
+        case 9:  wdt_osc = 2400000; break;
+        case 10: wdt_osc = 2600000; break;
+        case 11: wdt_osc = 2700000; break;
+        case 12: wdt_osc = 2900000; break;
+        case 13: wdt_osc = 3100000; break;
+        case 14: wdt_osc = 3200000; break;
+        case 15: wdt_osc = 3400000; break;
+    }
+    wdt_osc /= ((LPC_SYSCON->WDTOSCCTRL & 0x1F) << 1) + 2;
+    switch (LPC_SYSCON->MAINCLKSEL & 0x03) {
+    case 0:                             // Internal RC oscillator
+        SystemCoreClock = __IRC_OSC_CLK;
+        break;
+    case 1:                             // Input Clock to System PLL
+        switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
+        case 0:                         // Internal RC oscillator
+            SystemCoreClock = __IRC_OSC_CLK;
+            break;
+        case 1:                         // System oscillator
+            SystemCoreClock = __SYS_OSC_CLK;
+            break;
+        case 2:                         // WDT Oscillator
+            SystemCoreClock = wdt_osc;
+            break;
+        case 3:                         // Reserved
+            SystemCoreClock = 0;
+            break;
+        }
+        break;
+    case 2:                             // WDT Oscillator
+        SystemCoreClock = wdt_osc;
+        break;
+    case 3:                             // System PLL Clock Out
+        switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {
+        case 0:                         // Internal RC oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = __IRC_OSC_CLK;
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = __IRC_OSC_CLK *  pll_fct0;
+            }
+            break;
+        case 1:                         // System oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = __SYS_OSC_CLK;
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = __SYS_OSC_CLK * pll_fct0;
+            }
+            break;
+        case 2:                         // WDT Oscillator
+            if (LPC_SYSCON->SYSPLLCTRL & 0x180) {
+                SystemCoreClock = wdt_osc;
+            } else {
+                pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1;
+                pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL;
+                SystemCoreClock = wdt_osc *  pll_fct0;
+            }
+            break;
+        case 3:                         // Reserved
+            SystemCoreClock = 0;
+            break;
+        }
+        break;
+    }
+    SystemCoreClock /= LPC_SYSCON->SYSAHBCLKDIV;
+}
+
+#if USE_REG_I2C
+void i2c_io_reg (void){
+uint32_t r0;
+
+	PRINTF("<Show IO Pin>");
+	put_rn();
+    // P0_4
+    r0 = LPC_IOCON->PIO0_4;
+    reg_print(SIZE_X, r0);
+    put_spc(2);
+    PRINTF("%s4(dp27)",io_port_name0);
+	put_spc(2);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:
+        PRINTF(iomsg1);
+        break;
+    case 1:
+        PRINTF("SCL");
+        break;
+    }
+    put_lin();
+    switch (( r0 >> 8 ) & 0x3){
+    case 0:
+        PRINTF(iomsg4);
+        break;
+    case 1:
+        PRINTF(iomsg1);
+        break;
+    case 2:
+        PRINTF("Fast md");
+        break;
+    case 3:
+        PRINTF(iomsg2);
+        break;
+    }
+    put_rn();
+    // P0_5
+    r0 = LPC_IOCON->PIO0_5;
+    reg_print( SIZE_X, r0 );
+    put_spc(2);
+    PRINTF("%s5(dp5)",io_port_name0);
+    put_spc(3);
+    PRINTF(iomsg0);
+    switch (r0 & 0x7){
+    case 0:
+        PRINTF(iomsg1);
+        break;
+    case 1:
+        PRINTF("SDA");
+        break;
+    }
+    put_lin();
+    switch ((r0 >> 8 ) & 0x3){
+    case 0:
+        PRINTF(iomsg4);
+        break;
+    case 1:
+        PRINTF(iomsg1);
+        break;
+    case 2:
+        PRINTF("Fast md");
+        break;
+    case 3:
+        PRINTF(iomsg2);
+        break;
+    }
+    put_rn();
+}
+    
+void i2c_reg (void){
+uint32_t r0,r1,r2,r3,r4,r5,r6,r7;
+
+    r0 = LPC_I2C->CONSET;
+    r1 = LPC_I2C->STAT;
+    r2 = LPC_I2C->DAT;
+    r3 = LPC_I2C->SCLH;
+    r4 = LPC_I2C->SCLL;
+    r5 = LPC_I2C->CONCLR;
+    r6 = LPC_I2C->MMCTRL;
+    r7 = LPC_I2C->DATA_BUFFER;
+
+    PRINTF("<Show I2C Registers>");
+    put_rn();
+    reg_print(SIZE8, r0);
+	put_spc(2);
+    PRINTF("CONSET");
+    PRINTF(imsg2);
+    put_rn();
+    reg_print(SIZE8, r1);
+	put_spc(2);
+    PRINTF("STAT");
+    PRINTF(imsg3);
+    put_rn();
+    reg_print(SIZE8, r2);
+    put_spc(2);
+    PRINTF("DAT");
+    PRINTF(imsg4);
+    put_rn();
+    put_spc(2);
+    PRINTF("ADR0--Not support");
+    put_rn();
+    reg_print(SIZE8, r3);
+    put_spc(2);
+    PRINTF("SCLH");
+    PRINTF(imsg2);
+    put_rn();
+    reg_print(SIZE8, r4);
+    put_spc(2);
+    PRINTF("SCLL");
+    PRINTF(imsg2);
+    put_rn();
+    reg_print(SIZE8, r5);
+    put_spc(2);
+    PRINTF("CONCLR");
+    PRINTF(imsg2);
+    put_rn();
+    reg_print(SIZE8, r6);
+    put_spc(2);
+    PRINTF("MMCTRL");
+    PRINTF(imsg2);
+    put_rn();
+    put_spc(2);
+    PRINTF("ADR1,2,3--Not support");
+    put_rn();
+    reg_print(SIZE8, r7);
+    put_spc(2);
+    PRINTF("DATA_BUFFER");
+    PRINTF(imsg7);
+    put_rn();
+    put_spc(2);
+    PRINTF("MASK0,1,2,3--Not support");
+    put_rn();
+}
+
+void i2c_freq (void){
+uint32_t r0,r1;
+
+    r0 = LPC_I2C->SCLH;
+    r1 = LPC_I2C->SCLL;	
+	get_freq();
+	PRINTF("<I2C Status>");
+	put_rn();
+	PRINTF("Freq. = I2CPCLK/(SCLH+SCLL) = %d/(%d+%d) = %d Hz",
+			SystemCoreClock, r0, r1, SystemCoreClock/(r0+r1));
+	put_rn();
+	r0 = LPC_I2C->CONSET;
+	PRINTF("I2C I/F ");
+	if ( r0 & 0x40 ) {
+		PRINTF("Enabled");
+	} else {
+		PRINTF("disabled");
+	}
+	put_rn();
+}
+#endif
+
+#if USE_MEM
+//  Range check for Memory dump
+static void check_range (MEMO * mem){
+uint8_t    i;
+uint32_t m;
+
+    mem->mflg = ERR_NOTHING;
+    for (i = 0 ; i < 5 ; i++) {
+        if (mem->mstr >= mem_range[i][0]) {
+            if (mem->mstr < mem_range[i][1]) {
+                m = mem->mstr + mem->msiz;
+                if (m < mem_range[i][1]) {
+                    return;            // no modification
+                } else {
+                    m = mem_range[i][1];
+                    mem->msiz = m - mem->mstr + 1;
+                    mem->mflg = ERR_MODIFY_SIZ;
+                    return;            // modified size
+                }
+            }
+        }
+    }
+    mem->mflg = ERR_OUT_OF_RANGE;
+    mem->mstr = 0;
+    mem->msiz = 0;
+    return ;
+}
+
+//  Memory dump error massage
+void error_print (unsigned char flg){
+    switch (flg) {
+        case ERR_MODIFY_SIZ :
+            put_r();
+            PRINTF("Reach to out of range ");
+            put_rn();
+            break;
+        case ERR_OUT_OF_RANGE :
+            put_r();
+            PRINTF("Not in a memory area ");
+            put_rn();
+            break;
+        case ERR_NOTHING :
+        default :
+            ;
+    }
+}
+
+//  Print memory contents
+void put_dump (const unsigned char *buff, unsigned long ofs, int cnt){
+int n;
+
+    PRINTF("%08lX ", ofs);
+    for(n = 0; n < cnt; n++) {	PRINTF(" %02X", buff[n]);    }
+    PUTC(' ');
+    for(n = 0; n < cnt; n++) {
+        if ((buff[n] < 0x20)||(buff[n] >= 0x7F)) {	PUTC('.');
+        } else {									PUTC(buff[n]);   }
+    }
+    put_rn();
+}
+
+// dump memory with error check
+void dump_w_err_ckeck (char **ptr, MEMO * mem){
+    check_range (mem);
+    for (*ptr=(char*)mem->mstr; mem->msiz >= 16; *ptr += 16, mem->msiz -= 16) {
+        put_r();
+        put_dump((unsigned char*)*ptr, (unsigned int)*ptr, 16);
+    }
+    if (mem->msiz) {	put_dump((unsigned char*)*ptr, (unsigned int)*ptr, mem->msiz);
+    }
+    error_print(mem->mflg);
+}
+
+static void mem_inf (char *ptr){
+    put_r();
+    PRINTF("Mem. Mode d <address> [<count>], s, <ret> or f, q, ?");
+    put_rn();
+    mem.mstr = mem_range[0][0];     // default start address = Flash
+    mem.msiz =256;
+    mem.mold = 0;
+    mem.mtmp = 0;
+    mem.mflg = 0;
+    for (; mem.mflg != 0xff;) {
+        PRINTF("m>");
+        ptr = linebuf;
+        get_line(ptr, buf_size);
+        put_r();                   
+        switch(*ptr++){
+            case 'd' :    // d <address> [<count>] - Dump memory
+                mem.mtmp = mem.mstr;
+                if (!xatoi(&ptr, &mem.mstr)) {
+                    mem.mstr = mem.mtmp;
+                }
+                if (!xatoi(&ptr, &mem.msiz)) {
+                    mem.msiz = 256;
+                }
+                mem.mtmp = mem.msiz;
+                dump_w_err_ckeck(&ptr, &mem);
+                mem.mold = mem.mstr;
+                mem.mstr += mem.mtmp;
+                break;
+            case 'f' :        // next
+            case 'n' :
+            case 0x0d :
+                mem.msiz = 256;
+                mem.mtmp = mem.msiz;
+                dump_w_err_ckeck(&ptr, &mem);
+                mem.mold = mem.mstr;
+                mem.mstr += 256;
+                break;
+            case 'q' :        // quit
+                mem.mflg = 0xff;
+                break;
+            case 'b' :        // Back to more
+                if (mem.mold == 0){
+                    ;
+                } else {
+                    mem.mold -= 256;
+                }
+            case 'k' :        // keep previous address
+                mem.mstr = mem.mold;
+                mem.msiz = 256;
+                mem.mtmp = mem.msiz;
+                dump_w_err_ckeck(&ptr, &mem);
+                mem.mstr += 256;
+                break;
+            case 'a' :        // start RAM top
+                mem.mstr = mem_range[1][0];
+                mem.msiz =256;
+                mem.mold = 0;
+                mem.mtmp = 0;
+                mem.mflg = 0;
+                dump_w_err_ckeck(&ptr, &mem);
+                mem.mstr += 256;
+                break;
+            case 'o' :        // start ROM top
+                mem.mstr = mem_range[0][0];
+                mem.msiz =256;
+                mem.mold = 0;
+                mem.mtmp = 0;
+                mem.mflg = 0;
+                dump_w_err_ckeck(&ptr, &mem);
+                mem.mstr += 256;
+                break;
+            case 's' :
+                PRINTF("Memory Configuration");
+                put_rn();
+                PRINTF("%s0x%08lx to 0x%08lx ", rmsg0, mem_range[0][0], mem_range[0][1]);
+                put_rn();
+                PRINTF("%s0x%08lx to 0x%08lx ", rmsg1, mem_range[1][0], mem_range[1][1]);
+                put_rn();
+                PRINTF("%s0x%08lx to 0x%08lx ", rmsg2, mem_range[2][0], mem_range[2][1]);
+                put_rn();
+                PRINTF("%s0x%08lx to 0x%08lx ", rmsg3, mem_range[3][0], mem_range[3][1]);
+                put_rn();
+                PRINTF("%s0x%08lx to 0x%08lx ", rmsg4, mem_range[4][0], mem_range[4][1]);
+                put_rn();
+                break;
+            case '?' :
+                PRINTF("d <address> [<count>] - Dump memory");
+                put_rn();
+                PRINTF("s  - Show memory structure ");
+                put_rn();
+                PRINTF("o  - Dump memory / start from ROM top");
+                put_rn();
+                PRINTF("a  - Dump memory / start from RAM top");
+                put_rn();
+                PRINTF("k  - Dump memory / keep same 256bytes");
+                put_rn();
+                PRINTF("b  - Dump memory / before 256bytes");
+                put_rn();
+                PRINTF("<RET> or f, n - Dump memory / next 256bytes");
+                put_rn();
+                PRINTF("q  - Exit memory mode");
+                put_rn();
+                break;
+            default:
+                PUTC('?');
+                put_rn();
+        }
+    }
+    PRINTF("Return to Normal Mode");
+}
+#endif      //USE_MEM
+
+#if USE_EEP
+static void mem_chk_msg (char mflg){
+	switch (mflg) {
+		case ERR_MODIFY_SIZ :
+			PRINTF(" Reached out of range");
+			put_rn();
+			break;
+		case ERR_OUT_OF_RANGE :
+			PRINTF(" Not in a memory area");
+			put_rn();
+			break;
+		case ERR_NOTHING :
+		default :
+			;
+	}
+}
+
+void put_eep_dump (
+	uint32_t addr,		// Heading address value
+	uint8_t len			// Number of items to be dumped
+){
+uint32_t i;
+uint8_t	eep[16];
+
+	PRINTF("%08lx ", addr);			// address
+	for (i = 0; i < len; i++) {		// Hexdecimal dump
+		eep[i] = xat24c1024.read(addr++);
+		PRINTF(" %02x", eep[i]);
+	}
+	PUTC(' ');
+	for (i = 0; i < len; i++){		// ASCII dump
+		PUTC((eep[i] >= ' ' && eep[i] <= '~') ? eep[i] : '.');
+	}
+	put_rn();
+}
+
+static void check_eeprange (MEMO * eepmem){
+uint32_t m;
+
+	m = sizeof(eepmem_range) / sizeof(*eepmem_range);
+	eepmem->mflg = ERR_NOTHING;
+	if (eepmem->mstr >= eepmem_range[0]){
+		if (eepmem->mstr < eepmem_range[1]){
+			m = eepmem->mstr + eepmem->msiz;
+			if (m < eepmem_range[1]){
+				return;			// no modification
+			} else {
+				m = eepmem_range[1];
+				eepmem->msiz = m - eepmem->mstr + 1;
+				eepmem->mflg = ERR_MODIFY_SIZ;
+				return;			// modified size
+			}
+		}
+	}
+	eepmem->mflg = ERR_OUT_OF_RANGE;
+	eepmem->mstr = 0;
+	eepmem->msiz = 0;
+	return ;
+}
+
+static void eepmem_inf (char *ptr){
+uint8_t	c, dt;
+unsigned long p1, p2, p3;
+
+	put_r();
+	PRINTF("Enter EEPROM 1) d <address> 256bytes, 2) s, 3) <ret>, 4) q 5) ?");
+	put_rn();
+	eepmem.mstr = eepmem_range[0];		// start head of table
+	eepmem.msiz =256;
+	eepmem.mold = 0;
+	eepmem.mtmp = 0;
+	eepmem.mflg = 0;
+	eepmem.mbhw = DW_CHAR;
+    for (; eepmem.mflg != 0xff;) {
+		PRINTF("e>");
+        ptr = linebuf;
+        get_line(ptr, buf_size);
+        put_r();                   
+        switch(*ptr++){
+			case 'd' :	// d <address> - Dump memory
+				eepmem.mtmp = eepmem.mstr;		// save defult start addres
+				if (!xatoi(&ptr, &eepmem.mstr)){
+					eepmem.mstr = eepmem.mtmp;	// recover defult address
+				}
+				eepmem.msiz = 256;
+				eepmem.msiz /= eepmem.mbhw;
+				eepmem.mtmp = eepmem.msiz * eepmem.mbhw;
+				check_eeprange (&eepmem);
+				for (ptr=(char*)eepmem.mstr;
+					 eepmem.msiz >= 16/eepmem.mbhw;
+					 ptr += 16, eepmem.msiz -= 16/eepmem.mbhw)
+				{
+					put_eep_dump((UINT)ptr, 16/eepmem.mbhw);
+				}
+				if (eepmem.msiz){
+					put_eep_dump((UINT)ptr, eepmem.msiz);
+				}
+				mem_chk_msg( eepmem.mflg );
+				eepmem.mold = eepmem.mstr;
+				eepmem.mstr += eepmem.mtmp;
+				break;
+            case 'f' :  // next
+            case 'n' :
+			case 0x0d :	// CR
+				eepmem.msiz = 256/eepmem.mbhw;
+				eepmem.mtmp = eepmem.msiz;
+				check_eeprange (&eepmem);
+				for (ptr=(char*)eepmem.mstr;
+					 eepmem.msiz >= 16/eepmem.mbhw;
+					 ptr += 16, eepmem.msiz -= 16/eepmem.mbhw)
+				{
+					put_eep_dump((UINT)ptr, 16/eepmem.mbhw);
+				}
+				mem_chk_msg(eepmem.mflg);
+				eepmem.mold = eepmem.mstr;
+				eepmem.mstr += 256;
+				break;
+			case 'q' :	// quit
+                eepmem.mflg = 0xff;
+                break;
+			case 'b' :	// Back to more
+                if (eepmem.mold == 0){
+                    ;
+                } else {
+                    eepmem.mold -= 256;
+                }
+            case 'k' :	// keep previous address
+				eepmem.mstr = eepmem.mold;
+				eepmem.msiz = 256/eepmem.mbhw;
+				eepmem.mtmp = eepmem.msiz;
+				check_eeprange (&eepmem);
+				for (ptr=(char*)eepmem.mstr; eepmem.msiz >= 16/eepmem.mbhw; ptr += 16,
+					eepmem.msiz -= 16/eepmem.mbhw){
+					put_eep_dump((UINT)ptr, 16/eepmem.mbhw);
+				}
+				mem_chk_msg(eepmem.mflg);
+				eepmem.mstr += 256;
+				break;
+			case 'e' :	// e <address> [<value> ...] - Edit memory
+				ptr = linebuf;
+        		get_line(ptr, buf_size);
+				p3 = DW_CHAR;
+				if (!xatoi(&ptr, &p1)){
+					PRINTF("? ->e <address> [<value> ...]");
+					put_rn();
+					break;	// Get start address
+				}
+				if (xatoi(&ptr, &p2)) { // 2nd parameter is given
+					do {
+						xat24c1024.write((uint16_t)p1, (uint8_t)p2);
+						wait(0.01);
+						dt = xat24c1024.read((uint16_t)p1);
+						if (dt != (uint8_t)p2){
+							PRINTF("?\r\n");
+						}
+						p1 += p3;
+					} while (xatoi(&ptr, &p2));	// Get next value
+					break;
+				}
+				for (;;) {// 2nd parameter is not given (interactive mode)
+					PRINTF("%08x 0x%02x-", p1, *(BYTE*)p1);
+					ptr = linebuf;
+	        		get_line(ptr, buf_size);
+					if (*ptr == '.'){ break;}
+					if (*ptr == 0x1b){ break;}
+					if ((BYTE)*ptr >= ' ') {
+						if (!xatoi(&ptr, &p2)){ continue;}
+						xat24c1024.write((uint16_t)p1, (uint8_t)p2);
+						wait(0.01);
+						dt = xat24c1024.read((uint16_t)p1);
+						if (dt != (uint8_t)p2){
+							PRINTF("?\r\n");
+						}
+					}
+					p1 += p3;
+				}
+				break;
+			case 's' :
+				PRINTF("AT24C1024B");
+				put_rn();
+				PRINTF("EEPROM  0x%08lx to 0x%08lx", eepmem_range[0], eepmem_range[1]);
+				put_rn();
+				break;
+			case '?' :
+				PRINTF("d <address> -Dump memory");
+				PRINTF(" (e.g. >d 0x10f00<RET>)");
+				put_rn();
+				PRINTF("e <address> [<value> ...] - Edit memory");
+				put_rn();
+				PRINTF("s -Show memory structure");
+				put_rn();
+				PRINTF("<RET>-Dump memory, next 256 bytes (also 'f','n')");
+				put_rn();
+				PRINTF("k -Dump memory, same as before 256 bytes ('b' -256)");
+				put_rn();
+				PRINTF("q -Exit EEPROM mode" );
+				put_rn();
+				break;
+			default:
+                PUTC('?');
+                put_rn();
+		}
+	}
+    PRINTF("Return to Normal Mode");
+}
+#endif
+
+//-----------------------------------------------------------------------------
+//  Monitor Main Program
+//-----------------------------------------------------------------------------
+int mon_hw (void) {
+char *ptr;
+
+	put_r();
+    PRINTF("%s [Help:'?' key]", mon_msg_hw);
+    put_rn();
+#if USE_SYS
+    get_freq();
+#endif      //USE_SYS
+    for (;;) {
+        put_r();
+        PUTC('>');
+        ptr = linebuf;
+        get_line(ptr, buf_size);
+        switch (*ptr++) {
+#if USE_MEM
+    //---------------------------------------------------------------------------------
+    //    Memory
+    //---------------------------------------------------------------------------------
+            case 'm' :
+				mem_inf(ptr);
+                put_rn();
+                break;
+#endif   // USE_MEM
+#if USE_EEP
+    //---------------------------------------------------------------------------------
+    //    EEPROM Memory
+    //---------------------------------------------------------------------------------
+		/*	EEPROM Memory														*/
+			case 'e' :
+				eepmem_inf(ptr);
+				put_rn();
+				break;
+#endif   // USE_EEP	
+#if USE_REG_SPI_UART
+    //--------------------------------------------------------------------------------------
+    //    Register
+    //--------------------------------------------------------------------------------------
+            case 'r' :
+uint8_t  r_flg;
+                put_r();
+                PRINTF("Reg. Mode p,u,i,s,t,a,d,l,w,c & ?");
+                put_rn();
+                r_flg = 0;
+                for (; r_flg != 0xff;) {
+                    PRINTF("r>");
+                    ptr = linebuf;
+                    get_line(ptr, sizeof(linebuf));
+        			put_r();
+                    switch(*ptr++){
+                        case 'p' :	
+	                    switch(*ptr++){
+	                        case '0' :
+                                io_config0(); 
+	                            break;
+	                        case '1' :
+                                io_config1();                      
+	                            break;
+	                        case '*' :
+                                io_config0(); 
+                                put_rn();
+                                io_config1(); 
+	                            break;
+	                        case '?' :
+	                        default:
+								PRINTF("Enter p0,p1 and p* for all");
+								put_rn();
+                            }
+                            break;; 
+                        case 'u' :
+                            uart_reg();
+                            break;
+                        //case 'i' :
+                        //    i2c_reg();
+                        //    break;
+                        case 's' :
+	                    switch(*ptr++){
+	                        case '0' :
+                                spi_reg(SPI_0);
+	                            break;
+	                        case '1' :
+                                spi_reg(SPI_1);                      
+	                            break;
+	                        case '*' :
+                                spi_reg(SPI_0);
+                                put_rn();
+                                spi_reg( SPI_1 );                        
+	                            break;
+	                        case '?' :
+	                        default:
+								PRINTF("Enter s0,s1 and s* for all");
+								put_rn();
+                            }
+                            break;
+                        case 't' :		// 
+                        	not_yet_impliment();                        
+                            break;                            
+                        case 'a' :		// 
+                        	not_yet_impliment();                        
+                            break;
+                        case 'd' :		// 
+                        	not_yet_impliment();                        
+                            break;
+                        case 'w' :		// 
+                        	not_yet_impliment();                       
+                            break;
+                        case 'l' :        //
+                        	not_yet_impliment();
+                            break;
+                        case 'c' :		// 
+                        	not_yet_impliment();                        
+                            break;
+                        case 'x' :		// 
+                        	not_yet_impliment();                        
+                            break;
+                        case 'y' :		// 
+                        	not_yet_impliment();                        
+                            break;
+                        case '?' :
+                            PRINTF("p - I/O Pin Config");
+                            put_rn();
+                            PRINTF("u - UART");
+                            put_rn();
+                            PRINTF("i - I2C -> separate command 'i'");
+                            put_rn();
+                            PRINTF("s - SPI");
+                            put_rn();
+                            PRINTF("t - TIMER");
+                            put_rn();
+                            PRINTF("a - ADC");
+                            put_rn();
+                            PRINTF("d - DAC");
+                            put_rn();
+                            PRINTF("l - LDC");
+                            put_rn();
+                            PRINTF("w - WWDG");
+                            put_rn();
+                            PRINTF("c - COMP");
+                            put_rn();
+                            break;
+                        case 'q' :        // quit
+                            r_flg = 0xff;
+                            break;
+                        default:
+                        	PUTC('?');
+                            put_rn();
+                    }
+                }
+				PRINTF("Return to Normal Mode");
+                put_rn();
+                break;            
+#endif   // USE_REG_SPI_UART
+#if USE_PORT
+    //---------------------------------------------------------------------------------
+    //    Port configration
+    //---------------------------------------------------------------------------------
+            case 'p' :    //
+            	put_r();
+                switch(*ptr++){
+                    case '0' :
+                        io_config0(); 
+                        break;
+                    case '1' :
+                        io_config1();                      
+                        break;
+                    case '*' :
+                        io_config0(); 
+                        put_rn();
+                        io_config1(); 
+                        break;
+                    case '?' :
+                    default:
+						PRINTF("Enter p0,p1 and p* for all");
+						put_rn();
+                }              
+                break;
+#endif	// USE_PORT
+#if USE_REG_I2C
+    //---------------------------------------------------------------------------------
+    //    I2C register
+    //---------------------------------------------------------------------------------
+            case 'i' :    // 
+                put_r();
+            	i2c_io_reg();
+                i2c_reg();
+                i2c_freq();               
+                break;
+#endif	// USE_REG_I2C
+#if USE_SYS
+    //---------------------------------------------------------------------------------
+    //    System
+    //---------------------------------------------------------------------------------
+            case 's' :    // System related information
+                switch (*ptr++) {
+                    case 'f' :    // sc - show system clock frequency
+                        get_freq_w_print();
+                        break;
+                    case 'c' :    // sc - show system CPU information
+                        cpu_inf();
+                        break;
+                    case '?' :
+                    default:
+                    	put_r();
+                        PRINTF("sc - System CPU information");
+                        put_rn();
+                        PRINTF("sf - System Clock");
+                        put_rn();
+                        break;
+                }
+                break;
+#endif   // USE_SYS
+    //---------------------------------------------------------------------------------
+    //    Help
+    //---------------------------------------------------------------------------------
+            case '?' :
+                put_r();
+                msg_hlp_hw();
+                break;
+    //---------------------------------------------------------------------------------
+    //    Return to main routine
+    //---------------------------------------------------------------------------------
+            case 'q' :        // Quit
+                PRINTF("\rReturn to monitor ");
+                return 0;
+    //---------------------------------------------------------------------------------
+    //    Special command for DEBUG
+    //---------------------------------------------------------------------------------
+#if DEBUG
+            case 'x' :
+				not_yet_impliment();
+                break;
+#endif
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mon_hw_config.h	Sun Jun 29 06:58:00 2014 +0000
@@ -0,0 +1,25 @@
+/*
+ * mbed Headder file for the mbed LPC1114FN28 
+ *
+ *  Copyright (c) 2014 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created: June       1st, 2014
+ *      Revised: June      29th, 2014
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+//  Definition ------------------------------------------------------------------------------------
+#define     DEBUG               0
+
+#define     USE_MEM             0
+#define     USE_REG_SPI_UART    0
+#define     USE_PORT            0
+#define     USE_REG_I2C         1
+#define     USE_SYS             1
+#define     USE_EEP             1