[TriEmbed] C Code Question Ralated to Rotary Encoder

Rodney Radford ncgadgetry at gmail.com
Mon Feb 22 22:21:42 CST 2016


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 https://www.youtube.com/watch?v=FGxLXqzPe3Q

In the video, as the knob is turned to the left or right, a line is printed
with three values on it, like this:

11      1      70
11      1      71
10      -1     70
10      -1     69

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.

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.

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.

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:

   /* For demo purposes we will create an array of these binary digits */
   String bits[] = {"00","01","10","11"};

   /* Let's see what happened */
   Serial.print(bits[state] + "    ");  // show us the two bits

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.

The second value in the line is printed with this line (this is the one you
showed).  This prints out only the

   int bump[] = {0,0,-1,1};
   Serial.print(bump[state],DEC);       // show us the direction of the turn

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.

And then the third value is printed with these lines:

    Serial.print("    ");
    Serial.println(level);               // show us the new value

Here we just print out the integer level variable that has already been
incremented or decremented.



On Mon, Feb 22, 2016 at 10:10 PM, Dwight Morgan via TriEmbed <
triembed at triembed.org> wrote:

> 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.
>
>
>
> 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.
>
>
>
> 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.
>
>
>
> The pointer works fine and prints out either a 1 or -1 on the serial
> monitor.
>
>
>
> 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?
>
>
>
> int bump[] = {0,0,-1,1};
>
>
>
> 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.
>
>
>
> Thanks to C code by Budd Churchward on YouTube.
>
>
>
> Input appreciated. Thanks!
>
>
>
> Dwight
>
>
>
>
>
> _______________________________________________
> Triangle, NC Embedded Computing mailing list
> TriEmbed at triembed.org
> http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
> TriEmbed web site: http://TriEmbed.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.triembed.org/pipermail/triembed_triembed.org/attachments/20160222/71db3e97/attachment.htm>


More information about the TriEmbed mailing list