Demo code for PCF2127 (and PCF2129) library. Setting of time and displaying can be done on PC-terminal application through the USB Serial Port. PCF2127 and PCF2129 are high accuracy real-time-clock (RTC) module. This library provides simple interface to accessing clock information.
Demo code for PCF2127 library
Information
The "PCF2127" library works for PCF2127T, PCF2127AT, PCF2129T and PCF2129AT.
The device information is available on the component page and the library page.
PCF2127T is in SO16 package
main.cpp@2:47151300f95a, 2014-12-10 (annotated)
- Committer:
- nxp_ip
- Date:
- Wed Dec 10 02:08:15 2014 +0000
- Revision:
- 2:47151300f95a
- Parent:
- 1:86dc8dfe6a20
version to include latest library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nxp_ip | 0:658f351580f0 | 1 | /* |
nxp_ip | 0:658f351580f0 | 2 | * A sample code for PCF2127 library |
nxp_ip | 0:658f351580f0 | 3 | * |
nxp_ip | 0:658f351580f0 | 4 | * @author Akifumi (Tedd) OKANO, NXP Semiconductors |
nxp_ip | 2:47151300f95a | 5 | * @version 1.8 |
nxp_ip | 1:86dc8dfe6a20 | 6 | * @date 10-Dec-2014 |
nxp_ip | 0:658f351580f0 | 7 | * |
nxp_ip | 0:658f351580f0 | 8 | * PCF2127 is a "real time clock (RTC)" module which is including a Xtal and TCXO |
nxp_ip | 0:658f351580f0 | 9 | * http://www.nxp.com/products/interface_and_connectivity/real_time_clocks/rtcs_with_temp_compensation/series/PCF2127.html |
nxp_ip | 0:658f351580f0 | 10 | * |
nxp_ip | 0:658f351580f0 | 11 | * RTC initializing part is ported from.. |
nxp_ip | 0:658f351580f0 | 12 | * http://mbed.org/users/roen/notebook/real-time/ |
nxp_ip | 0:658f351580f0 | 13 | * |
nxp_ip | 0:658f351580f0 | 14 | * This code is refined version of.. |
nxp_ip | 0:658f351580f0 | 15 | * http://developer.mbed.org/users/okano/code/NXP_PCF2127A/ |
nxp_ip | 0:658f351580f0 | 16 | */ |
nxp_ip | 0:658f351580f0 | 17 | |
nxp_ip | 0:658f351580f0 | 18 | #include "mbed.h" |
nxp_ip | 0:658f351580f0 | 19 | #include "PCF2127.h" |
nxp_ip | 0:658f351580f0 | 20 | |
nxp_ip | 0:658f351580f0 | 21 | PCF2127 rtc( p28, p27 ); |
nxp_ip | 0:658f351580f0 | 22 | |
nxp_ip | 0:658f351580f0 | 23 | void show_time( void ); |
nxp_ip | 0:658f351580f0 | 24 | void set_time( void ); |
nxp_ip | 0:658f351580f0 | 25 | |
nxp_ip | 1:86dc8dfe6a20 | 26 | void RAM_dump( void ); // for PCF2127 only |
nxp_ip | 1:86dc8dfe6a20 | 27 | void RAM_read_test( void ); // for PCF2127 only |
nxp_ip | 1:86dc8dfe6a20 | 28 | void RAM_write_test( void ); // for PCF2127 only |
nxp_ip | 1:86dc8dfe6a20 | 29 | void RAM_test( int last_RAM_content_invalid ); // for PCF2127 only |
nxp_ip | 1:86dc8dfe6a20 | 30 | |
nxp_ip | 0:658f351580f0 | 31 | int main() |
nxp_ip | 0:658f351580f0 | 32 | { |
nxp_ip | 0:658f351580f0 | 33 | printf( "PCF2127 demo started.\r\n" ); |
nxp_ip | 0:658f351580f0 | 34 | |
nxp_ip | 1:86dc8dfe6a20 | 35 | int clock_integrity_fail = rtc.is_init_required(); |
nxp_ip | 1:86dc8dfe6a20 | 36 | |
nxp_ip | 1:86dc8dfe6a20 | 37 | if ( clock_integrity_fail ) { |
nxp_ip | 0:658f351580f0 | 38 | set_time(); |
nxp_ip | 0:658f351580f0 | 39 | } |
nxp_ip | 0:658f351580f0 | 40 | |
nxp_ip | 1:86dc8dfe6a20 | 41 | /* |
nxp_ip | 1:86dc8dfe6a20 | 42 | * Next line can be enabled when using PCF2127 only |
nxp_ip | 1:86dc8dfe6a20 | 43 | */ |
nxp_ip | 1:86dc8dfe6a20 | 44 | //RAM_test( clock_integrity_fail ); |
nxp_ip | 1:86dc8dfe6a20 | 45 | |
nxp_ip | 0:658f351580f0 | 46 | while ( 1 ) { |
nxp_ip | 0:658f351580f0 | 47 | show_time(); |
nxp_ip | 0:658f351580f0 | 48 | wait( 0.25 ); |
nxp_ip | 0:658f351580f0 | 49 | } |
nxp_ip | 0:658f351580f0 | 50 | } |
nxp_ip | 0:658f351580f0 | 51 | |
nxp_ip | 0:658f351580f0 | 52 | void show_time( void ) |
nxp_ip | 0:658f351580f0 | 53 | { |
nxp_ip | 0:658f351580f0 | 54 | struct tm dt, *dtp; |
nxp_ip | 0:658f351580f0 | 55 | time_t t; |
nxp_ip | 0:658f351580f0 | 56 | char s[ 30 ]; |
nxp_ip | 1:86dc8dfe6a20 | 57 | |
nxp_ip | 0:658f351580f0 | 58 | dtp = &dt; |
nxp_ip | 0:658f351580f0 | 59 | |
nxp_ip | 0:658f351580f0 | 60 | rtc.clear_intr(); |
nxp_ip | 0:658f351580f0 | 61 | |
nxp_ip | 0:658f351580f0 | 62 | // get time information from PCF2127 |
nxp_ip | 1:86dc8dfe6a20 | 63 | if ( PCF2127::TIME_FUNC_ERROR == (t = rtc.time( NULL )) ) { |
nxp_ip | 0:658f351580f0 | 64 | printf( "error at reading time\r\n" ); |
nxp_ip | 0:658f351580f0 | 65 | return; |
nxp_ip | 0:658f351580f0 | 66 | } |
nxp_ip | 1:86dc8dfe6a20 | 67 | |
nxp_ip | 0:658f351580f0 | 68 | dtp = localtime( &t ); |
nxp_ip | 0:658f351580f0 | 69 | |
nxp_ip | 0:658f351580f0 | 70 | // print time and date on terminal |
nxp_ip | 0:658f351580f0 | 71 | strftime( s, 30, "%H:%M:%S, %Y/%b/%d %a", dtp ); |
nxp_ip | 0:658f351580f0 | 72 | printf( "%s\r\n", s ); |
nxp_ip | 0:658f351580f0 | 73 | } |
nxp_ip | 0:658f351580f0 | 74 | |
nxp_ip | 0:658f351580f0 | 75 | void set_time( void ) |
nxp_ip | 0:658f351580f0 | 76 | { |
nxp_ip | 0:658f351580f0 | 77 | #define MAX_CHAR_LENGTH 21 |
nxp_ip | 0:658f351580f0 | 78 | char s[ MAX_CHAR_LENGTH ]; |
nxp_ip | 0:658f351580f0 | 79 | |
nxp_ip | 0:658f351580f0 | 80 | printf( "Enter current date and time:\r\n" ); |
nxp_ip | 0:658f351580f0 | 81 | printf( "YYYY MM DD HH MM SS[enter]\r\n" ); |
nxp_ip | 0:658f351580f0 | 82 | |
nxp_ip | 0:658f351580f0 | 83 | fgets( s, MAX_CHAR_LENGTH, stdin ); |
nxp_ip | 0:658f351580f0 | 84 | printf( "user input: \"%s\"\r\n", s ); |
nxp_ip | 0:658f351580f0 | 85 | |
nxp_ip | 0:658f351580f0 | 86 | rtc.set_time( s ); |
nxp_ip | 0:658f351580f0 | 87 | } |
nxp_ip | 1:86dc8dfe6a20 | 88 | |
nxp_ip | 1:86dc8dfe6a20 | 89 | void RAM_function_test( void ) |
nxp_ip | 1:86dc8dfe6a20 | 90 | { |
nxp_ip | 1:86dc8dfe6a20 | 91 | } |
nxp_ip | 1:86dc8dfe6a20 | 92 | |
nxp_ip | 1:86dc8dfe6a20 | 93 | void RAM_dump( void ) |
nxp_ip | 1:86dc8dfe6a20 | 94 | { |
nxp_ip | 1:86dc8dfe6a20 | 95 | char b[ 512 ]; |
nxp_ip | 1:86dc8dfe6a20 | 96 | |
nxp_ip | 1:86dc8dfe6a20 | 97 | if ( rtc.RAM_read( 0, b, 512 ) ) { |
nxp_ip | 1:86dc8dfe6a20 | 98 | printf( "error at reading RAM\r\n" ); |
nxp_ip | 1:86dc8dfe6a20 | 99 | } |
nxp_ip | 1:86dc8dfe6a20 | 100 | |
nxp_ip | 1:86dc8dfe6a20 | 101 | for ( int i = 0; i < 512; i++ ) { |
nxp_ip | 1:86dc8dfe6a20 | 102 | if ( !(i % 16) ) { |
nxp_ip | 1:86dc8dfe6a20 | 103 | printf( "\r\n 0x%03X(%03d): 0x", i, i ); |
nxp_ip | 1:86dc8dfe6a20 | 104 | } |
nxp_ip | 1:86dc8dfe6a20 | 105 | printf( " %02X", b[ i ] ); |
nxp_ip | 1:86dc8dfe6a20 | 106 | } |
nxp_ip | 1:86dc8dfe6a20 | 107 | } |
nxp_ip | 1:86dc8dfe6a20 | 108 | |
nxp_ip | 1:86dc8dfe6a20 | 109 | const char *texts[] = { |
nxp_ip | 1:86dc8dfe6a20 | 110 | "Love the life you live. Live the life you love.", |
nxp_ip | 1:86dc8dfe6a20 | 111 | "It always seems impossible until it's done.", |
nxp_ip | 1:86dc8dfe6a20 | 112 | "You'll never find a rainbow if you're looking down.", |
nxp_ip | 1:86dc8dfe6a20 | 113 | "There is always light behind the clouds." |
nxp_ip | 1:86dc8dfe6a20 | 114 | }; |
nxp_ip | 1:86dc8dfe6a20 | 115 | |
nxp_ip | 1:86dc8dfe6a20 | 116 | void RAM_test( int last_RAM_content_invalid ) |
nxp_ip | 1:86dc8dfe6a20 | 117 | { |
nxp_ip | 1:86dc8dfe6a20 | 118 | char txt[ 64 ]; |
nxp_ip | 1:86dc8dfe6a20 | 119 | time_t t; |
nxp_ip | 1:86dc8dfe6a20 | 120 | |
nxp_ip | 1:86dc8dfe6a20 | 121 | if ( !last_RAM_content_invalid ) { |
nxp_ip | 1:86dc8dfe6a20 | 122 | rtc.RAM_read( 0, (char *)&t, sizeof( t ) ); |
nxp_ip | 1:86dc8dfe6a20 | 123 | rtc.RAM_read( 16, txt, sizeof( txt ) ); |
nxp_ip | 1:86dc8dfe6a20 | 124 | printf( "RAM test read\r\n" ); |
nxp_ip | 1:86dc8dfe6a20 | 125 | printf( " last program start was on %s\r", ctime( &t ) ); |
nxp_ip | 1:86dc8dfe6a20 | 126 | printf( " last saved text was \"%s\"\r\n", txt ); |
nxp_ip | 1:86dc8dfe6a20 | 127 | } |
nxp_ip | 1:86dc8dfe6a20 | 128 | |
nxp_ip | 1:86dc8dfe6a20 | 129 | t = rtc.time( NULL ); |
nxp_ip | 1:86dc8dfe6a20 | 130 | rtc.RAM_write( 0, (char *)&t, sizeof( t ) ); |
nxp_ip | 1:86dc8dfe6a20 | 131 | rtc.RAM_write( 16, (char *)texts[ t % 4 ], strlen( texts[ t % 4 ] ) + 1 ); |
nxp_ip | 1:86dc8dfe6a20 | 132 | } |
nxp_ip | 1:86dc8dfe6a20 | 133 |