В модельном проекте железной дороги я пытаюсь переключать светодиоды с помощью генератора случайных чисел (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% времени один из светодиодов переключается.