<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    All those variables are "binary variables". The computer is only
    capable of holding binary values. The code is expressing them as
    decimal values (via formatting library routines like 'printf'),
    while the comments are expressing the values as a confusing hodge
    podge of decimal and binary. <br>
    <br>
    The C language (and let's pretend this is C code and not go crazy by
    mentioning C++) has these data types, among others:<br>
    <br>
       (signed) char   - if you leave off "signed" you get that for free<br>
       unsigned char<br>
       (signed int)<br>
       unsigned int<br>
       etc.<br>
    <br>
    Typedefs (think synonyms) allow additional names to stand for these
    type names. In Arduino Land "byte" is a synonym for "unsigned char".
    In Arduino land char is an eight bit type and int is 16 bits. This
    means they can hold this many binary digits of information. If
    they're signed, the most significant bit is interpreted as a sign
    bit (one means "negative", zero means "positive"). <br>
    <br>
    This means signed char variables can hold values from -128 to +127
    decimal, or 11111111 to 01111111 binary. Unsigned char variables (or
    something named "byte") can hold values from 0 to 255 decimal or
    00000000 to 11111111 binary.<br>
    <br>
    Int variables are the same but twice as big (e.g. an unsigned int
    can express the number 65535 decimal).<br>
    <br>
    An array element is the same whether it's indexed by a literal
    integer value or an integer variable and the size of the variable
    only determines the range of index values.<br>
    <br>
    When you say "<span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">When

      the code sees the binary index as a byte it knows that 10 means
      read the third element value and when it sees 11 it knows to read
      the fourth element value" </span>you're imagining there's some
    kind of radix conversion going on (radix is the "base" of the value,
    such as two for binary). Again, writing "11" to express the number
    three decimal is just confusing. <br>
    <br>
    Imagine every occurrence of "11" being written as "0b11", every "10"
    being "0b10", etc. This is the proper "C way" to express a binary
    number. If the author had used these prefixes consistently he'd be
    plainly saying what he intended to say.<br>
    <br>
    -Pete<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 02/23/2016 03:15 PM, Dwight Morgan
      via TriEmbed wrote:<br>
    </div>
    <blockquote cite="mid:009501d16e76$e45ea820$ad1bf860$@gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <meta name="Generator" content="Microsoft Word 14 (filtered
        medium)">
      <style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.hoenzb
        {mso-style-name:hoenzb;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks
            Rodney and Mike for the responses. In Mr. Churchward’s code
            he declares the byte variable “state” and uses the function
            “knobTurned()” as follows – code snippets: <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">byte
            state = 0;           // will store </span><b><u><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:red">two
                bits</span></u></b><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:red">
          </span><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">for
            pins A & B on the encoder which we will get from the
            pins above<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">void
            knobTurned(){<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            /* AH HA! the knob was turned */<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            state = 0;    // reset this value each time<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            state = state + digitalRead(pinA);   // add the state of Pin
            A<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            state <<= 1;  // shift the bit over one spot<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            state = state + digitalRead(pinB);   // add the state of Pin
            B<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">  /*
            now we have a two bit binary number that holds the state of
            both pins<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            00 - something is wrong we must have got here with a key
            bounce<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            01 - sames as above - first bit should never be 0<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            10 - knob was turned backwards<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            11 - knob was turned forwards<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            */<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">    
            <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">  /*
            We can pull a value out of our truth table and add it to the
            current level */<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            level = level + bump[state];<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">  /*
            Let's see what happened */<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            Serial.print(bits[state] + "    ");  // show us the two bits<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            Serial.print(bump[state],DEC);       // show us the
            direction of the turn<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            Serial.print("    ");<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> 
            Serial.println(level);               // show us the new
            value<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">}<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I’ve
            never used bytes much in code and never really  thought
            about it much and I always saw calls to specific array
            elements with a decimal value in the square brackets like
            this: X = myarray[2]; for instance to get the 3rd element
            value. <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">It
            looks like when a byte is used as the index the value is a
            binary number – using ones and zeros – and it can simply
            because it is a byte!<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">If
            you look at the knobTurned() function it is building a two
            place binary index stored in the byte variable named
            “state”. When the code sees the binary index as a byte it
            knows that 10 means read the third element value and when it
            sees 11 it knows to read the fourth element value. <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">This
            seems like a very handy thing to know for new learners like
            me with Arduino and RPi. <o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">That’s
            my now understanding of it. Please shim up any parts as
            needed!<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks
            again!<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Dwight<o:p></o:p></span></p>
        <p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
        <p class="MsoNormal"><b><span
style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span
style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
            Rodney Radford [<a class="moz-txt-link-freetext" href="mailto:ncgadgetry@gmail.com">mailto:ncgadgetry@gmail.com</a>] <br>
            <b>Sent:</b> Monday, February 22, 2016 11:22 PM<br>
            <b>To:</b> Dwight Morgan<br>
            <b>Cc:</b> Triangle Embedded Computing Discussion<br>
            <b>Subject:</b> Re: [TriEmbed] C Code Question Ralated to
            Rotary Encoder<o:p></o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div>
          <div>
            <div>
              <p class="MsoNormal">I had to search for the video you
                watched to see what was being done and then find the
                code.  For those following along, the video is part of a
                3 part video of using a quadrature rotary encoder as an
                input for a morse code sending device.  The one
                necessary for this discussion is the part 2 which can be
                found at <a moz-do-not-send="true"
                  href="https://www.youtube.com/watch?v=FGxLXqzPe3Q">https://www.youtube.com/watch?v=FGxLXqzPe3Q</a><o:p></o:p></p>
            </div>
            <p class="MsoNormal">     <o:p></o:p></p>
          </div>
          <p class="MsoNormal">In the video, as the knob is turned to
            the left or right, a line is printed with three values on
            it, like this:<br>
            <br>
            11      1      70<br>
            11      1      71<br>
            10      -1     70<br>
            10      -1     69<o:p></o:p></p>
          <div>
            <div>
              <div>
                <div>
                  <p class="MsoNormal" style="margin-bottom:12.0pt"><br>
                    The first column represents the two bits of the
                    quadrature, the second column indicates whether we
                    are counting up (+1) or down (-1) and the third
                    column represents the current value.<br>
                    <br>
                    The question is how can the compiler know that the
                    11 represents a binary number whose value is 3, and
                    how does it know that 10 represents a binary number
                    whose value is 2.<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal">The answer is that it doesn't
                    have to... the internal variable is called state and
                    it either has a 0, 1, 2, or 3.<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal" style="margin-bottom:12.0pt"><br>
                    When printing, the author decided to show the value
                    of the number in binary, instead of decimal, so he
                    printed the first value like this:<br>
                    <br>
                       /* For demo purposes we will create an array of
                    these binary digits */<br>
                       String bits[] = {"00","01","10","11"};<br>
                    <br>
                       /* Let's see what happened */<br>
                       Serial.print(bits[state] + "    ");  // show us
                    the two bits<br>
                    <br>
                    So as you see, the number is the index into a
                    character string array and it prints out either the
                    string "00", "01", "10", or "11".  This is just to
                    make it easier for you to visualize that the number
                    is really a two bit number representing the two
                    outputs of the quadrature knob.<br>
                    <br>
                    The second value in the line is printed with this
                    line (this is the one you showed).  This prints out
                    only the <br>
                    <br>
                       int bump[] = {0,0,-1,1};<br>
                       Serial.print(bump[state],DEC);       // show us
                    the direction of the turn<br>
                    <br>
                    Here we see the same 0..3 state variable indexing
                    into a numerical array and printing out either 0, 0,
                    -1 or +1 as a DECimal number.<br>
                    <br>
                    And then the third value is printed with these
                    lines:<br>
                    <br>
                        Serial.print("    ");<br>
                        Serial.println(level);               // show us
                    the new value<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal" style="margin-bottom:12.0pt">Here
                    we just print out the integer level variable that
                    has already been incremented or decremented.<br>
                    <br>
                    <o:p></o:p></p>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div>
          <p class="MsoNormal"><o:p> </o:p></p>
          <div>
            <p class="MsoNormal">On Mon, Feb 22, 2016 at 10:10 PM,
              Dwight Morgan via TriEmbed <<a moz-do-not-send="true"
                href="mailto:triembed@triembed.org" target="_blank">triembed@triembed.org</a>>
              wrote:<o:p></o:p></p>
            <div>
              <div>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I’m
                  trying to understand and use a rotary encoder on an
                  Arduino project and I have a simple demo circuit
                  working with the encoder and output to the serial
                  monitor. I see how the code is working but I can’t
                  find documentation that confirms what I’m seeing. <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The
                  C code builds a two digit binary number that is used
                  as a pointer to values in an array that is used to
                  output either a 1 or -1 to indicate if the encoder is
                  rotating clockwise or counterclockwise – all well and
                  fine. <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The
                  variable used as a pointer is a type byte initially
                  set to zero (byte state = 0) with a function called by
                  an interrupt to build the two digit pointer. I looked
                  it up and a byte can either hold 8 bits or a decimal
                  value from 0 to 255. <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The
                  pointer works fine and prints out either a 1 or -1 on
                  the serial monitor. <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">My
                  question is, how does the code know that a binary 10
                  is not the number ten as the pointer or binary 11 is
                  not the number eleven as the pointer instead of
                  knowing it is the number 2 or 3 to be used as the
                  pointer to pick out values in the following array? <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">int
                  bump[] = {0,0,-1,1};  <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The
                  output is like this: Serial.print(bump[state]),DEC); 
                  //state being the built pointer of either binary 10 or
                  11 for a value of either decimal 2 or 3, respectively.
                  <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thanks
                  to C code by Budd Churchward on YouTube.<o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Input
                  appreciated. Thanks!<o:p></o:p></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                    style="color:#888888"> <o:p></o:p></span></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                    style="color:#888888">Dwight<o:p></o:p></span></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                    style="color:#888888"> <o:p></o:p></span></p>
                <p class="MsoNormal"
                  style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                    style="color:#888888"> <o:p></o:p></span></p>
              </div>
            </div>
            <p class="MsoNormal" style="margin-bottom:12.0pt"><br>
              _______________________________________________<br>
              Triangle, NC Embedded Computing mailing list<br>
              <a moz-do-not-send="true"
                href="mailto:TriEmbed@triembed.org">TriEmbed@triembed.org</a><br>
              <a moz-do-not-send="true"
                href="http://mail.triembed.org/mailman/listinfo/triembed_triembed.org"
                target="_blank">http://mail.triembed.org/mailman/listinfo/triembed_triembed.org</a><br>
              TriEmbed web site: <a moz-do-not-send="true"
                href="http://TriEmbed.org" target="_blank">http://TriEmbed.org</a><o:p></o:p></p>
          </div>
          <p class="MsoNormal"><o:p> </o:p></p>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Triangle, NC Embedded Computing mailing list
<a class="moz-txt-link-abbreviated" href="mailto:TriEmbed@triembed.org">TriEmbed@triembed.org</a>
<a class="moz-txt-link-freetext" href="http://mail.triembed.org/mailman/listinfo/triembed_triembed.org">http://mail.triembed.org/mailman/listinfo/triembed_triembed.org</a>
TriEmbed web site: <a class="moz-txt-link-freetext" href="http://TriEmbed.org">http://TriEmbed.org</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>