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 ---
- 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 ---
Modérateur : Gérard
Nombre aléatoire
Nombre aléatoire
Bonjour Tango,
Je ne connais pas du tout Mikrobasic, mais tu n'a pas une fonction type :
Qui gère ça
@++
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
@++
Nombre aléatoire
Nombre aléatoire
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é
Si non, au plaisir de voir ta façon de faire
@++
Nombre aléatoire
Bonjour,
Peut être une idée, je te le fait en basic PC, car moi je fais que ASM pour Pic
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+
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+
Nombre aléatoire
Bonjour,
Voici une solution en MikroBasic (Source: Forum Mikroe) :
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
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 ) 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.
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 ) 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
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
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
Bonsoir,
effectivement, il existe les instructions "Srand et Rand()" en Mikrobasic.
Par exemple si j'entre ces deux instructions après main:
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
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
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.
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
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 67 invités