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());
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.
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
- 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:
gracias, me sirvió mucho.
Publicar un comentario