Interprétation de TIMSK1 | = (1 << TOIE1) ;

Bonjour les copains,
Toujours dans le cadre de la programmation de loisir je suis en train de vous concocter plusieurs petites applications bien sympathiques. Dans ce cadre, je suis amené à utiliser le TIMER1 du microcontrôleur.

Dans les exemples que je trouve sur la toile, il y a l'instruction :

TIMSK1 | = (1 << TOIE1) ;

dont je ne comprend pas bien l'écriture.

Son but consiste à forcer un "1" dans le bit TOIE1 du registre TIMSK1. (J'ai compris le but.)
Mais pourquoi une telle écriture ?
Pouvez-vous me l'interpréter car, si je lis << comme du décalage à gauche, je ne vois pas pourquoi on décale TOIE1 dans 1 ???
par ailleurs, j'ai tenté de faire un OU avec un masque logique ... ben ça ne fonctionne pas.
Pouvez-vous m'expliquer ces détails en apparence assez étrange SVP ?
Merci d'avance.

Merci pour ton explication qui dévoile clairement une partie du mystère.
Mais pourquoi une opération de type OU banale ne fonctionne pas ?
par exemple remplacer
TIMSK1 |= (1 << TOIE1);
par
TIMSK1 = TIMSK1 | 4;

Un OR va retourner un simple booléen , pas un octet complet dont seul un des 8 bits a été modifié.

Je ne saisis pas vraiment pourquoi.
Si je veux forcer une sortie à "1" je peux coder :

B = 6;
B = B | 1; // B sera égal à 7.

Ce type de codage permet de forcer des "1" directement sur les ports de sortie.
J'utilise régulièrement et ça marche.

Du coup je ne saisis pas pourquoi ce type d'opérande retournerait un booléen.

Quoi qu'il en soit merci pour ton information ... il ne me reste plus qu'à tester.

Christian_R:
Un OR va retourner un simple booléen , pas un octet complet dont seul un des 8 bits a été modifié.

Non, l'opérateur || retourne effectivement un booléen , mais l'opérateur | effectue un OU binaire bit à bit et retourne le résultat de l'opération.

nulentout:
Je ne saisis pas vraiment pourquoi.
Si je veux forcer une sortie à "1" je peux coder :

B = 6;
B = B | 1; // B sera égal à 7.

Ce type de codage permet de forcer des "1" directement sur les ports de sortie.
J'utilise régulièrement et ça marche.

Tu as raison. En fait c'est juste une affaire de goût personnel.
La notation TIMSK1 |= (1 << TOIE1); permet simplement d'indiquer un bit par son numéro, ou plutôt par une constante qui permet de s'en souvenir plus simplement que d'avoir à utiliser la valeur binaire du bit correspondant.

TOIE1 comme bien d'autres mnémoniques sont définis dans les fichiers de l'avr-libc ou gcc-avr, enfin c'est fait par ATMEL.
Il suffit d'explorer le fichier concerné. Pour Atmega328p : iom328p.h .
Ces fichiers sont utilisés par l'IDE arduino.

Pour moi sous Linux Debian le chemin d'accès est :
/usr/lib/avr/include/avr/iom328p.h

Bonnes fouilles archéologiques :grin: .

Merci pour toutes ces explications les copains.
Elles sont détaillées et je vais pouvoir vraiment travailler avec.
Pour ce qui concerne les sigles relatifs aux registres de l'ATmega, j'ai ma documentation en français en "permanence" dans mon espace de travail sur l'ordinateur, c'est un impératif quand on commence à aborder l'utilisation des ressources interne du microcontrôleur.
Encore merci les copains, je vais revoir toutes ces explications en détail jusqu'à les assimiler.
Ceci dit, j'ai bien compris (En espérant ne pas me tromper) qu'il s'agit d'une optimisation du compilateur associée à une lecture plus aisée de l'écriture des programmes.