Cuando yo hice un dado electrónico lo hice con el contador del timer, en un AVR pero para el caso es lo mismo. Simulaba estados random.
Para empezar necesitas saber cuántos estados aleatorios necesitas; como tú dices: 123,321,132,312,231 y 213 (serían 6 estados).
En mi caso fueron 6: 1,2,3,4,5 y 6 (las 6 caras del dado).
El contador del timer era de 8bits, entonces cuando el usuario apretaba un botón, se obtenía el conteo, que podía ser de 0 a 255.
Para obtener los 6 estados de los 256 números posibles se puede hacer una división. Digamos que cae en 137...
137 / 6 = 22.833 (veintidós enteros cinco sextos)
Tomas el residuo 0.833, lo multiplicas por 6 y te da 5. En este caso el estado aleatorio cayó en 5, de 6 estados posibles: 0,1,2,3,4 y5.
Si haces una subrutina que seleccione los estados, tendría que ser para el número de estados que obtendrás (256 si es con un timer de 8bit) dividido entre los estados que deseas (tú tienes 6: 123,321,132,312,231,213). El residuo lo asignarás al estado que quieras:
1 - 123
2 - 321
3 - 132
4 - 312
5 - 231
6 - 213
Esa asignación la puedes hacer con un switch case.
Esto se haría en C así:
int16 random;
random=read_adc();
random=random%6; //creo que así se saca el residuo
switch (random)
...
Esa es una forma de hacer variables aleatorias y reducir el número de estados obtenibles de ellas.
Espero ser claro, porque lo leo y lo veo un poco confuso.
Si hicieras este método, el conteo del timer no es la solución, ya que siempre te saldrían los mismos valores del contador del timer. La solución es usar el pin abierto ADC que recomienda Nocturno, ya que siempre será un valor completamente aleatorio y no dependerá ni del PIC, ni de la presión de un botón por parte del usuario.
En el caso del ADC, sí éste es de 10bits, tendrás valores de 0 a 1023. Divides el que te entrega el PIC entre tus estados deseados y listo.
