<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: RTC and Sub second Time in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433589#M25172</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Certainly if you look down that link to another thread you will see where one user certainly discovered that 'TPR rollover' did NOT 'instantly' increment the seconds.&amp;nbsp; On a more general note, such a 'very low power subsystem' is intentionally made with 'slow' logic, so the asynchronous count events COULD get 'caught' mid-rollover.&amp;nbsp; Now in my particular case 'always being right' was not important enough to look further into the details, and to whether these dual-reads (and near-rollover-test) are sufficient to guarantee monotonic time-values, as I only use them as console/log timestamps and a 'minor error' on one in a million is of NO consequence.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;See also:&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/message/362746"&gt;RTC counters behavior (seconds and prescaler registers)&lt;/A&gt; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 27 Oct 2015 19:31:50 GMT</pubDate>
    <dc:creator>egoodii</dc:creator>
    <dc:date>2015-10-27T19:31:50Z</dc:date>
    <item>
      <title>RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433586#M25169</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I would like to keep track of time to the millisecond. How can I do this on a K20? I would like the time to be accurate through low power modes down to VLLS2?&lt;/P&gt;&lt;P&gt;Any ideas ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Leif&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 27 Oct 2015 15:10:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433586#M25169</guid>
      <dc:creator>leifzars</dc:creator>
      <dc:date>2015-10-27T15:10:11Z</dc:date>
    </item>
    <item>
      <title>Re: RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433587#M25170</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;IF you don't use the 'adjustment' features of the RTC divider chains, so that you can ALWAYS assume 32768 counts per second, then the time-prescale-register (TPR) can get you what you want.&amp;nbsp; Here is my low-level-driver:&amp;nbsp; This code may not be 'perfect', in that I might not be allowing enough time between my dual-reads to account for how SLOW these ripple-counters update themselves...&lt;/P&gt;&lt;P&gt;void _rtc_get_time&lt;/P&gt;&lt;P&gt;(&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [OUT] this parameter gets actual RTC time */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TIME_STRUCT_PTR time&lt;/P&gt;&lt;P&gt;)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t read1, read2;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read1 = RTC_TSR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read2 = RTC_TSR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }while( read1 != read2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //insure the same read twice to avoid 'glitches'&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; time-&amp;gt;SECONDS = read1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read1 = RTC_TPR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read2 = RTC_TPR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }while( read1 != read2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //insure the same read twice to avoid 'glitches'&lt;/P&gt;&lt;P&gt;//Scale 32.768KHz to microseconds, but do the math within 32bits by leaving out 2^6&lt;/P&gt;&lt;P&gt;// 30.51758us per TPR count&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; time-&amp;gt;MICROSECONDS = (read1*(1000000UL/64)+16384/64)/(32768/64);&amp;nbsp;&amp;nbsp;&amp;nbsp; //Round crystal counts to microseconds&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( time-&amp;gt;MICROSECONDS &amp;lt; 100 ) //if prescaler just rolled over from zero, might have just incremented seconds -- refetch&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read1 = RTC_TSR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read2 = RTC_TSR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }while( read1 != read2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //insure the same read twice to avoid 'glitches'&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time-&amp;gt;SECONDS = read1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;See also:&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/message/534517"&gt;RTC seconds not updated properly&lt;/A&gt; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 27 Oct 2015 19:05:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433587#M25170</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2015-10-27T19:05:10Z</dc:date>
    </item>
    <item>
      <title>Re: RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433588#M25171</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Very good, thanks. I didn't understand the TPR register i guess, now i do.&lt;/P&gt;&lt;P&gt;Question why the double read? Is that documented by Freescale?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 27 Oct 2015 19:23:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433588#M25171</guid>
      <dc:creator>leifzars</dc:creator>
      <dc:date>2015-10-27T19:23:33Z</dc:date>
    </item>
    <item>
      <title>Re: RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433589#M25172</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Certainly if you look down that link to another thread you will see where one user certainly discovered that 'TPR rollover' did NOT 'instantly' increment the seconds.&amp;nbsp; On a more general note, such a 'very low power subsystem' is intentionally made with 'slow' logic, so the asynchronous count events COULD get 'caught' mid-rollover.&amp;nbsp; Now in my particular case 'always being right' was not important enough to look further into the details, and to whether these dual-reads (and near-rollover-test) are sufficient to guarantee monotonic time-values, as I only use them as console/log timestamps and a 'minor error' on one in a million is of NO consequence.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;See also:&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/message/362746"&gt;RTC counters behavior (seconds and prescaler registers)&lt;/A&gt; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 27 Oct 2015 19:31:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433589#M25172</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2015-10-27T19:31:50Z</dc:date>
    </item>
    <item>
      <title>Re: RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433590#M25173</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Okay, sounds good. Thanks for the knowledge.&lt;/P&gt;&lt;P&gt;I will implement it with the double read.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 27 Oct 2015 19:34:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433590#M25173</guid>
      <dc:creator>leifzars</dc:creator>
      <dc:date>2015-10-27T19:34:17Z</dc:date>
    </item>
    <item>
      <title>Re: RTC and Sub second Time</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433591#M25174</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This discussion has piqued my curiosity regarding time-read reliability and the desire for time to always 'move forward'.&amp;nbsp; I added this check:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;_rtc_get_time( &amp;amp;rtc_time );&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;if(&amp;nbsp; (rtc_time.SECONDS &amp;lt; rtc_time_last.SECONDS)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || ((rtc_time.SECONDS == rtc_time_last.SECONDS) &amp;amp;&amp;amp; (rtc_time.MICROSECONDS &amp;lt; rtc_time_last.MICROSECONDS)) )&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Os_LogDebug(OS_LOG_DEBUG_ERROR, "Time slip.&amp;nbsp; Old:%X.%X, New:%X.%X\n",&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtc_time_last.SECONDS,rtc_time_last.MICROSECONDS,rtc_time.SECONDS,rtc_time.MICROSECONDS);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;rtc_time_last.MICROSECONDS = rtc_time.MICROSECONDS;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;rtc_time_last.SECONDS = rtc_time.SECONDS;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;in my 'idle' loop [most of the time], so about 175,000 checks per second.&amp;nbsp; WITHOUT the protections of the above _rtc_get_time dual-reads and rollover-check, I got about 5 per second of these timestamped [HH:MM:SS.ms] prints showing TPR reads of 'inconsistent' contents due to increment-ripple-in-progress:&lt;/P&gt;&lt;P&gt;[09:12:33.653]&amp;nbsp; ERR: Time slip.&amp;nbsp; Old:56309181.9F9D2, New:56309181.9F808&lt;/P&gt;&lt;P&gt;[09:12:33.736]&amp;nbsp; ERR: Time slip.&amp;nbsp; Old:56309181.B3D1E, New:56309181.B3C48&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Turning back 'on' the dual-reads-check knocked them out, but left a few of these at 'TPR rollover' from 999,969us to zero:&lt;/P&gt;&lt;P&gt;[09:15:24.000]&amp;nbsp; ERR: Time slip.&amp;nbsp; Old:5630922B.F4221, New:5630922B.0&lt;/P&gt;&lt;P&gt;[09:15:26.000]&amp;nbsp; ERR: Time slip.&amp;nbsp; Old:5630922D.F4221, New:5630922D.0&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I re-enabled that rollover protection but at '&amp;lt;50us', I got one in 15minutes:&lt;/P&gt;&lt;P&gt;[09:33:27.000]&amp;nbsp; ERR: Time slip.&amp;nbsp; Old:56309666.F4221, New:56309666.3D&lt;/P&gt;&lt;P&gt;This indicates that one(or more) 'interrupt(s)' between the TSR reads and the TPR reads took LONG ENOUGH to make the &amp;lt;50us check 'fail' to protect from seconds rollover:&amp;nbsp; In this case TPR went from '-31us' to '+61us' AFTER we had already read TSR.&amp;nbsp; At the original '&amp;lt;100us' (as above) for the 'rollover time check' I don't expect I would have ever seen a fault, but THAT depends entirely on one's worst interrupt processing interval!&amp;nbsp; Mine is 70us.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I suggest that the entire _rtc_get_time routine should be run with interrupts disabled!&amp;nbsp; The routine only takes 1 to 1.5us at 100MHz.&amp;nbsp; Adding DisableInterrupts and EnableInterrupts around it, I've gotten NO fault in 6 hours!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 28 Oct 2015 18:12:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/RTC-and-Sub-second-Time/m-p/433591#M25174</guid>
      <dc:creator>egoodii</dc:creator>
      <dc:date>2015-10-28T18:12:36Z</dc:date>
    </item>
  </channel>
</rss>

