尝试使用XOR和移位运算符切换随机LED

时间:2019-05-29 01:12:40

标签: c++ random embedded bit-shift xor

对于一个铁路模型项目,我试图使用产生x的随机数发生器(rand())来切换LED,然后在PIC16F15325的LATC寄存器上将x左移1。 (我是一个狂热的业余爱好者,但仍然有很多东西要学,完全是自学成才的。)我正在使用XC8和PICkit 3。

我正在使用16F15325图片,在我看来,以下代码应(A)生成一个介于0到5(这是x)之间的随机数(伪可以),以及(B)切换位C0到C5 (每个都连接到LATC寄存器中的LED)(通过将x移位1(即0到5))并将XOR应用于该引脚来实现。假设这是一个无限循环,那么每次代码循环时,它都应切换至少一个LED。这大约有90%的时间有效,但有时并不会导致切换,这让我发疯了。

#include <xc.h>
#include <stdint.h>         /* For uint8_t definition */
#include <stdbool.h>        /* For true/false definition */
#include "configs.c"

void main(void) {

InitProgram();   // THIS SETS UP THE TRIS AND SETS THE C PORT TO OUTPUT

//  DECLARE AND SET VARIABLES

int x;             //  GENERAL PURPOSE VARIABLE TO USE ON THE FLY

LATC = 0b00111111;

while(1)
{
    x = rand() % 6;   //  SHOULD GENERATE 0 THROUGH 5 B/C NO "+ 1"

    LATC = LATC ^ 1 << x;

    //  I HAVE ALSO TRIED LATC = LATC ^ 1 << (char) x;

    //  THERE IS A ONE SECOND DELAY HERE

 }
}

如前所述,这通常在循环中的每次运行中都有效,但是大约有10%的时间,没有LED会触发。在90%的时间内,其中一个LED会切换。

1 个答案:

答案 0 :(得分:0)

根据OP的研究,问题出在XC8环境中。这是Rand()函数中的一个错误,具体取决于是否为C90或C99设置了环境(C99导致了此问题)。

描述该错误的Microchip网站链接位于: https://www.microchip.com/forums/m1077569.aspx [Rand()适用于C90 Standard,但不适用于当前项目中设置的C99 Standard]