<?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>S12 / MagniV MicrocontrollersのトピックAbout data type converting (tFrac16 -&amp;gt; float(maybe) -&amp;gt; tFrac16) in AN5201SW application SW</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717487#M14786</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;My codewarrior version is 10.6 and studying about AN5201SW now.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In my application, I&amp;nbsp;want to calculate (tFrac16 type&amp;nbsp;value * 3.2767) and get result again&amp;nbsp;in tFrac16 type.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;tFrac16 type&amp;nbsp;value is between 0 and 10,000, so I expect that it does not exceed the express range of result_value.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How can I do this? please give me a hand.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For additional explanation(in AN5201SW)&lt;/P&gt;&lt;P&gt;I want to calculate&amp;nbsp; ((tFrac16)requiredSpeed * (float)3.2767&amp;nbsp; = (tFrac16)RESULT_VALUE) in "AppRun" step.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;"SWLIBS_Typedefs.h"&lt;/P&gt;&lt;P&gt;typedef unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 8-bit integer type */&lt;BR /&gt;typedef signed char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 8-bit integer type */&lt;BR /&gt;typedef unsigned short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 16-bit integer type */&lt;BR /&gt;typedef signed short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 16-bit integer type */&lt;BR /&gt;typedef unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 32-bit integer type */&lt;BR /&gt;typedef signed long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 32-bit integer type */&lt;BR /&gt;typedef signed long long&amp;nbsp;&amp;nbsp;&amp;nbsp; tS64;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 64-bit integer type */&lt;BR /&gt;typedef tS16&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;&amp;nbsp; tFrac16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; 16-bit signed fractional Q1.15 type */&lt;BR /&gt;typedef tS32&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;&amp;nbsp; tFrac32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; 32-bit Q1.31 type */&lt;BR /&gt;typedef float&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; tFloat;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; single precision float type */&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 05 Feb 2018 05:25:07 GMT</pubDate>
    <dc:creator>subinkim</dc:creator>
    <dc:date>2018-02-05T05:25:07Z</dc:date>
    <item>
      <title>About data type converting (tFrac16 -&gt; float(maybe) -&gt; tFrac16) in AN5201SW application SW</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717487#M14786</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;My codewarrior version is 10.6 and studying about AN5201SW now.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In my application, I&amp;nbsp;want to calculate (tFrac16 type&amp;nbsp;value * 3.2767) and get result again&amp;nbsp;in tFrac16 type.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;tFrac16 type&amp;nbsp;value is between 0 and 10,000, so I expect that it does not exceed the express range of result_value.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How can I do this? please give me a hand.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For additional explanation(in AN5201SW)&lt;/P&gt;&lt;P&gt;I want to calculate&amp;nbsp; ((tFrac16)requiredSpeed * (float)3.2767&amp;nbsp; = (tFrac16)RESULT_VALUE) in "AppRun" step.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;"SWLIBS_Typedefs.h"&lt;/P&gt;&lt;P&gt;typedef unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 8-bit integer type */&lt;BR /&gt;typedef signed char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS8;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 8-bit integer type */&lt;BR /&gt;typedef unsigned short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 16-bit integer type */&lt;BR /&gt;typedef signed short&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 16-bit integer type */&lt;BR /&gt;typedef unsigned long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tU32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; unsigned 32-bit integer type */&lt;BR /&gt;typedef signed long&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tS32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 32-bit integer type */&lt;BR /&gt;typedef signed long long&amp;nbsp;&amp;nbsp;&amp;nbsp; tS64;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; signed 64-bit integer type */&lt;BR /&gt;typedef tS16&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;&amp;nbsp; tFrac16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; 16-bit signed fractional Q1.15 type */&lt;BR /&gt;typedef tS32&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;&amp;nbsp; tFrac32;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; 32-bit Q1.31 type */&lt;BR /&gt;typedef float&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; tFloat;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*!&amp;lt; single precision float type */&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 05 Feb 2018 05:25:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717487#M14786</guid>
      <dc:creator>subinkim</dc:creator>
      <dc:date>2018-02-05T05:25:07Z</dc:date>
    </item>
    <item>
      <title>Re: About data type converting (tFrac16 -&gt; float(maybe) -&gt; tFrac16) in AN5201SW application SW</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717488#M14787</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi. After I&amp;nbsp;posted this question, I saw&amp;nbsp;that the S12Z MCUS do not support multiplication and division in float type.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then how can I solve this problem? please give me your amazing ideas.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 05 Feb 2018 09:14:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717488#M14787</guid>
      <dc:creator>subinkim</dc:creator>
      <dc:date>2018-02-05T09:14:15Z</dc:date>
    </item>
    <item>
      <title>Re: About data type converting (tFrac16 -&gt; float(maybe) -&gt; tFrac16) in AN5201SW application SW</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717489#M14788</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;Did you try right click on the project -&amp;gt; Properties -&amp;gt; Settings -&amp;gt; S12ZLinker -&amp;gt; Input as you can see here:&amp;nbsp;&lt;A href="https://community.nxp.com/thread/358922"&gt;S12Z CW10.6&amp;nbsp; Floating point using&lt;/A&gt;&amp;nbsp;?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Did that help you?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Diana&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 07 Feb 2018 12:02:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717489#M14788</guid>
      <dc:creator>dianabatrlova</dc:creator>
      <dc:date>2018-02-07T12:02:59Z</dc:date>
    </item>
    <item>
      <title>Re: About data type converting (tFrac16 -&gt; float(maybe) -&gt; tFrac16) in AN5201SW application SW</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717490#M14789</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi SuBin Kim,&lt;/P&gt;&lt;P&gt;I can see some indication of misuse of the fraction arithmetic. The equations should be scaled to avoid such real-world transformations in the code. However, there is a solution:&lt;/P&gt;&lt;P&gt;You are looking for a number, which is 3.2767 higher than the requiredSpeed. Well, there may be such number until the requiredSpeed is higher than 0.305 in fraction. Why? Just imagine following example:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Now, in general, if you need to perform the operation of multiplication by float 3.2767, you need to do a division by inverted number, since the calculation needs to be done in Frac16 range of &amp;lt;-1.0, 1.0), inputs as well as the output. The inverted number is&lt;/P&gt;&lt;P&gt;1 / 3.2767 = 0.305185&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;x * 3.2767 = x / 0.305185&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You should consider that the result should never be higher than 1.0 or less than -1.0. That means, your calculation has some range limitations, which have to be addressed.&amp;nbsp;&lt;/P&gt;&lt;P&gt;In the words of code:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;MLIB_Abs&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;requiredSpeed&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;&amp;lt;&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;FRAC16&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0.305185&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp; Frac16 result &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;MLIB_DivSat_F16&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;requiredSpeed&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;FRAC16&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0.305185&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;else&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;// requiredSpeed is out of range&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Frac16 requiredSpeed is scaled to its maximum of 10,000 RPM. That means: if the value is 0.5 in fraction, it means 5,000 RPM (in the memory, there is 16,535 representing the 0.5).&lt;/P&gt;&lt;P&gt;For the case of 5,000 RPM, the result would be&lt;/P&gt;&lt;P&gt;0.5 / 0.305185 = 1.0 !!! (since the result overflows 1.0 and causes saturation)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In case the requiredSpeed = 0.1, the result would be&lt;/P&gt;&lt;P&gt;0.1 / 0.305185 = 0.32767, which is correct and in the real-world scale it means 3276.7 RPM.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Final note: there is a way to incorporate floating point operations in the code. Personally, I would not recommend it since it is simulated by a huge set of instructions (no natural support of floating point operations in S12ZVM) and you would lose performance. The S12ZVM supports fractional arithmetic calculations and it's really fast. Using the AMMCLib functions, the performance is even better than using *, /, +, - operators, since it calls the dedicated ASM instructions of the MAC unit.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Matej&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 19 Feb 2018 08:12:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/About-data-type-converting-tFrac16-gt-float-maybe-gt-tFrac16-in/m-p/717490#M14789</guid>
      <dc:creator>pachamatej</dc:creator>
      <dc:date>2018-02-19T08:12:29Z</dc:date>
    </item>
  </channel>
</rss>

