sodhaine
Messages postés1Date d'inscriptionmercredi 3 décembre 2003StatutMembreDernière intervention20 juillet 2004
-
20 juil. 2004 à 15:56
nicolo84
Messages postés1Date d'inscriptionlundi 1 mai 2006StatutMembreDerniè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... .
cs_pjb
Messages postés19Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention17 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
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 20071 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)
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