RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Generación de números aleatorios con PIC.

Para obtener números aleatorios vamos a emplear la función rand(). El rango de números aleatorios que nos va a ofrecer va a ser muy elevado, por lo que deberemos acotarlo entre dos valores deseados.

En este ejemplo, queremos obtener números aleatorios entre 100 y 200. Para ello emplearemos la función rand() con la siguiente expresión matemática:

rand() % ((nº mas alto - nº mas bajo +1) + nº más bajo)

donde "%" indica que tomaremos como resultado el resto de dividir rand() por la expresión indicada.

Así pues, sustituyendo los limites desados la instrucción quedaría:

n_aleatorio = rand()%(101)+100;//Numero aleatorio entre 100 y 200

Ya tendríamos la generación de números aleatorios. Pero ahora se presenta otro problema. Obtendremos una secuencia de números aleatorios, pero cuando volvamos a activar la generación de números, obtendremos la misma secuencia aleatoria.

El problema viene porque rand() parte de un número inicial sobre el que realiza una serie de cálculos para obtener el siguiente número aleatorio. Como este número inicial y los cálculos son siempre los mismos, cada vez que iniciemos la generación se repetirá la secuencia. Por tanto hay que buscar la forma de que ese número inicial no sea siempre el mismo.

Para ello existe otra función  srand(), que nos permitirá elegir ese número inicial.   Si empleamos por ejemplo srand(3), el número inicial sobre el que rand() iniciará los cálculos será el 3. Con srand(1), será el 1, y así.

Ya hemos conseguido elegir ese número inicial. Pero seguimos teniendo el mismo problema puesto que aunque elijamos nosotros el número, éste será siempre el mismo. Para ello, deberemos sustituirlo por una expresión que no nos aporte siempre el mismo valor. Una forma de hacerlo es tomando el valor  en un momento concreto  del contador RTCC del pic. Que coincidamos con nuestra pulsación dos veces en el mismo valor del RTCC será realmente complicado.

srand(get_rtcc());

Pulsa en la imagen para ampliarla

Así pues, para generar los números aleatorios, actuaremos sobre el pulsador que mediante la interrupción por señal externa en RB0 del pic tomaremos el valor que posea en ese momento el contador RTCC y lo emplearemos como valor inicial para la generación de números aleatorios.

Con cada pulsación desactivaremos y activaremos alternativamente la generación de los números aleatorios.


[+/-] Ver / Ocultar prorama completo en C


En esta simulación bajo proteus se puede comprobar el funcionamiento.


Todos los archivos se pueden descargar en este enlace:



El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084


_________________________________________________________________________________


TUTORIAL BÁSICO  PIC C COMPILER 
Los Fuses en el PIC 16F876A

#FUSES

LP          //Adapta el circuito oscilador interno para   trabajar con un oscilador de baja potencia < 200KHz

XT          //Adapta el ircuito osciladotr interno para trabajar con un cristal resonador de frecuencia 4MHz o inferior

HS          //Adapta el circuito oscilador interno para trabajar con un cristal resonador superior a 4MHz

RC          //Adapta el circuito oscilador interno para trabajar con un circuito resonador RC. (Opción por defecto)

WDT         //Habiliatación del reset por rebose de watchdog (Opción por defecto)

NOWDT       //No habilitación del reset por watchdog

BROWNOUT    //Reset en bajadas de tensión de alimentación por debajo de 4V. (Opción por defecto)

NOBROWNOUT  //Desactivado reset por bajadas de tensión

PUT         //“Power up timer”. Mantiene reseteado al PIC un tiempo en el momento de conexión de la tensión de alimentación. Permite así que empiece a ejecutar el programa con la tensión de alimentación ya estabilizada.

NOPUT       //No habilita “Power Up Timer”. (Opción por defecto)

PROTECT     //Protección de lectura de código de programa. Impide leer el código con dispositivos externos.

NOPROTECT   //No habilita la protección de código. (Opción por defecto)

DEBUG       //Monitorización hardware interno por dispositivos externos. Supone la renuncia a los pines RC6 y RC7 como pines I/O

NODEBUG     //Inhabilitación modo DEBUG. (Opción por defecto)

LVP         //Opción de programación del PIC a bajo voltaje. Supone la renuncia de uso del pin RB4 como pin I/O. (Opción por defecto)

NOLVP       //Inhabilitación modo LVP

CPD         //Protección de lectura del código contenido en la EEPROM con dispositivos externos.

NOCPD       //Modo CPD inhabilitado. (Opción por defecto)

WRT_5%      //Protección a la escritura de los 255 primeros bytes de la memoria de programa

WRT_25%     //Protección a la escritura del primer cuarto de memoria de programa

WRT_50%     //Proteccción a la escritura de la mitad inferior de memoria de programa.

NOWRT       //Protección desactivada a la escritura de la  memoria de programa. (Opción por defecto)



1 comentario:

Javier Vinasco dijo...

gracias, me sirvió mucho.

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)