Configuration touche + fonction aléatoire pic 18f452 - C - Programmation
Marsh Posté le 23-05-2006 à 14:07:40
srr a écrit : voila je voudrais savoir si vous pouvez m'aider sur la programmation de la fonction aléatoire en C sur un pic 18f452, cela doit varier entre 0 et 12, et pour configurer les touches d'un clavier toujours pour un pic 18f452? |
Si tu as la bibliothèque C, tu as srand() et rand(). Sinon, Cherche 'Mersenne twister'. est ton ami...
Quand au clavier, sans connaitre le type de materiel associé, impossible de répondre.
Marsh Posté le 24-05-2006 à 09:44:39
merci de ta réponse, le probléme ce que je ne maitrise pas le srand() et rand(), j'ai vu des exemples sur le net, mais ils ne s'appliquent pas à mon µc le 18f452.
Pourrais tu m'aider? ou si quelqu'un peut m'aider se serait sympa.
Merci d'avance
Marsh Posté le 24-05-2006 à 10:14:43
srr a écrit : merci de ta réponse, le probléme ce que je ne maitrise pas le srand() et rand(), j'ai vu des exemples sur le net, mais ils ne s'appliquent pas à mon µc le 18f452. |
Je suis censé deviner pourquoi ? Si tu n'expliques pas le problème, comment je peux t'aider ?
Marsh Posté le 24-05-2006 à 10:24:29
c'est marqué juste au dessus, je veux générer un nombre aléatoire allant de 1 à 12, mais j'aimerais que cette fonction ne soit pas la meme à chaque fois, à chaque reinitialisation. Je programme en C sur un pic 18f452 à l'aide de MPLAB C18
Marsh Posté le 24-05-2006 à 10:25:37
J4ai lu sur le datasheet que la fonction srand() permettait de ne pas avoir la meme sequence à chaque fois, mais vu qu'il n'y à pas d'exemple je n'arrive pas à la faire fonctionner.
Marsh Posté le 24-05-2006 à 10:40:24
srr a écrit : c'est marqué juste au dessus, je veux générer un nombre aléatoire allant de 1 à 12, mais j'aimerais que cette fonction |
Tu veux dire cette valeur ?
Citation : ne soit pas la meme à chaque fois, à chaque reinitialisation. Je programme en C sur un pic 18f452 à l'aide de MPLAB C18 |
Ca, tout le monde a compris, mais tu dis "j'ai vu des exemples sur le net, mais ils ne s'appliquent pas à mon µc le 18f452." sans autres explications.
Ma question est
Si il y a un problème particulier que j'ignore, je préfère être au courant avant de donner une solution qui ne fonctionne pas.
Citation : "je n'arrive pas à la faire fonctionner." |
Et tu penses qu'avec ça je vais pouvoir t'aider ? Si ne montre pas le code qui ne fonctionne pas, je ne vais pas le deviner. Ca parait évident, non ?
Si tu ne veux pas te faire aider, dit le tout de suite... Sinon, donne des éléments précis.
Marsh Posté le 24-05-2006 à 13:43:23
deja les bibliothéques utlisées ne sont pas les mêmes je vais te donner 2 exemples ne pouvant être utilisés
Marsh Posté le 24-05-2006 à 13:43:44
#include <18F452.h>
#include <STDLIB.H>
#include <string.h>
#use delay(clock=40000000)
#use standard_io (D)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define ALL_RIGHT 200 //Clock and counterclock boundaries for how
#define ALL_LEFT 2100 //Far the servo can go
#define MY_RAND_MAX (ALL_LEFT - ALL_RIGHT) // Everything inbetween those boundaries
int32 i;
int16 random;
int16 randPos;
void delay_mine(int16); //this is a function I wrote to
//do longer delays
void main() {
while (true)
{
random = rand();
printf("rand is %ld \n",random);
// The next line takes max value a random number can be (32k) and divides it by
// the biggest number we would ever want (allleft-allright),
// giving us a scaling factor.
// We then divide the actual random number by that factor,
// then add it to allright
// In essence, we take any number between 0 and 32767 and turn
// it into an analogous number between 200 and 2100
randPos = random / (32767 / MY_RAND_MAX) + ALL_RIGHT;
printf("turning to %ld \n",randPos);
i = 150; //again, i varied this
while (i >= 1) {
output_high(pin_D2);
delay_mine(randPos); //varied these too
output_low(pin_D2);
delay_ms(19);
i--;
}
}
}
void delay_mine(int16 realMicros)
{
int16 major;
char minor,x;
major = realMicros / 255;
minor = realMicros % 255;
for( x = major; x>=1; x--)
{
delay_us(255);
}
delay_us(minor);
}
Marsh Posté le 24-05-2006 à 13:44:06
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, x = 0;
int n = (argc > 1) ? atoi(argv[1]) : 1;
/* par défaut on ne génère qu'un seul bit */
srand(time(NULL));
/* initialise la graine en fonction de la date */
for(i = 0; i < n; ++i) {
x = (int)((double)rand()/((double)RAND_MAX+1)*2);
/* cf. man rand (3) */
printf("%d", x);
sleep(0.1); /* fait varier la graine */
}
printf("\n" );
return 0;
}
LA fonction srand(time(NULL)) n'est pas valide avec MPLAB C18.
Pour donner la variation du nombre aléatoire avec rand() max et min, pareil je ne peux le faire.
J'ai fait ce programme à l'aide d'un exemple sur le net mais il me donne la séquence à chaque fois lors du redemarrage.
// fonction aléatoire permettant de génerer un mot sur 16bits
unsigned int my_rand (void)
{
static unsigned int first=0b0000000000000000;
if (first ==0b0000000000000000)
{
srand (0b0);
first=1;
}
return (rand());
}
J'ai fait ce programme pour 16 bits juste pour voir ce que ca donnait, ce n'est pas définitif, je l'ajusterais dés que j'arrive à faire une variation aléeatoire, sans avoir les même sequences à chaque fois.
Marsh Posté le 23-05-2006 à 10:30:51
Bonjour tout le monde,
voila je voudrais savoir si vous pouvez m'aider sur la programmation de la fonction aléatoire en C sur un pic 18f452, cela doit varier entre 0 et 12, et pour configurer les touches d'un clavier toujours pour un pic 18f452?
Merci d'avance