Fonction Toggle pour Variables

pdevisme1

Senior Member
Bonjour tout le monde, est-ce qu'il existe une fonction, de préférence sous Logicator ou Programming Editor, qui permet d'inverser l'état d'une variable ( un peu comme toggle pour inverser l'état d'une sortie ) ? Je m'explique : pour faire simple j'ai une variable qui doit prendre uniquement les valeurs 1 ou 0 et je voudrais inverser cette valeur, par exemple, à chaque appui sur un bouton poussoir.

Microcontrôleur utilisé : 28X1

Merci d'avance.
 

fuse

Senior Member
Bonjour,
Je pense que la fonction logique XOR (le OU exclusif en français) répond à votre question. Dans PE ou Logicator , il s'agit de l'opération ^

Explication :
avec
A= 3
B= A ^ 255
A= 0000 0011
B = 0000 0011 ^ 1111 1111 = 1111 1100 soit 252 en décimal

Le calcul XOR s'effectue bit à bit et permet l'inversion de chaque bit
rappel XOR
0 ^ 1 = 1
1 ^ 1 = 0

Pour réaliser le programme (l'organigramme) il suffira d'effectuer l'opération ^255 pour inverser la variable.
 

PieM

Senior Member
Bonjour,
si cette variable est une variable type byte, le fait d'utiliser simplement le XOR va inverser tous les bits. ce qui n'est peut être le but recherché.

Si la variable est de type bit, c'est plus simple
bit2 = bit2 ^1

Si la variable est de type byte, il faut sélectionner uniquement le bit LSB puis faire le XOR:

b1= b1 & %00000001 ^ %00000001
si b1= %00000000 il devient %00000001 et inversement (1)

Nota:
Sur un picaxe > 20X2 pour inverser tous les bits, le XOR %11111111 peut être remplacé par ~

b1 = ~b1 inverse tous les bits

Une autre façon d'écrire (1)

b1= NOT b1 & %00000001
 
Last edited:

westaust55

Moderator
un peu comme toggle pour inverser l'état d'une sortie ?
Il y a la commande TOGGLE qui agit directement sur une broche de sortie: http://www.PicAxe.com/Basic-Commands/Digital-InputOutput/Toggle/

Également commande TOGGLEBIT: http://www.PicAxe.com/Basic-Commands/variables/togglebit/

qui peuvent être utiles.Si vous utilisez un IF...THEN est pour vérifier que l'interrupteur d'entrée appuie sur vous peut se comparer à l'état précédent de l'entrée stockée dans une variable bit et si differnet puis bascule l'état de la sortie directement.
 

BESQUEUT

Senior Member
Mais comment faisait-on quand QuickBasic ne connaissait pas la fonction XOR ?
Si A vaut zéro ou un
A=1-A
inverse l'état de la variable.
 

MGU

Senior Member
Bonjour,

Et si la variable est déclarée en type bit (par ex: symbol var=bit0)

var=var+1

fait la même chose

MM
 

Technoman

Senior Member
Dans un rapport sur la sûreté logiciel, écrit il y a déjà quelques temps, nous avions préconisé seulement l'emploi d'opérations logiques. Des cas de bugs avaient été répertoriés faisant état de variables témoin incrémentées ou décrémentées ; au bout de 255 passages dans une boucle la variable retrouvait l'autre état (0) et évidemment, cela avait des conséquences...
 

MGU

Senior Member
Bon, d'accord, si il faut rester "logique":

symbol var=bit0
...
var = not var

Fonctionne bien aussi
 

BESQUEUT

Senior Member
Des cas de bugs avaient été répertoriés faisant état de variables témoin incrémentées ou décrémentées ; au bout de 255 passages dans une boucle la variable retrouvait l'autre état (0) et évidemment, cela avait des conséquences...
Pour une description complète des conséquences potentielles d'un dépassement de capacité, on pourra lire :
http://www.astrosurf.com/luxorion/astronautique-accident-ariane-v501.htm
Pour ceux qui sont pressés, lire en particulier les paragraphes "O" et "P" de la conclusion.
Je note néanmoins que tous les auteurs des formules publiées ci-dessus ont indiqué les conditions de fonctionnement de leurs expressions.
SI on respecte le contexte d'utilisation, aucune d'entre elles ne peut provoquer un dépassement de capacité.
Dans le cas cité ci-dessus, c'est bien l'utilisation d'un programme dans un contexte inapproprié (ou la non-modification du programme pour prendre en compte le nouveau contexte) qui a conduit à la catastrophe.

L'utilisation de fonctions booléennes ne constitue aucunement une garantie si on ne tient pas compte du contexte spécifié.
Par exemple, pour l'expression proposée par MGU :
var est spécifié de type bit.
Mais si on oublie ce contexte et que l'on utilise un byte :
si var=0 alors "var=nor var" donne 255
et si var=1 alors "var=not var" donne 254...

C'est pour être indépendant du type de la variable que j'ai proposé l'expression :
A=1-A
Mais évidement il faut quand même respecter le contexte proposé, à savoir initialiser la variable à zéro ou à un.
 
Last edited:
Top