Bonjour ,
pouvez vous me dire comment faire une procédure (sur lazarus) qui, va utiliser un masque pour mettre certain et tous les bit à 0, et un autre avec certain et tous les bits à 1 merci
-----
Bonjour ,
pouvez vous me dire comment faire une procédure (sur lazarus) qui, va utiliser un masque pour mettre certain et tous les bit à 0, et un autre avec certain et tous les bits à 1 merci
AND F0 pour mettre les poids faibles à 0.
OR 0F pour mettre les poids faibles à 1.
merci pour ta réponse mais je suis perdu, il faut que je fasse 2 procédures, l'une qui va mettre les bits à 1, et l'autre à 0. J'ai déjà essayé cette qui les mets à 1 mais rien ne va j'ai plein d'erreurs.
procedure TThreadSerie.SetBitEtatCommand e(valeur : byte);
var
Temporaire : byte;
begin
Temporaire := $00; // 0000 0000 // +1, décale
Temporaire := EtatCommande.PlusDosage and $01; // 0000 0001
Temporaire := Temporaire shl 1; // 0000 0010
Temporaire := Temporaire or (EtatCommande.MoinsDosage and $01); // 0000 0011
Temporaire := Temporaire shl 1; // 0000 0110
Temporaire := Temporaire or (EtatCommande.PlusSaumure and $01); // 0000 0111
Temporaire := Temporaire shl 1; // 0000 1110
Temporaire := Temporaire or (EtatCommande.MoinsSaumure and $01); // 0000 1111
Temporaire := Temporaire shl 1; // 0001 1110
Temporaire := Temporaire or (EtatCommande.PlusLargeur and $01); // 0001 1111
Temporaire := Temporaire shl 1; // 0011 1110
Temporaire := Temporaire or (EtatCommande.MoinsLargeur and $01); // 0011 1111
Temporaire := Temporaire shl 1; // 0111 1110
Temporaire := Temporaire or (EtatCommande.Surdosage and $01); // 0111 1111
Temporaire := Temporaire shl 1; // 1111 1110
Temporaire := Temporaire or (EtatCommande.EmbrayageSaumure and $01); // 1111 1111
end;
// shl shr or and var etat commande
pourquoi tu travailles pas directement en hexa ?
je ne connais pas ce langage mais si tu fais :
if () alors OR $01
if () alors OR $02
if () alors OR $04
if () alors OR $08
if () alors OR $10
if () alors OR $20
if () alors OR $40
if () alors OR $80
Dernière modification par gcortex ; 02/07/2020 à 16h33.
car j’interprète des trames avec des octets, où chaque bit va définir quelque chose.
tes trames sont en binaire ?
pourquoi pas une boucle ?
si tu fais AND $01, seul le bit à la fin compte
Dernière modification par gcortex ; 02/07/2020 à 16h57.
ta fonction doit mettre tous les bits à 1 ? ou juste certains bits ?
1)tout à 1: EtatCommande:= EtatCommande OR $FF; (rien à faire d'autre)
2)certains bits: tu devrais passer en paramètres un byte avec les bits à mettre à 1 (c'est ce que ta fonction semble vouloir faire avec le paramètre valeur)
et donc là encore c'est simplement: EtatCommande:=EtatCommande OR valeur (valeur devant être un mot avec un 1 aux bits à mettre à 1)
Sinon tu dois aussi pouvoir faire directement EtatCommande.PlusSaumure = 1
Pour le forçage à 0, même principe mais en inversant le mot valeur (~valeur je crois, ou not valeur) et AND (&) à la place de or (|)
PS: dans ton code, tu n'utilises pas le paramètre valeur
j'ai oublié de rajouter que pour déterminer valeur, le plus simple c'est d'avoir une enum des bits (qui existe déjà peut-être d'ailleurs) avec bitPlusDosage =$01; bitMoinsDosage=$02; bitPlusSaumure=$04, bitMoinsSaumure=$08; bitPlusLargeur=$10; bitMoinsLargeur=$20; bitSurdosage=$40; bitEmbrayageSaumure=$80
et de faire valeur = bitPlusDosage+bitMoinsSaumure+ bitMoinsLargeur si on veut mettre à 1 les bits correspondant
(pour les passer à 0, valeur = not(bitPlusDosage+bitMoinsSaum ure+bitMoinsLargeur) )