Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

Nombre aléatoire
Tango
Débutant
Débutant
Messages : 39
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#1 Message par Tango » ven. 2 nov. 2018 15:01

Bonjour,

Je veux générer un nombre aléatoire avec un PIC (toujours en Mikrobasic bien sûr !) ou ressemblant, dans le but de réaliser un simulateur de présence. Avez-vous un bout de code qui va bien ? Merci. Cordialement. Bye.
Tango.

Nombre aléatoire
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 442
Âge : 33
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#2 Message par venom » ven. 2 nov. 2018 17:44

Bonjour Tango,

Je ne connais pas du tout Mikrobasic, mais tu n'a pas une fonction type :

Code : Tout sélectionner

Rand() ou random()

Qui gère ça




@++
En fait tout est une question de BIT ? :-D

Nombre aléatoire
Tango
Débutant
Débutant
Messages : 39
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#3 Message par Tango » sam. 3 nov. 2018 11:37

Bonjour venom et merci pour la répons rapide.

Non, il n'y a pas cette instruction dans MikroBasic ni MikroC. Je vais essayer un système d'interruption avec les "timer". Je vous tiens au jus ... Cordialement. Bye.
Tango.

Nombre aléatoire
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 442
Âge : 33
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#4 Message par venom » sam. 3 nov. 2018 22:37

Tango a écrit :Non, il n'y a pas cette instruction dans MikroBasic ni MikroC.


Je ne sais pas si c'est comme en programmation ordinateur. Mais sous mikroc tu a la fonction Srand(x)

A voir si ça correspond a tes attentes. Après je ne suis qu'un amateur dans le domaine. Peut etre que cette réponse est inapproprié :sifflotte:

Si non, au plaisir de voir ta façon de faire :wink:






@++
En fait tout est une question de BIT ? :-D

Nombre aléatoire
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » dim. 4 nov. 2018 00:18

Bonjour,

idea ! Peut être une idée, je te le fait en basic PC, car moi je fais que ASM pour Pic

Code : Tout sélectionner


       
  Dim Durer as integer

  Dim Temps as integer
  
  For Durer 
= 1 to 1000

   If Temps 
>= 255 then 
         Temps 
= 0
    else
      Temps 
= Temps + 1 
  end if
    
 next Durer
  


Relancer 2 fois le programmes, pour avoir un nombre aléatoire

La variable Temps n'est jamais remise à zéro, à par si elle dépasse la valeur préconisé, à chaque relance tu auras des valeurs différente.

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Nombre aléatoire
pspic
Débutant
Débutant
Messages : 45
Âge : 72
Enregistré en : septembre 2017
Localisation : 68

#6 Message par pspic » lun. 5 nov. 2018 07:50

Bonjour,
Voici une solution en MikroBasic (Source: Forum Mikroe) :

Code : Tout sélectionner


 
'Pseudo-Random number generator
dim RANDOM as byte

sub procedure DO_RANDOM
    asm
      RLF     MAIN_GLOBAL_RANDOM,W
      RLF     MAIN_GLOBAL_RANDOM,W
      BTFSC   MAIN_GLOBAL_RANDOM,4
      XORLW   1
      BTFSC   MAIN_GLOBAL_RANDOM,5
      XORLW   1
      BTFSC   MAIN_GLOBAL_RANDOM,3
      XORLW   1
      MOVWF   MAIN_GLOBAL_RANDOM
    end asm
end sub

main:
ADCON1 = 0
TRISB = 0
PORTB = 0
RANDOM = 1

While true
      DO_RANDOM
      PORTB = RANDOM
      delay_ms(500)
Wend
end 

Nombre aléatoire
Tango
Débutant
Débutant
Messages : 39
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#7 Message par Tango » lun. 19 nov. 2018 16:21

Bonjour à vous tous et désolé pour la réponse tardive cause problème réseau. Merci pour vos réponses.

A pspic, pouvez-vous m'indiquer les temps aléatoires maxi et mini ainsi que la fréquence de commutation du PORTB.0 étant donné la boucle sans fin While/Wend. La partie ASM est pour moi difficile à comprendre et je me contente uniquement des langages interprétés. Un commentaire succin en français des lignes de la partie ASM m'aiderait peut-être à comprendre (un peu idea !) cette partie de code plutôt que de la recopier bêtement sans savoir ce qu'elle fait. De toute façon je vais tester ce code et voir le résultat sur un petit PIC style 16F628A. Merci et cordialement.
Tango.

Nombre aléatoire
pspic
Débutant
Débutant
Messages : 45
Âge : 72
Enregistré en : septembre 2017
Localisation : 68

#8 Message par pspic » mar. 20 nov. 2018 15:36

Bonjour, je viens de tester le code que j'ai donné le 5/11, mais il ne fonctionne pas.
Voici un autre testé et à adapter pour PIC 16F ou 18F.
Ce code génère un nombre pseudo aléatoire entre 0 à 255 adaptable par bornes mini maxi.
Attention la séquence de nombres se répète.
Concernant le code assembleur, voir le jeu d'instruction dans la datasheet du PIC concerné.
Quel est ton besoin réel dans quelle plage de nombre et à quelle fréquence ?
en Mikrobasic il existe aussi les instructions Srand et Rand() pour générer des nombres aléatoires entre 0 et 32767

Code : Tout sélectionner

program Rnd1
'Génère un nombre aléatoire entre les bornes Min0 (0) et Max0 (255)
'Testé avec PIC 18F2420 sur Easy Pic 5.

dim Value as byte

'Sub pour PIC 16F
'sub function rnd8_16F(dim _min, _max as byte) as byte
'dim f0 as boolean
'f0 = true
'While f0
'    asm
'      clrf    STATUS
'      rlf     TMR2, 1    'Rotate left sur PIC 16F
'      swapf   TMR2, 0
'      andlw   0xE0
'      rrf     TMR2, 1    'Rotate right sur PIC 16F
'      addwf   TMR2, 0
'      addwf   TMR2, 0
'      addwf   TMR2, 0
'      sublw   0x35
'      movwf   TMR2
'    end asm
'    If (TMR2 <= _max) And (TMR2 >= _min) Then f0 = false end If
'Wend
'result = TMR2
'end sub

'Sub pour PIC 18F
sub function rnd8_18F(dim _min0, _max0 as byte) as byte
dim f0 as boolean
f0 = true
While f0
    asm
      clrf    STATUS
      rlcf    TMR2, 1      'Rotate left sur PIC 18F
      swapf   TMR2, 0
      andlw   0xE0
      rrcf    TMR2, 1      'Rotate left sur PIC 18F
      addwf   TMR2, 0
      addwf   TMR2, 0
      addwf   TMR2, 0
      sublw   0x35
      movwf   TMR2
    end asm
    If (TMR2 <= _max0) And (TMR2 >= _min0) Then f0 = false end If
Wend
result = TMR2
end sub

main:
'Uart1_Init(9600)
PORTB = 0
TRISB = 0

While true
  Value = rnd8_18F(0, 200)  'Entre 0 et 255 maxi)
  LatB = value
  'Uart1_write(Value)
  delay_ms(1000)
Wend
end.


Nombre aléatoire
Tango
Débutant
Débutant
Messages : 39
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#9 Message par Tango » dim. 25 nov. 2018 16:59

Bonsoir,
effectivement, il existe les instructions "Srand et Rand()" en Mikrobasic.
Par exemple si j'entre ces deux instructions après main:

Code : Tout sélectionner

Srand(255)
Rand


il n'y a pas d'erreur de compilation.

Ces deux instructions ne sont pas indiquées dans la Librairie mikroE. Rien trouvé sur le net.
Comment et dans quelle ordre fonctionnent-elles ? Faut-il leur attribuer une variable ?

Pour faire simple, je voudrais allumer une lampe toutes les deux heures environ pendant une durée aléatoire dans une plage de 1 à 15 minutes afin de simuler une présence nocturne.
Encore merci pour votre aide. Cordialement.
Tango

Nombre aléatoire
pspic
Débutant
Débutant
Messages : 45
Âge : 72
Enregistré en : septembre 2017
Localisation : 68

#10 Message par pspic » lun. 26 nov. 2018 15:18

Bonjour,
Srand(x) fixe le point de départ et Rand() génère un nombre aléatoire entre 0 et 32767 avec une séquence qui se répète.
Pour éviter cette répétition il est possible d'utiliser la valeur d'une entrée analogique flottante.
Exemple ci-dessous avec RA0 en l'air.

Code : Tout sélectionner

program GeneNbrAleatoire
'Génère un nombre aléatoire entre 1 et 255.
'Testé avec PIC 18F2420 à 8MHz sur Easy Pic 5.
dim V0, Vp as byte
    V0Str as string[3]
    Va as word
main:
Uart1_Init(9600)
TRISA = 1
PORTB = 0
TRISB = 0
ADC_Init()
Adcon1 = %00001110   'RA0 en entrée ana
While true
  Va = ADC_Read(0)   'Lecture entrée ana RA0 en l'air
  Srand(Va and 15)   'Fixe le point de départ
  V0 = rand()        'Nombre tiré au sort entre 0 et 255
  V0 = V0 and 15     'Filtre sur 0 à 15.
  if V0 = Vp then V0 = V0 - 1 end if 'Anti répétition.
  if V0 < 1 then V0 = 5 end if 'Eliminer le chiffre 0
  Vp = V0                      'Mem valeur précédente.
  LatB = V0                    'Visu sur PORTB
  bytetostr(V0,V0Str)          'Conversion valeur tirée en Txt.
  Uart1_write_Text(","+V0Str)  'Envoi valeur tirée sur UART
  delay_ms(1000)
Wend
end.


Essai sur 2468 tirages:
1 2
2 64
3 36
4 4
5 200
6 174
7 28
8 296
9 180
10 20
11 176
12 408
13 13
14 252
15 615
Total 2468


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité