Nombre aléatoire en asm 16f84

sodhaine Messages postés 1 Date d'inscription mercredi 3 décembre 2003 Statut Membre Dernière intervention 20 juillet 2004 - 20 juil. 2004 à 15:56
nicolo84 Messages postés 1 Date d'inscription lundi 1 mai 2006 Statut Membre Dernière intervention 4 mai 2006 - 4 mai 2006 à 22:00
Bonjour,
Je suis un newbie-moyen en assembleur/électronique; j'essaie de faire un dé électronique en assembleur 16f84 (avec affichage sur écran LCD) et je me heurte à un problème: comment générer un nombre aléatoire en assembleur 16f84 ? est-ce que quelqu'un à une idée, une routine?
Merci d'avance pour votre aide.
aVr

PS: pourquoi le faire en assembleur ? parceque j'aime ça... .

3 réponses

cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
16 août 2004 à 21:46
il y a plein de méthodes pour faire cela, la meilleure est d'utiliser le timer et un bon petit modulo ! très fastoche et ça marche très très bien (et en plus, le timer est un registre du 16f84, ce qui facilite bien les choses...)

pour le timer du PIC 16f84, vas la dessus par exemple

http://p.may.chez.tiscali.fr/timer.html

@+
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
3 sept. 2004 à 00:12
Beaucoup de générateur pseudo aléatoire se basent sur une multiplication et un modulo du style en C:

rnd= ((seed + a) * b) % c;
seed= rnd;

seed est la graine en général on utilise un timer ou une horloge
a, b, c sont des paramètres qui vont déterminer la périodicité et la répartition statistique des nombres sur un echantillon, elle sont déterminer au pifomètre

il fo donc implémenter une multiplication nb_a * nb_b
le résultat est renvoyé dans res1 pour la partie haute (MSByte) et res0 pour la partie basse (LSByte)

muliplie
movlw 8
movwf counter

movf nb_a, W
movwf tmp0
clrf tmp1
clrf res0
clrf res1

boucle_mul
rrf nb_b, F
btfss STATUS, C
goto next_mul

movf tmp0, W
addwf res0, F
btfsc STATUS, C
incf res1, W

movf tmp1, W
addwf res1, F

next_mul
bcf STATUS, C
rlf tmp0, F
rlf tmp1, F

decfsz counter, F
goto boucle_mul
return

a l'initialisation du générateur pseudo-aléatoire
tu dois faire
movf TMR0, W
movwf seed

le paramètre C vaudra 256 ce qui équivaut à prendre l'octet de poids faible du résultat de la multiplication
pour le paramètre A il doit être un nombre premier

ensuite pour calculer le nombre suivant:
generate_rnd
movf param_b, W
movwf nb_b

movf seed, W
addwf param_a, W
movwf nb_a
call multiplie

; on fait ici le mdulo b, on ne prends donc que l'octet de poids
; faible du résultat de la multiplication
movf res0, W
movwf rnd_num
movwf seed
return

Le nombre aléatoire rendu est dans RND_NUM

Core Breaker :)
0
nicolo84 Messages postés 1 Date d'inscription lundi 1 mai 2006 Statut Membre Dernière intervention 4 mai 2006
4 mai 2006 à 22:00
Merci Corebreaker,

Je cherche depuis un moment ce programme pour faire un jeux de lumières pour ma petite fille !
0
Rejoignez-nous