Попытка переключения случайных светодиодов с помощью оператора XOR и битового сдвига - PullRequest
2 голосов
/ 29 мая 2019

В модельном проекте железной дороги я пытаюсь переключать светодиоды с помощью генератора случайных чисел (rand ()), который выдает x, а затем сдвигает 1 влево на x в регистре LATC на PIC16F15325. (Я - увлеченный хобби, но у меня еще так много уроков, я полностью самоучка.) Я использую XC8 и PICkit 3.

Я использую рис 16F15325, и, по моему мнению, следующий код должен (A) генерировать случайное число (псевдо в порядке) между 0 и 5 (это x) и (B) переключать биты с C0 по C5 (каждый из которых подключен к светодиоду в регистре LATC) путем сдвига 1 на x бит (т. е. от 0 до 5) и применения XOR к этому выводу. Учитывая, что это бесконечный цикл, то каждый раз, когда код повторяется, он должен включать хотя бы один светодиод. Это работает примерно в 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% случаев ни один светодиод не будет переключаться. 90% времени один из светодиодов переключается.

...