<?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>LPC MicrocontrollersのトピックLPC1549 SCT - two capture event interrupts do not work</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1549-SCT-two-capture-event-interrupts-do-not-work/m-p/688395#M27757</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am using the SCT1 to capture a signal on rising edge and on falling edge also. I set up 2 events&amp;nbsp;with interrupts&amp;nbsp;for this, and I want when it interrupts on rising edge&amp;nbsp;to reset the counter. At each interrupt either on rising edge&amp;nbsp;or on falling edge I want to read the counter, to have the duration between 2 rising edges and the duration between&amp;nbsp;1 rising edge and 1 falling edge (like a full period and a half period of the incoming signal).&lt;/P&gt;&lt;P&gt;But only the falling edge interrupt&amp;nbsp;works, the other does not.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here it is my code that does not work:&lt;/P&gt;&lt;P&gt;//The Setup Routine:&lt;/P&gt;&lt;P&gt;void SCT1_Setup(void)&lt;/P&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;/* Initialize */&lt;BR /&gt;Chip_SCT_Init (LPC_SCT1);&lt;BR /&gt;Chip_SCTPWM_Stop (LPC_SCT1);&lt;BR /&gt;Chip_SCT_Config(LPC_SCT1,&amp;nbsp;SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK | (1 &amp;lt;&amp;lt; 10));&lt;/DIV&gt;&lt;DIV&gt;/* SET EVENT0 FOR CAP0 (RISING EDGE), RESET TIMER ON INTERRUPT */&lt;BR /&gt;LPC_SCT1-&amp;gt;REGMODE = 0x01; //bit 0 = '1'&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[0].CTRL = (0 &amp;lt;&amp;lt; 5) | (1 &amp;lt;&amp;lt; 6) | (0x1 &amp;lt;&amp;lt; 10) | (0x2 &amp;lt;&amp;lt; 12);//(0x1 &amp;lt;&amp;lt; 10) | (0 &amp;lt;&amp;lt; 0)&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[0].STATE = 0x00000001;&lt;BR /&gt;LPC_SCT1-&amp;gt;LIMIT = 0x00000001;&lt;BR /&gt;LPC_INMUX-&amp;gt;SCT1_INMUX[1] = 0x10;&lt;BR /&gt;LPC_SCT1-&amp;gt;CAPCTRL[0].U = 0x1;&lt;BR /&gt;Chip_SCT_EnableEventInt(LPC_SCT1, SCT_EVT_0);&lt;/DIV&gt;&lt;DIV&gt;/* SET EVENT1 FOR CAP1 (FALLING EDGE, SAME INPUT) */&lt;BR /&gt;LPC_SCT1-&amp;gt;REGMODE = 0x02;&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[1].CTRL = (0 &amp;lt;&amp;lt; 5) | (1 &amp;lt;&amp;lt; 6) | (0x2 &amp;lt;&amp;lt; 10) | (0x2 &amp;lt;&amp;lt; 12);&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[1].STATE = 0x00000001;&lt;BR /&gt;LPC_SCT1-&amp;gt;CAPCTRL[1].U = 0x2;&lt;BR /&gt;Chip_SCT_EnableEventInt(LPC_SCT1, SCT_EVT_1);&lt;/DIV&gt;&lt;DIV&gt;/* Enable the interrupt for the SCT */&lt;BR /&gt;NVIC_EnableIRQ (SCT1_IRQn);&lt;BR /&gt;Chip_SCT_ClearControl(LPC_SCT1, SCT_CTRL_HALT_L);&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//Some global variables:&lt;/DIV&gt;&lt;DIV&gt;uint32_t varCounterFull = 0;&lt;BR /&gt;uint32_t varCounterHalf = 0;&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//The ISR Routine:&lt;/DIV&gt;&lt;DIV&gt;void SCT1_IRQHandler(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_0)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on rising edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterFull = (LPC_SCT1-&amp;gt;CAP[0].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;else if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_1)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on falling edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterHalf = (LPC_SCT1-&amp;gt;CAP[1].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;/////////////////////////////////////////////////////////////////////////////&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;If I change my code like to take out the line&lt;/DIV&gt;&lt;DIV&gt;LPC_SCT1-&amp;gt;LIMIT = 0x00000001;&lt;/DIV&gt;&lt;DIV&gt;from SCT1_Setup(), and re-write the ISR like that:&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//The ISR Routine:&lt;/DIV&gt;&lt;DIV&gt;void SCT1_IRQHandler(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_0)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on rising edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterFull = (LPC_SCT1-&amp;gt;COUNT_U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCTPWM_Stop (LPC_SCT1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearControl(LPC_SCT1, SCT_CTRL_HALT_L);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;else if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_1)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on falling edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterHalf = (LPC_SCT1-&amp;gt;CAP[1].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;it works.&lt;/DIV&gt;&lt;DIV&gt;But I think it should work with re-setting the counter automatically&amp;nbsp;at EVENT0, and I do not understand why it does not work. If I stop and restart the counter inside the ISR it is not a solution, and it takes time.&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;I would really appreciate any help!&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;Thank you,&lt;/DIV&gt;&lt;DIV&gt;Doini&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 07 Jul 2017 22:20:30 GMT</pubDate>
    <dc:creator>doini</dc:creator>
    <dc:date>2017-07-07T22:20:30Z</dc:date>
    <item>
      <title>LPC1549 SCT - two capture event interrupts do not work</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1549-SCT-two-capture-event-interrupts-do-not-work/m-p/688395#M27757</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am using the SCT1 to capture a signal on rising edge and on falling edge also. I set up 2 events&amp;nbsp;with interrupts&amp;nbsp;for this, and I want when it interrupts on rising edge&amp;nbsp;to reset the counter. At each interrupt either on rising edge&amp;nbsp;or on falling edge I want to read the counter, to have the duration between 2 rising edges and the duration between&amp;nbsp;1 rising edge and 1 falling edge (like a full period and a half period of the incoming signal).&lt;/P&gt;&lt;P&gt;But only the falling edge interrupt&amp;nbsp;works, the other does not.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here it is my code that does not work:&lt;/P&gt;&lt;P&gt;//The Setup Routine:&lt;/P&gt;&lt;P&gt;void SCT1_Setup(void)&lt;/P&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;/* Initialize */&lt;BR /&gt;Chip_SCT_Init (LPC_SCT1);&lt;BR /&gt;Chip_SCTPWM_Stop (LPC_SCT1);&lt;BR /&gt;Chip_SCT_Config(LPC_SCT1,&amp;nbsp;SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK | (1 &amp;lt;&amp;lt; 10));&lt;/DIV&gt;&lt;DIV&gt;/* SET EVENT0 FOR CAP0 (RISING EDGE), RESET TIMER ON INTERRUPT */&lt;BR /&gt;LPC_SCT1-&amp;gt;REGMODE = 0x01; //bit 0 = '1'&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[0].CTRL = (0 &amp;lt;&amp;lt; 5) | (1 &amp;lt;&amp;lt; 6) | (0x1 &amp;lt;&amp;lt; 10) | (0x2 &amp;lt;&amp;lt; 12);//(0x1 &amp;lt;&amp;lt; 10) | (0 &amp;lt;&amp;lt; 0)&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[0].STATE = 0x00000001;&lt;BR /&gt;LPC_SCT1-&amp;gt;LIMIT = 0x00000001;&lt;BR /&gt;LPC_INMUX-&amp;gt;SCT1_INMUX[1] = 0x10;&lt;BR /&gt;LPC_SCT1-&amp;gt;CAPCTRL[0].U = 0x1;&lt;BR /&gt;Chip_SCT_EnableEventInt(LPC_SCT1, SCT_EVT_0);&lt;/DIV&gt;&lt;DIV&gt;/* SET EVENT1 FOR CAP1 (FALLING EDGE, SAME INPUT) */&lt;BR /&gt;LPC_SCT1-&amp;gt;REGMODE = 0x02;&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[1].CTRL = (0 &amp;lt;&amp;lt; 5) | (1 &amp;lt;&amp;lt; 6) | (0x2 &amp;lt;&amp;lt; 10) | (0x2 &amp;lt;&amp;lt; 12);&lt;BR /&gt;LPC_SCT1-&amp;gt;EVENT[1].STATE = 0x00000001;&lt;BR /&gt;LPC_SCT1-&amp;gt;CAPCTRL[1].U = 0x2;&lt;BR /&gt;Chip_SCT_EnableEventInt(LPC_SCT1, SCT_EVT_1);&lt;/DIV&gt;&lt;DIV&gt;/* Enable the interrupt for the SCT */&lt;BR /&gt;NVIC_EnableIRQ (SCT1_IRQn);&lt;BR /&gt;Chip_SCT_ClearControl(LPC_SCT1, SCT_CTRL_HALT_L);&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//Some global variables:&lt;/DIV&gt;&lt;DIV&gt;uint32_t varCounterFull = 0;&lt;BR /&gt;uint32_t varCounterHalf = 0;&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//The ISR Routine:&lt;/DIV&gt;&lt;DIV&gt;void SCT1_IRQHandler(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_0)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on rising edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterFull = (LPC_SCT1-&amp;gt;CAP[0].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;else if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_1)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on falling edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterHalf = (LPC_SCT1-&amp;gt;CAP[1].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;/////////////////////////////////////////////////////////////////////////////&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;If I change my code like to take out the line&lt;/DIV&gt;&lt;DIV&gt;LPC_SCT1-&amp;gt;LIMIT = 0x00000001;&lt;/DIV&gt;&lt;DIV&gt;from SCT1_Setup(), and re-write the ISR like that:&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;//The ISR Routine:&lt;/DIV&gt;&lt;DIV&gt;void SCT1_IRQHandler(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_0)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on rising edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterFull = (LPC_SCT1-&amp;gt;COUNT_U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCTPWM_Stop (LPC_SCT1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearControl(LPC_SCT1, SCT_CTRL_HALT_L);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;else if (LPC_SCT1-&amp;gt;EVFLAG &amp;amp; SCT_EVT_1)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if interrupt on falling edge&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_SCT_ClearEventFlag(LPC_SCT1, SCT_EVT_1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; varCounterHalf = (LPC_SCT1-&amp;gt;CAP[1].U);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;it works.&lt;/DIV&gt;&lt;DIV&gt;But I think it should work with re-setting the counter automatically&amp;nbsp;at EVENT0, and I do not understand why it does not work. If I stop and restart the counter inside the ISR it is not a solution, and it takes time.&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;I would really appreciate any help!&lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt;Thank you,&lt;/DIV&gt;&lt;DIV&gt;Doini&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 07 Jul 2017 22:20:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1549-SCT-two-capture-event-interrupts-do-not-work/m-p/688395#M27757</guid>
      <dc:creator>doini</dc:creator>
      <dc:date>2017-07-07T22:20:30Z</dc:date>
    </item>
  </channel>
</rss>

