簡體   English   中英

嘗試使用 XOR 和位移運算符切換隨機 LED

[英]Trying to toggle random LEDs with a XOR and bit shift operator

對於模型鐵路項目,我試圖通過使用隨機數生成器 (rand()) 來切換 LED,該生成器生成 x,然后在 PIC16F15325 上的 LATC 寄存器上將 1 向左移動 x。 (我是一個狂熱的愛好者,但仍然有很多東西要學,完全自學。)我正在使用 XC8 和 PICkit 3。

我正在使用 16F15325 pic,在我看來,以下代碼應該

  • (A) 生成一個介於 0 和 5(這是 x)之間的隨機數(偽可以)和
  • (B) 通過將 1 移位 x 位(即 0 到 5)並將 XOR 應用到該引腳來切換位 C0 到 C5(每個都連接到 LATC 寄存器中的一個 LED)。

鑒於這是一個無限循環,那么每次代碼循環時,它應該至少切換一個 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 會切換。

根據 OP 的研究,問題出在 XC8 環境中。 這是 Rand() 函數中的一個錯誤,取決於環境是為 C90 還是 C99 設置的(C99 導致了這個問題)。

描述該錯誤的 Microchip 網站鏈接位於: https : //www.microchip.com/forums/m1077569.aspx [Rand() 適用於 C90 標准,但不適用於當前項目中設置的 C99 標准]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM