[PIC et C] : Convertir un BYTE en ... série de bi ts

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From French to

Threaded View
Bonsoir à tous,

Me revoilà avec une nouvelle question : j'ai besoin de convertir un
octet en une série de bits ...

Mon octet est à considérer comme un pourcentage, que je dois mettre a
disposition d'une fonction sous la forme de série de bits représentative
de ce pourcentage. Un peu a la manière d'un rapport cyclique. Cette
fonction vient lire ce bit a intervalles irréguliers.

Ex :
- Octet = 0x00 (0%)   --> série = 0,0,0,0,0,0,... etc sans fin
- octet = 0x80 (50%)  --> série = 0,1,0,1,0,1,...
- octet = 0xCC (80%)  --> série = 1,1,1,1,0,1,1,1,1,0,...
- octet = 0xFF        --> série = 1,1,1,...

A votre avis je fais comment pour générer cette série ?
Merci de vos lumières,
Laurent

Re: : Convertir un BYTE en ... série de bits
On Apr 18, 9:26 pm, Laurent CLAUDE

Quoted text here. Click to load it

Ce bit est-il destinE9% E0% etre transmis physiquement sur une ligne,
ou est-ce juste une donnE9%e soft destinE9%e E0% une fonction ?
(parce-que dans ce dernier cas il y a
sans doute une autre facon de procE9%der)

Ensuite, la sE9%rie de bits a quelle longueur ?
(meme si elle doit etre transmise en continu,
il y a une taille en nombre de bits pour un cycle)


Re: : Convertir un BYTE en ... série de bit s
Le 18/04/2010 23:21, Jean-Christophe a écrit :
Quoted text here. Click to load it

Ce bit est destiné a la fonction soft que j'ai mentionné.
En ce qui concerne une taille de cycle : je suis totalement libre de
faire comme je veux. Il me faut définir la taille en fonction de la
'résolution' qu'elle donnerait a la série, donc je dirais aux alentours
des 16bits.
Mais a savoir : mon octet de départ peut changer a tout moment pendant
la 'transmission' de la série. La série serait alors immédiatement mise
à jour par la nouvelle conversion Octet -> Série.

Tu penses a quoi ?
L.

Re: : Convertir un BYTE en ... série de bits
On Apr 19, 8:26 am, Laurent CLAUDE

Quoted text here. Click to load it

Ok.


Oui bien sur.
Je suis curieux de savoir pourquoi tu as
besoin d'un tel format dans ton programme ?

Quoted text here. Click to load it

Emmanuel m'a battu de vitesse ... lis son post.
Voir ci-dessous la fonction  LectureBit();

Pour mettre E0% jour la valeur de l'octet :
 LectureBit( nouvelle_valeur );

Pour lire la valeur du bit courant de la sE9%rie :
 bit 3D% LectureBit(-1);

Voici la sE9%quence gE9%nE9%rE9%E9 (tu peux changer pour 16 bits)
 0x00 00000000
 0x20 00000001
 0x40 00010001
 0x60 00100101
 0x80 01010101
 0xA0 01011011
 0xC0 01110111
 0xE0 01111111
 0xFF 11111111


// Globales /////////////////////////////////////

const unsigned int mask 3D% 0xFF; // util
unsigned int
 valeur 3D% 0, // la valeur E0% convertir
 complement 3D% 0, // util
 compteur 3D% 0; // util

// Fonction /////////////////////////////////////
// Entree :
// n >3D% 0 : initialise
// n  < 0 : lecture de la valeur du bit courant
unsigned char LectureBit( int n )
{
// initialisation de la valeur
  if( n >3D% 0 )
  { valeur 3D% (unsigned int)(n);
    complement 3D% mask ^ valeur;
    compteur 3D% 0;
    return 0;
  }
// valeur du bit courant
  if( compteur >3D% complement )
  { compteur -3D% complement;
    return 1;
  }
  compteur +3D% valeur;
  return 0;
}

Re: : Convertir un BYTE en ... série de bits
Quoted text here. Click to load it


Avoir une resolution de 16 bits en transmettant un byte (8 bits)  me parait
utopique.
En fait , si j'ai bien compris (ou alors merci de me rectifier) tu veux
faire du PWM.

--

Alain



Re: : Convertir un BYTE en ... série de bit s
Le 19/04/2010 22:30, alain denis a écrit :

Quoted text here. Click to load it

je ne sais pas trop comment t'expliquer la situation, mais il ne s'agit
pas vraiment d'une résolution (d'ailleurs j'avais mis des guillemets
dans mon message), peut être faudrait-il parler de 'précision'...

Pour ce qui est du PWM j'ai aussi regardé de ce côté et il est vrai
qu'on s'en rappoche, mais à ce que j'ai compris, le PWM est lié au
temps. Ce qui n'est pas mon cas, et je ne vois pas de solution par là.

Re: : Convertir un BYTE en ... série de bits
On 20 avr, 00:09, Laurent CLAUDE

Quoted text here. Click to load it

Si ce n'est pas classE9% Secret DE9%fence, pourquoi
ne pas dE9%crire l'application.
Il y a peut d'EA%tre d'autres solutions que tu n'as pas imaginE9%e...

--
-Stan

Re: [PIC et C] : Convertir un BYTE en ... série de bits
Laurent CLAUDE a tapoté du bout de ses petites papattes :
Quoted text here. Click to load it

Tu fais des shifts et tu récupères le bit dans le carry.

--
LeLapin



Re: [PIC et C] : Convertir u n BYTE en ... série de bits
Le 19/04/2010 02:16, LeLapin a écrit :
Quoted text here. Click to load it
Oui, mais le truc c'est de savoir quoi 'shifter'...

Re: [PIC et C] : Convertir un BYTE en ... série de bits
Laurent CLAUDE a tapoté du bout de ses petites papattes :
Quoted text here. Click to load it

J'ai pas dû tout comprendre à ton application. Tu ne peux pas être plus
explicite ?

--
LeLapin



Re: : Convertir un BYTE en ... série de bits
On Apr 20, 1:06A0%am, LeLapin

Quoted text here. Click to load it

C'est vrai que c'est confusing lorsqu'il parle de sE9%rialiser,
parce-que ce n'est pas une simple sE9%rialisation qu'il veut :

---------------------------
valeur | sE9%quence
---------------------------
 0x00  |  00000000
 0x20  |  00000001
 0x40  |  00010001
 0x60  |  00100101
 0x80  |  01010101
 0xA0  |  01011011
 0xC0  |  01110111
 0xE0  |  01111111
 0xFF  |  11111111
---------------------------

Par contre il ne semble pas vouloir dire dans quel but il a
besoin de cet E9%trange format de donnE9%es, c'est dommage.

Re: [PIC et C] : Convertir un BYTE en ... série de bits
Laurent CLAUDE a écrit :
Quoted text here. Click to load it


unsigned char x = valeur à convertir;
unsigned char t = 0; // ou autre, par exemple 0x80. Cela ne change
                      // que le point de départ du cycle.
unsigned char y = 0xff - x; // ou ~x si le compilateur n'est pas capable
                             // d'optimiser lui même.

for (;;)
{
    if (t >= y)
    {
        t -= y;
        // envoyer un bit 1
    }
    else
    {
        t += x;
        // envoyer un bit 0
    }
}

Notez que les cycles sont beaucoup plus longs que ce que vous suggérez
car si 0xff doit correspondre à 100%, 0x80 (par exemple) correspond à un
peu plus de 50% : on n'a pas exactement 0,1,0,1,0,1..., mais tous les
255 ou 256 bits, deux 1 se suivent.

Si une approximation de ces série vous suffit, on peut faire
correspondre 0x100 à 100% et alors il suffit en assembleur d'ajouter x
continuellement à la valeur de départ t (quelconque) et de récupérer le
  bit de retenue. En C, on ne gagnerait pas grand chose car récupérer la
retenue n'est pas une opération élémentaire. Les cycles obtenus pour les
valeurs 0x80 et 0xcc seraient bien ceux que vous suggérez, mais le cycle
de 0xff contiendrait un bit 0 pour 256 bits 1.

--
Emmanuel Lesueur

Re: [PIC et C] : Convertir un BYTE en ... série de bits
Le 19/04/2010 10:30, Usenet Free a écrit :
Quoted text here. Click to load it
Merci de cette réponse,
Je vais avoir besoin de la décortiquer en détails car elle me dépasse un
peu.... je n'ai malheureusement pas trop eu le temps de l'étudier
aujourd'hui, je vois ça demain en me faisant un décorticage pas à pas !

Oui, je peux faire une approx d'un bit sans pb, je ne suis pas à un 1 de
trop.

Merci aussi Jean-Christophe, ton complément va bien m'aider a
décortiquer tout ça !
Peux tu stp me décrire ta variable "mask" dans la ligne
complement = mask ^ valeur;

Merci et a demain,
Laurent


Re: : Convertir un BYTE en ... série de bits
On Apr 20, 5:32A0%pm, Laurent CLAUDE

Quoted text here. Click to load it

C'est un AB% int BB%

Quoted text here. Click to load it

J'ai rien compris.

Re: : Convertir un BYTE en ... série de bit s
Quoted text here. Click to load it

Un PWM donc...

Re: : Convertir un BYTE en ... série de bits
On Apr 20, 9:52 pm, OBones

Quoted text here. Click to load it

Un PWM ca donnerait ca :

00000000
00000001
00000011
00000111
00001111
00011111
00111111
01111111
11111111

Alors que lui il veut ca :

00000000
00000001
00010001
00100101
01010101
01011011
01110111
01111111
11111111

Bon, sans etre strictement identique,
y'aurait comme un cousinage, mais bon.

Re: : Convertir un BYTE en ... série de bits

Quoted text here. Click to load it
==========
Pour un ordinateur , la valeur est toujours une suite de bits  ( 19 decimal
=   "10011" )

Quoted text here. Click to load it
==========
La lecture donnera un nombre,   si tu veux le transformer en "pourcent" de
la course totale du joystick  il faudra effectuer un traitement de la valeur
(valeur trouvée / course totale*100) = data
si (data == 50) data = 0xAA (  binaire :10101010 )
si autre valeur que  0 ou 50  data = ???
==========
Si ton compilateur dispose de la fonction "shift"

fonction d'envoi de chaque bit du registre  data   vers la fonction  de
gestion  usb  "int ecran(void)"

void envoi_fonction_ecran (byte data) {
byte  i;
 for(i=1;i<=8;++i) {
 if(shift_right(&data,1,1))   ecran(1);
else ecran(0);
 delay_
  }
On pourrait écrire : plus simplement
for(i=7;i>0;i--) ecran( (data>>i)&1);





Re: : Convertir un BYTE en ... série de bits
On Apr 21, 9:07 am, "maiorE9%"

Quoted text here. Click to load it

Le bit zE9%ro n'est pas traitE9%.

Re: : Convertir un BYTE en ... série de bit s
Le 20/04/2010 22:15, Jean-Christophe a écrit :
Quoted text here. Click to load it

Ok, j'ai fais mes essais et ça marche très bien !

Effectivement hier j'ai eu quelques cafouillages entre unsigned char et
byte, valeur positive ou négative pour initialiser, etc... pas très
précis car trop de fatigue, désolé.
Il est vrai aussi que je converti une valeur qui n'est pas un
pourcentage, mais c'était dans l'intention d'être plus 'humainement'
compréhensible. Raté aussi, décidément... Jean-Christophe si tu veux que
je reformule dit le moi.

Bref, j'ai décortiqué vos propositions, j'ai pris le temps d'analyser
pour comprendre, et maintenant en situation de tests c'est nickel aussi.
Je vous remercie donc tous encore une fois pour votre soutient, votre
patience ;-) et votre talent !

N'ayez crainte, je vais revenir prochainement ici avec mes questions
tordues !!

Laurent

Re: [PIC et C] : Convertir un BYTE en ... série de bits

Quoted text here. Click to load it
===========
Il faut etudier sérieusement les instructions de manipulation de bits de ton
compilateur
De maniere à présenter à la fonction(?) .. ce qu'elle réclame
on peut utiliser les  pointeurs de chaîne
ou les instructions
int  xxx << n décalage à gauche de n
int xxx >> n  décalage à droite
Le masquage "&"
les instructions spécifiques :
shift_right()
shift_left()
bit_clear()
bit_set
bit_test()



Site Timeline