TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: eddie323983 en 24 de Noviembre de 2004, 08:15:00
-
Hola buenas:
Quisiera saber si alguien sabe como generar un número aleatorio con un pic. Muchas Gracias
-
Hola, depende del uso... pero lo mas simple seria un contador que se este incrementando continuamente en partes del programa, y se detenga al pulsar el pulsador... si es que el diseño lo permite...
los numeros al azar son llamados random, RND, y la generacion randomize 
aclara un poco mas tu necesidad ok?
suerte
Norberto
-
Si lo haces con Protón (con permiso de mi amigo Norberto) mira qué fácil es:
VAR1 = RANDOM " Genera un numero aleatorio en la variable VAR1
Saludos
Ricky
Madrid-España
-
Tambien puedes dejar trabajando libre el Timer0 y capturar el valor del conteo en el momento de pulsar el boton.
Te generara un numero aleatorio entre 0 y 255, que normalmente sirve en la mayoria de las aplicaciones...
-
por algun lado lo tenia.... y lo encontre....
; Program RANDOM.ASM
;
; Illustrates an implementation of a 16-bit random number generator.
;
; Assumes 8 LEDs on PORTB. A random pattern is displayed for a random
; amount of time. Continuous loop.
;
; copyright, Peter H. Anderson, MSU, August 9, "97
LIST p=16c84
#include <c:mplabp16c84.inc>
__CONFIG 11h
CONSTANT BASE_VAR=0CH
LOOP3 EQU BASE_VAR+0 ; for timing
LOOP2 EQU BASE_VAR+1
LOOP1 EQU BASE_VAR+2
RAND_HI EQU BASE_VAR+3 ; 16-bit random number
RAND_LO EQU BASE_VAR+4
MAIN:
BSF STATUS, RP0
CLRF TRISB ; all bits on PORTB are outputs
BCF STATUS, RP0
MAIN_1:
CALL RANDOM ; generate 16-bit random number
MOVF RAND_HI, W ; use high byte as random pattern
MOVWF PORTB
MOVF RAND_LO, W ; use low byte as random delay
MOVWF LOOP3
CALL DELAY
GOTO MAIN_1 ; repeat indefinitely
RANDOM:
MOVF RAND_HI, W ; if current random is 0000, make it 00FFH
IORWF RAND_LO, W
BTFSC STATUS, Z
COMF RAND_LO, F
BTFSS RAND_HI, 6 ; hi.7 = hi.7 xor hi.6
MOVLW 00H
BTFSC RAND_HI, 6
MOVLW 80H
XORWF RAND_HI, F
BTFSS RAND_HI, 4 ; hi.7 = hi.7 xor hi.4
MOVLW 00H
BTFSC RAND_HI, 4
MOVLW 80H
XORWF RAND_HI, F
BTFSS RAND_LO, 3 ; hi.7 = hi.7 xor lo.3
MOVLW 00H
BTFSC RAND_LO, 3
MOVLW 80H
XORWF RAND_HI, F
RLF RAND_HI, W ; carry = hi.7
RLF RAND_LO, F ; double left shift
RLF RAND_HI, F
RETURN
DELAY: ; delays loop3 * 10 msecs
MOVLW .10 ; 10 msecs
MOVWF LOOP2
DELAY_1:
MOVLW .110
MOVWF LOOP1
DELAY_2:
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ LOOP1, F
GOTO DELAY_2
DECFSZ LOOP2, F
GOTO DELAY_1
DECFSZ LOOP3, F
GOTO DELAY
RETURN
END
-
Muchas gracias por vuestras respuestas. Creo que me voy a quedar con lo de capturar el valor del TMR0 de forma aleatoria ya que me parece mas sencillo.