Matt D Matt D - 16 days ago 4
C Question

Why is my C program skipping over this if statement?

I have this C program that I am writing in code composer studio.

#include <msp430.h>

/*
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

int R5_SW=0, R6_LED=0, temp=0;

P1OUT = 0b00000000; // mov.b #00000000b,&P1OUT
P1DIR = 0b11111111; // mov.b #11111111b,&P1DIR
P2DIR = 0b00000000; // mov.b #00000000b,&P2DIR

while (1)
{
// read all switches and save them in R5_SW
R5_SW = P2IN;

// check for read mode
if (R5_SW & BIT0)
{
R6_LED = R5_SW & (BIT3 | BIT4 | BIT5); // copy the pattern from the switches and mask
P1OUT = R6_LED; // send the pattern out
}

// display rotation mode
else
{
R6_LED = R5_SW & (BIT3|BIT4|BIT5);
// check for direction
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right

// mask any excessive bits of the pattern and send it out
R6_LED &= 0xFF; // help clear all bits beyound the byte so when you rotate you do not see garbage coming in
P1OUT = R6_LED;

// check for speed
if (R5_SW & BIT2) {__delay_cycles( 40000); } //fast
else {__delay_cycles(100000); } //slow
}
}
}


When it gets to this if statment in debug mode

if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right


It skips over it, it doesn't run the if or the else block. At this point in the code
R5_SW
is
22
which is
0010 0010
in binary so
R5_SW & BIT1
should evaluate to true. What am I missing here?

Answer

If you use an operation like << or >> without assigning it then the result is just discarded. Try this:

if (R5_SW & BIT1) {// rotate left
           R6_LED = R6_LED << 1;
        } else {
            R6_LED = R6_LED >> 1;
        }   // rotate right

Or, for brevity:

if (R5_SW & BIT1) {// rotate left
            R6_LED <<= 1;
        } else {
            R6_LED >>= 1;
        }   // rotate right
Comments