Étape 7: Générer des nombres aléatoires
Maintenant que nous pouvons exporter des données sur un écran LED Dice individuel, nous avons besoin d’un moyen de générer un nombre aléatoire.
Mathématiquement, générant un nombre réellement aléatoire est un exercice très complexe. Dans notre circuit simple de PIC, nous pouvons générer un nombre aléatoire par un couple de moyens ;
- Un numéro apparemment aléatoire peut être obtenu en chronométrant combien de temps la touche est maintenue enfoncée, à l’aide d’une minuterie qui augmente très rapidement. (Il serait une personne très rare qui pourrait appuyer sur le bouton pour exactement 2243 mS chaque fois).
- Alternativement, nous puissions mettre en oeuvre un générateur de nombres pseudo-aléatoires mathématique. Ceci nécessite l’utilisation de multiplication et de division. Un générateur Pseudo-aléatoire génère une très longue séquence de numéros qui finissent par se répète, après plusieurs cycles.
Dans notre projet, la méthode la plus simple que nous pouvons utiliser pour générer un nombre aléatoire est de goûter à la minuterie interne (TMR0), qui est sans cesse croissant à ¼ de la vitesse d’horloge (environ 256KHz), et stockez-le dans une variable en continu, tant que la touche est maintenue enfoncée.
Notre microprocesseur PIC 16F84 ou 16F88 a 68 emplacements de mémoire qui peuvent être utilisées comme variables. Pour définir une variable, nous simplement déclarer une constante qui fait référence à un emplacement de mémoire particulière et de stocker des nombres dans cet emplacement de mémoire tel que requis.
Une routine de code court pour exercer cette fonction serait comme suit :
; un emplacement de mémoire pour stocker notre nombre aléatoire RandomA EQU 30 ; définir l’adresse de mémoire à ; stocker un nombre aléatoire Button_Loop MOVFW TMR0 ; Récupère la valeur courante de la minuterie MOVWF RandomA ; stockez-la dans RandomA BTFSS PortB, 0 ; Est le bouton toujours en baisse ? GOTO Roll_Down ; non, sauter et lente ; vers le bas de l’écran APPEL Display_Result ; Oui, afficher le rouleau actuel APPEL Short_Delay ; Patientez quelques instants CLRF Idea ; effacer les deux dés à nouveau CLRF bissou GOTO Button_Loop ; et boucle à nouveau. Roll_Down: ; le reste du programme va ici. ; RandomA contient un nombre qui a été choisi au hasard ; dépend de combien de temps la touche a été enfoncée. |