Jump to content

Recommended Posts

Posted

Hi all,

I need to create random values in the range 1-10 or so in my application. Is there an easy way to achieve this within the PIC?

Thanks, ilmenator

Posted

Well..

Many people have found this secret "hidden" function, by using compiled Midibox64 application and failing to reading the documentation :D

I don't know the software solution (see the examples), but if you leave analog input pin floating and read the value and scale it down to 1-10, would that be random enough?  ;D

Moebius

Posted

There's already a RNG in MBSEQ :)

;; --------------------------------------------------------------------------

;;  This function generates a new random number

;;  OUT: new random number in SEQ_RANDOM_SEED_[LH]

;; --------------------------------------------------------------------------

SEQ_CORE_GenRandomNumber

SET_BSR SEQ_BASE

movf SEQ_RANDOM_SEED_L, W, BANKED

mulwf SEQ_RANDOM_SEED_H, BANKED

movf TMR0L, W

addwf PRODL, W

movwf SEQ_RANDOM_SEED_L, BANKED

movlw 0x69

addwfc PRODH, W

movwf SEQ_RANDOM_SEED_H, BANKED

return

Scope the Humanizer functions out for a scaling example:

;; --------------------------------------------------------------------------

;;  this function applies a random value to a byte

;;  IN: pointer to byte in FSR1

;;      intensity in TMP1

;;  OUT: modified byte

;; --------------------------------------------------------------------------

SEQ_HUMANIZE_Modify

call SEQ_CORE_GenRandomNumber ; generate new random number

;; scale depending on intensity

rlf TMP2, W

rlf WREG, W

rlf WREG, W

andlw 0x78

mulwf SEQ_RANDOM_SEED_L, BANKED ; scaled result in PRODH

;; add/subtract depending on SEQ_RANDOM_SEED_H[0]

BIFCLR SEQ_RANDOM_SEED_H, 0, BANKED, rgoto SEQ_HUMANIZE_Modify_Add

SEQ_HUMANIZE_Modify_Sub

movf PRODH, W

subwf INDF1, W

;; saturate on overflow

IFSET WREG, 7, movlw 0x00

movwf INDF1

;; value should never be 0x00

movf INDF1, W

skpnz

incf INDF1, F

return

SEQ_HUMANIZE_Modify_Add

movf PRODH, W

addwf INDF1, W

;; saturate on overflow

IFSET WREG, 7, movlw 0x7f

movwf INDF1

return

:) TK beat us to it again!

Posted

Okay,

thanks for that piece of code - I wouldn't have found it, as I have no MBSEQ  :P

Now, I don't know much about Assembler, what does the code do? What is the range of the values that are created? How can I use it in my C code?

In my app generating the random values is not a real-time issue, so is there any other piece of [tt]C[/tt] code that might be easier to understand for me and which does the same?

Sorry for my ignorance, I'm still learning...  ::)

Thanks a lot, ilmenator

Posted

The "sid_random" application gets use of an external "real random" generator

In C, the "software random generator" in SEQ_CORE_GenRandomNumber function would look similar to this:
[code]
unsigned char random_seed_l;
unsigned char random_seed_h;

void gen_random_number(void)
{
  unsigned int tmp = random_seed_l * random_seed_h;
  random_seed_l = TMR0L + (unsigned char)(tmp & 0xff);
  random_seed_h = 0x69 + (unsigned char)(tmp >> 8);
}
[/code] Maybe with some additional XOR operations the random value distribution could be improved, but I'm not an expert on this topic... Best Regards, Thorsten. [/code]

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...