I’m trying to read a group of 4 io pins to get a numerical value as the status of an outboard device. I’m trying it out using the edubot controller so I’m looking at io pins 1-4 which translates to PortA bits 0-3. I was trying to do the following:
sensor_value = (PORTA & 0x0f);
iIt compiles ok, but the result is always 0. I double-checked that I have set the pins to INPUT, and have set the number of analog channels to NO_ANALOG. sensor_value is an unsigned char.
I also tried reading the pins individually as rc_dit_in01 through rc_dig_in04 and got the proper values, so I know the hardware is ok. Anyone know what gives here? Any help would be appreciated.
On another note, I often have problems getting the edubot to take to a program upload. Sometimes it takes 2 or 3 tries before it will run. And it won’t hold through a power-down. Do I just have a bad machine? this is true for a fresh load of the Default Code as well as my own, and the same behavior with both versions of the IFI Loader.
I tested this on the EDU controller and it worked.
With unconnected pins you get 0x0F
With dig I/O 1 signal-to-gnd you get 0x0E
With dig I/O 1&2 connected you get 0x0C
The point was to make the routine as fast as possible by not taking the time and space to read each line individually. I’ve already got that to work, but it makes for messy code.
Mark’s post has the greatest similarity to mine in code structure. I wonder why PrintByte worked for him, but using PORTA to transfer a value to another variable doesn’t seem to?
The problem is that you are using bitwise and(&), you should be using logical AND(&&).
the difference is this:
“&” (bitwise and) ANDs each corresponding bit individually.
11110000 & 11111111 = 11110000
10101010 & 10101010 = 10101010
“&&” (logical and) ANDs the entire word at a time. (it will only be true if the two arguements are the same.)
11110000 && 11111111 = 00000000
10101010 && 10101010 = 11111111
unsigned char port_a;
port_a = PORTA & 0x0f; /* mask off unused bits */
PrintByte(port_a);
to more closely emulate what you were doing. I simplified it to the minimum number of lines before posting.
This works as well, so it isn’t an assignment problem.
I believe that is wrong - && returns 1 if both arguments are true (non-zero). This is because the logical and works on two boolean values, and returns a third. Anything except 0 is treated as true in C.
Thanks for all the comments and help! As it turns out, the original statement was working, the problem was apparentlywith the way I was trying to view the result through a printf statement. Still not sure what I was doing wrong there, as when I substituted a pwm variable I would get a real number. In frustration, I ended up echoing the result to a set of output pins, and there it was!
For those who are curious, I am using the “& 0x0f” as a mask to keep only the lower 4 bits. What I’m doing is implementing an outboard i/o expansion scheme so we can read numerical values from outboard hardware. PORTA will translate to PORTH on the FRC. For those who are interested, e-mail me directly and I’ll be happy to share schematics and code (once I get the code finished). If there is enough interest, I’ll post it as a white paper.