<?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 MC9S08DZ16 Timer Overflow interrupt in 8-bit Microcontrollers</title>
    <link>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669029#M22393</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using S08DZ16 microcontroller, and i'm trying to use timer overflow interrupt to get time a measuring function.&lt;/P&gt;&lt;P&gt;I've problems to get the correct number of overflows.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer initialization:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;#define TPM1_MOD_VALUE&lt;SPAN&gt; &lt;/SPAN&gt;(1000U)&lt;SPAN&gt; &lt;/SPAN&gt;///&amp;lt; TPM1 Module value used to get 1ms period.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Module Counter @1MHz, Period value 1ms&lt;BR /&gt; &lt;BR /&gt; /* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */&lt;BR /&gt; TPM1SC = 0x00; // Stop and reset counter&lt;BR /&gt; TPM1MOD = &lt;SPAN style="background-color: #f6f6f6;"&gt;TPM1_MOD_VALUE&lt;/SPAN&gt;&lt;SPAN style="background-color: #f6f6f6;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;; // Period value setting&lt;BR /&gt; (void)(TPM1SC == 0); // Overflow int. flag clearing (first part)&lt;BR /&gt; /* TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=1,PS0=1 */&lt;BR /&gt; TPM1SC = 0x4B; // Int. flag clearing (2nd part) and timer control register setting&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer start function:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;void ResetTimer( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_TPM1OFCtr = 0;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_StartTimer = TPM1CNT; &lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer get function:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;UINT GetTimer( void )&lt;BR /&gt;{ &lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;return (m_TPM1OFCtr *&amp;nbsp;&lt;SPAN style="background-color: #f6f6f6;"&gt;TPM1_MOD_VALUE&lt;/SPAN&gt;&lt;SPAN style="background-color: #f6f6f6;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;+ TPM1CNT - m_StartTimer);&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IRQ for timer overflow:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;INTERRUPT TPM1Overflow( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;(void) TPM1SC; &lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;TPM1SC_TOF = 0; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Increment overflow counter&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_TPM1OFCtr++; &lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In particular sometimes happens that the number of overflow is 1 less or 1 more than expected.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 13 Jul 2017 13:07:05 GMT</pubDate>
    <dc:creator>ecorini</dc:creator>
    <dc:date>2017-07-13T13:07:05Z</dc:date>
    <item>
      <title>MC9S08DZ16 Timer Overflow interrupt</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669029#M22393</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm using S08DZ16 microcontroller, and i'm trying to use timer overflow interrupt to get time a measuring function.&lt;/P&gt;&lt;P&gt;I've problems to get the correct number of overflows.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer initialization:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;#define TPM1_MOD_VALUE&lt;SPAN&gt; &lt;/SPAN&gt;(1000U)&lt;SPAN&gt; &lt;/SPAN&gt;///&amp;lt; TPM1 Module value used to get 1ms period.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Module Counter @1MHz, Period value 1ms&lt;BR /&gt; &lt;BR /&gt; /* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */&lt;BR /&gt; TPM1SC = 0x00; // Stop and reset counter&lt;BR /&gt; TPM1MOD = &lt;SPAN style="background-color: #f6f6f6;"&gt;TPM1_MOD_VALUE&lt;/SPAN&gt;&lt;SPAN style="background-color: #f6f6f6;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;; // Period value setting&lt;BR /&gt; (void)(TPM1SC == 0); // Overflow int. flag clearing (first part)&lt;BR /&gt; /* TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=1,PS0=1 */&lt;BR /&gt; TPM1SC = 0x4B; // Int. flag clearing (2nd part) and timer control register setting&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer start function:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;void ResetTimer( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_TPM1OFCtr = 0;&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_StartTimer = TPM1CNT; &lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Timer get function:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;UINT GetTimer( void )&lt;BR /&gt;{ &lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;return (m_TPM1OFCtr *&amp;nbsp;&lt;SPAN style="background-color: #f6f6f6;"&gt;TPM1_MOD_VALUE&lt;/SPAN&gt;&lt;SPAN style="background-color: #f6f6f6;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;+ TPM1CNT - m_StartTimer);&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IRQ for timer overflow:&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;INTERRUPT TPM1Overflow( void )&lt;BR /&gt;{&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;(void) TPM1SC; &lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;TPM1SC_TOF = 0; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Increment overflow counter&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;m_TPM1OFCtr++; &lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In particular sometimes happens that the number of overflow is 1 less or 1 more than expected.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 13 Jul 2017 13:07:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669029#M22393</guid>
      <dc:creator>ecorini</dc:creator>
      <dc:date>2017-07-13T13:07:05Z</dc:date>
    </item>
    <item>
      <title>Re: MC9S08DZ16 Timer Overflow interrupt</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669030#M22394</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The problem is you need some synchronization between overflow ISR and reading TPM1CNT.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There is nice old HC11 reference manual, which explains how to "sync" your time measurements with timer overflow, with few asm examples &lt;A href="http://www.nxp.com/docs/en/reference-manual/M68HC11RM.pdf"&gt;http://www.nxp.com/docs/en/reference-manual/M68HC11RM.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Didn't verify it, but you need something like this&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;UINT GetTimer( void )&lt;BR /&gt;{ &lt;BR /&gt;UINT tcnt;&lt;BR /&gt;UINT ovcnt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;__asm("SEI");&lt;BR /&gt;&amp;nbsp;tcnt = TPM1CNT; // capture CNT once!&lt;/P&gt;&lt;P&gt;&amp;nbsp;ovcnt = m_TPM1OFCtr;&lt;/P&gt;&lt;P&gt;&amp;nbsp;// increment ovcnt if 1) TOF is set and &lt;BR /&gt;&amp;nbsp;// 2) sampled TPM1CNT was closer to previous overflow than to next overflow&lt;BR /&gt;&amp;nbsp;if( TPM1SC_TOF &amp;amp;&amp;amp; (tcnt &amp;lt; TPM1_MOD_VALUE / 2u))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;ovcnt ++;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;__asm("CLI");&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (ovcnt * TPM1_MOD_VALUE + tcnt - m_StartTimer);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void ResetTimer( void )&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;__asm("SEI");&lt;BR /&gt;&amp;nbsp;m_TPM1OFCtr = 0;&lt;BR /&gt;&amp;nbsp;m_StartTimer = TPM1CNT;&lt;/P&gt;&lt;P&gt;&amp;nbsp;// decrement ovcnt if 1) TOF is set and &lt;BR /&gt;&amp;nbsp;// 2) sampled TPM1CNT was closer to previous overflow than to next overflow&lt;BR /&gt;&amp;nbsp;if( TPM1SC_TOF &amp;amp;&amp;amp; m_StartTimer &amp;lt; TPM1_MOD_VALUE / 2u)) // (m_StartTimer should be unsigned)&lt;BR /&gt;&amp;nbsp; m_TPM1OFCtr --;&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;__asm("CLI"); &lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Unless TPM1 is used for PWM, you should keep TPM_MOD_VALUE at its max, lowering interrupt rate. For timer duration &amp;lt;= 2 ^ 16 you wouldn't need timer overflow at all. For longer durations you need to switch to&amp;nbsp;wider integer than UINT anyway&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regarding if(m_StartTimer &amp;lt; TPM1_MOD_VALUE / 2u)&amp;nbsp;&amp;nbsp;16 bit compare. For mod value /2 =&amp;nbsp;500, you can test&amp;nbsp;against close value 2 ^ 9 = 512.&amp;nbsp; &amp;nbsp;if( (m_StartTimer &amp;amp; 512) == 0 ) may&amp;nbsp;be faster, at least with some compiler switches&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Edward&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 14 Jul 2017 18:07:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669030#M22394</guid>
      <dc:creator>kef2</dc:creator>
      <dc:date>2017-07-14T18:07:16Z</dc:date>
    </item>
    <item>
      <title>Re: MC9S08DZ16 Timer Overflow interrupt</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669031#M22395</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;As you said i have to block&amp;nbsp;&lt;SPAN style="color: #51626f; background-color: #ffffff;"&gt;TPM_MOD_VALUE&lt;SPAN&gt;&amp;nbsp;to use TPM1 for PWM.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #51626f; background-color: #ffffff;"&gt;&lt;SPAN&gt;Thanky you for your response.&amp;nbsp;timer overflow "sync" works.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #51626f; background-color: #ffffff;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Jul 2017 07:45:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/MC9S08DZ16-Timer-Overflow-interrupt/m-p/669031#M22395</guid>
      <dc:creator>ecorini</dc:creator>
      <dc:date>2017-07-20T07:45:18Z</dc:date>
    </item>
  </channel>
</rss>

