| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| fr:avr:registers [2010/03/18 14:37] – sdeniaud | fr:avr:registers [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| [{{ :images:logic:register_buttons_and_bits.png?240|Les "boutons" du registre et la valeur des bits}}] | [{{ :images:logic:register_buttons_and_bits.png?240|Les "boutons" du registre et la valeur des bits}}] |
| |
| Puisque l'état des interrupteurs du registre peut facilement être traité comme un nombre et vice versa, un registre peut être comparé à une mémoire, qui peut contenir des données de la taille d'un nombre. Par cette comparaison, nous voyons que les registres sont en réalité des créneaux de mémoire. La différence entre un registre et un créneau de mémoire est qu'une créneau de mémoire stocke seulement les informations, alors que dans un registre ces informations contrôlent en réalité quelque chose. Par exemple, si une valeur binaire de 01100001 est écrite à un registre, cela signifie que trois boutons imaginaires sont appuyés et quelque chose arrive. | Puisque l'état des interrupteurs du registre peut facilement être traité comme un nombre et vice versa, un registre peut être comparé à une mémoire, qui peut contenir des données de la taille d'un nombre. Par cette comparaison, nous voyons que les registres sont en réalité des créneaux de mémoire. La différence entre un registre et un slot de mémoire est qu’un slot de mémoire stocke seulement les informations, alors que dans un registre ces informations contrôlent en réalité quelque chose. Par exemple, si une valeur binaire de 01100001 est écrite à un registre, cela signifie que trois boutons imaginaires sont appuyés et quelque chose arrive. |
| |
| Avec un lecteur de cassette il est possible d'appuyer sur chaque bouton séparément, mais dans un registre il est plus difficile de changer la valeur d'un "interrupteur" ou le bit. Concrètement il est nécessaire de changer le contenu entier du registre. Avant le changement de la valeur d'un bit, il faut savoir qu'il y a beaucoup de registres dans un micro-contrôleur. Certaines parties du micro-contrôleur utilisent des dizaines de registres pour les contrôler. La variété des registres signifie qu'il y doit avoir une façon de distinguer les différents des registres ce que l'on réalise en les nommant. Un registre, par exemple, est appelé PORTB. En réalité, ces noms doivent juste rendre les choses plus faciles pour le développeur et chaque nom correspond à une adresse numérique. | Avec un lecteur de cassette il est possible d'appuyer sur chaque bouton séparément, mais dans un registre il est plus difficile de changer la valeur d'un "interrupteur" ou le bit. Concrètement il est nécessaire de changer le contenu entier du registre. Avant le changement de la valeur d'un bit, il faut savoir qu'il y a beaucoup de registres dans un micro-contrôleur. Certaines parties du micro-contrôleur utilisent des dizaines de registres pour les contrôler. La variété des registres signifie qu'il y doit avoir une façon de distinguer les différents des registres ce que l'on réalise en les nommant. Un registre, par exemple, est appelé PORTB. En réalité, ces noms doivent juste rendre les choses plus faciles pour le développeur et chaque nom correspond à une adresse numérique. |
| </code> | </code> |
| |
| Il n'y a rien de difficile à écrire et lire les valeurs d'un registre, mais il devient un peu délicat si on doit modifier seulement un bit. Pour modifier des bits, on a besoin d'avoir des connaissances en mathématiques binaires et utiliser des systèmes numériques différents. Il ne serait pas impossible de ne traiter que des nombres binaires, mais ils peuvent être un peu ennuyeux, parce que des nombres binaires sont assez long et c'est pourquoi la plupart des personnes utilisent des nombres hexadécimaux plus courts. | Il n'y a rien de difficile à écrire et lire les valeurs d'un registre, mais il devient un peu délicat si on doit modifier seulement un bit. Pour modifier des bits, on a besoin d'avoir des connaissances en mathématiques binaires et utiliser des systèmes numériques différents. Il ne serait pas impossible de ne traiter que des nombres binaires, mais ils peuvent être un peu ennuyeux, parce que des nombres binaires sont assez longs et c'est pourquoi la plupart des personnes utilisent des nombres hexadécimaux plus courts. |
| |
| [{{ :images:logic:logic_hexadecimal.png?209|Nombres hexadécimaux}}] | [{{ :images:logic:logic_hexadecimal.png?209|Nombres hexadécimaux}}] |
| [{{ :images:logic:logic_all_4.png?550 |Négation, multiplication logique, addition logique et séparation exclusive}}] | [{{ :images:logic:logic_all_4.png?550 |Négation, multiplication logique, addition logique et séparation exclusive}}] |
| |
| ~~PB~~ | <pagebreak> |
| |
| * **Négation / Inversion** \\ Le négation inverse la valeur du bit, un 0 devient 1 et vice et versa. En C, la négation correspond au symbole "~". | * **Négation / Inversion** \\ Le négation inverse la valeur du bit, un 0 devient 1 et vice et versa. En C, la négation correspond au symbole "~". |
| </code> | </code> |
| |
| ~~PB~~ | <pagebreak> |
| |
| ==== Inverser la valeur d'un bit ==== | ==== Inverser la valeur d'un bit ==== |
| [{{ :images:logic:op_bit_get.png?229|Lire la valeur d'un bit}}] | [{{ :images:logic:op_bit_get.png?229|Lire la valeur d'un bit}}] |
| |
| Pour lire une ou plusieurs valeurs d'un bit d'un registre la même opération que pour mettre un bit en position basse est nécessaire - la multiplication logique. L'un des opérants doit être le registre et l'autre le bitmask, où le seul bit en position haute est celui que l'on doit lire sur le registre.Ci-dessous le code de C correspondant à l'opération montrée à droite : | Pour lire une ou plusieurs valeurs d'un bit d'un registre la même opération que pour mettre un bit en position basse est nécessaire - la multiplication logique. L'un des opérants doit être le registre et l'autre le bitmask, où le seul bit en position haute est celui que l'on doit lire sur le registre. Ci-dessous le code de C correspondant à l'opération montrée à droite : |
| |
| ~~CL~~ | ~~CL~~ |
| </code> | </code> |
| |
| ~~PB~~ | <pagebreak> |
| |
| ==== Shifting a bit ==== | ==== Déplacer la valeur d'un bit ==== |
| |
| Many programming languages actually have a few additional bitwise operations, which make it easier for the programmers. These are bit shifting operations that shift bits left or right in a binary number. The main value of shift operations in dealing with registers is their ability to convert bit ranks to bitmasks and vice versa. | Beaucoup de langages de programmation ont en réalité quelques opérations bitwise supplémentaires, qui le rendent plus facile pour les programmeurs. Celles-ci sont des opérations de déplacement de bits qui les déplacent vers la gauche ou vers la droite dans un nombre binaire. La valeur principale de l'opération de déplacement traitant avec des registres est sa capacité à convertir des rangs de bits en bitmasks et vice versa. |
| |
| [{{ :images:logic:op_bit_shift_left.png?241|Shift left}}] | [{{ :images:logic:op_bit_shift_left.png?241|Déplacement à gauche}}] |
| |
| The image on the right shows a shift left operation. Although bit shifting is not a logical operation and has no corresponding symbol, in C it is marked as "<<". Shift left is used to transform a bit rank to a bitmask. For example, to get the mask for the 6th bit (NB! rank 5), number 1 has to be shifted left 5 times. The example operation looks like this in C: | L'image à droite montre une opération de déplacement à gauche. Bien que le déplacement de bit ne soit pas une opération logique et n'ait aucun symbole correspondant, en C il est marqué par "<<". Le déplacement à gauche est utilisé pour transformer le rang d'un bit en un bitmask. Par exemple, pour obtenir le masque pour le 6ème bit (NB! Au rang 5), le chiffre 1 doit être déplacé de 5 fois vers la gauche. L'opération en C ressemble à ça: |
| |
| ~~CL~~ | ~~CL~~ |
| </code> | </code> |
| |
| [{{ :images:logic:op_bit_shift_right.png?241|Shift right}}] | [{{ :images:logic:op_bit_shift_right.png?241|Déplacement à droite}}] |
| |
| Shift right operation works similarly to shift left operation. It is marked as ">>" in C. Right shift is used to get the logical value of a bit from a bitmask. A leading example showed how to read the value of a single bit. Let's suppose the bit to read is not of the lowest rank, but for example of rank 5. In this case, the result would be either 0x20 or 0x00, but sometimes a result of 1 or 0 is needed and that is when the right shift comes to the rescue. The example operation on the right looks like this in C: | L'opération de déplacement à droite fonctionne de la même manière que celle à gauche. Elle est représentée par le symbole ">>" en langage C. Le déplacement à droite est utilisé pour récupérer la valeur logique d'un bit à partir d'un bitmask. Un exemple principal montre comment lire la valeur d'un bit simple. Ce qui suppose que le bit qui doit être lu n'est pas à son rang le plus bas, mais par exemple au rang 5. Dans ce cas le résultat pourrait à la fois être 0x20 ou 0x00, mais parfois il est nécessaire d'avoir ou 0 ou 1 comme résultat, c'est dans ce cas que l'on utilise le décalage à droite. L'opération en C ressemble à ça: |
| |
| ~~CL~~ | ~~CL~~ |
| </code> | </code> |
| |
| If a bit is shifted right from the lowest rank or left from the highest rank by the bit shifting operation, it disappears. Some programming languages also have rotating bit shift operations, where the bit doesn't disappear, but moves from the lowest rank to the highest or vice versa. C doesn't have that kind of bit shift operations, but they can be written by the programmer if needed. | Si un bit est déplacé vers la droite à partir du rang le plus bas ou vers la gauche à partir du rang le plus haut, alors il disparaît. Certains langages de programmation contiennent des opérations de déplacement de bits rotatives, avec lesquelles le bit ne disparaît pas, mais se déplace du rang le plus haut vers le rang le plus bas et vice versa. Le langage C ne prévoit pas ce type d'opération, mais rien n'empêche le programmeur de l'écrire si nécessaire. |
| |
| All bit operations work with not only registers, but with variables and constants as well. The latter can of course only be used as operands and not the result. | Toutes les opérations sur les bits ne fonctionne pas seulement avec les registres, mais aussi avec les variables ou les constantes. Ce dernier peut bien sur être utilisé comme opérande et non comme résultat |
| |
| ===== AVR registers ===== | ===== Les registres AVR ===== |
| |
| To do anything actual with the microcontroller's registers, one needs to know how to use that particular microcontroller. Each microcontroller comes with one or several datasheets, which describe the whole structure and functionality or the microcontroller. The datasheet also describes the registers. The following will help understand the register descriptions in AVR datasheets. | Pour faire quoi que ce soit avec les registres du micro-contrôleur, il est nécessaire de connaître l'utilisation de ce micro-contrôleur en particulier. Chaque micro-contrôleur est accompagné d'une ou plusieurs fiches techniques, qui décrivent la structure entière et les fonctionnalités du micro-contrôleur. La fiche technique décrit aussi les registres. L'exemple suivant permettra de comprendre les descriptions des registres dans les fiches techniques AVR. |
| |
| [{{ :images:logic:avr_example_register.png?580 |One of AVRs registers from its datasheet}}] | [{{ :images:logic:avr_example_register.png?580 |L'un des registres AVR dans sa fiche technique}}] |
| |
| The image shows ATmega128 microcontroller's UCSRnA register, which stands for "USART Control and Status Register A". This register is used to configure AVR's USART module and read its states. All AVR register names are written in capital letters, but as the reader might notice, the register name contains also a lower case n. A lower n is used to mark some module's index. Since ATmega128 has 2 almost identical USART modules, they are not described twice, but only once and the n must be read as 0 or 1 by the user. Therefore ATmega128 has registers UCSR0A and UCSR1A. | L'image montre le registre UCSRnA du micro-contrôleur ATmega128, qui supporte "le contrôle USART et le statut du registre A". Ce registre est utilisé pour configurer le module USART de l'AVR afin d'en lire ses statuts. Tous les noms de registres de l'AVR sont écrits en lettre capitales, mais le lecteur notera que le nom du registre contient la lettre minuscule n. On utilise un n minuscule pour identifier l'index du module; Certains ATmega128 contiennent deux modules USART identiques, qui ne sont décrit qu'une seule fois, l'utilisateur remplacera alors le n par un 0 ou 1. ATmega128 contient donc les deux registres UCSR0A et UCSR1A. |
| |
| The content of the register is marked by an 8-slot box with a bold line around it. Each slot marks one bit. Bit ranks are marked above the box - increasing from right to left. Since AVR is an 8-bit microcontroller, most of the registers are 8-bit as well. There are some exceptions, a few registers are 16-bit, but they actually consist of two 8-bit registers. Like each register has a name, each bit in the register has also a name - just like the buttons on a tape player. Each bit is described in the datasheet. Bit names are abbreviations as well and the lower n must be substituted with the module's index, just like with register names. Some registers don't use all 8 bits, in this case the bit's slot is marked with a hyphen. | Le contenu d'un registre est représenté par une boîte à 8 slots avec une ligne en gras. Chaque slot représente un bit. Les rangs des bits sont marqués au-dessus de la boîte - en croissant de droite à gauche. Puisque AVR est un micro-contrôleur de 8 bits, la plupart des registres sont de 8 bits aussi. Il y a quelques exceptions, quelques registres sont de 16 bits, mais ils consistent en réalité en deux registres de 8 bits. Comme chaque registre a un nom, chaque bit dans le registre a aussi un nom - comme les boutons sur un lecteur de cassette. Chaque bit est décrit dans la fiche technique. Les noms de bit sont des abréviations et la lettre n minuscule peut être remplacée par l'index du module, comme avec les noms de registre. Quelques registres n'utilisent pas tous les 8 bits, dans ce cas le slot du bit est marquée avec un trait d'union. |
| |
| Below the register's bits are two lines, which state whether the bit is readable (R), writable (W) or both (R/W). For example, the status bits can't be overwritten and even if it's attempted in the program, the bit will remain unchanged. If the bit is marked as writable, reading it will always result in one specific value stated in the datasheet. The second line specifies the default value of the bit, which it has after the reset of the microcontroller. | Au-dessous des bits du registre on trouve deux lignes, qui définissent si le bit est en lecture (R), en écriture (W) ou les deux (R/W). Par exemple, les bits de statut ne peuvent pas être écrasés et même s'il est essayé dans le programme, le bit restera inchangé. Si le bit est marqué en écriture, la lecture aboutira toujours à une valeur spécifique définie dans la fiche technique. La deuxième ligne spécifie la valeur par défaut du bit, valeur prise après chaque remise à zéro du micro-contrôleur. |
| |
| While AVR register names point to an actual memory slot address, the bit names hold the rank number of the corresponding bit. Therefore it is necessary to transform the names to bitmasks using a shift operation, in order to manipulate with bits in a register. The following code contains a few example lines for using the USART 0 module's register. | Tandis que le de noms des registres de l'AVR pointent vers une adresse de slot de mémoire réelle, les noms de bits gardent le numéro du rang du bit correspondant. Donc il est nécessaire de transformer les noms en bitmasks en utilisation d'une opération de déplacement, pour manipuler les bits dans un registre. Le code suivant contient quelques lignes d'exemple pour utiliser le registre du module USART 0. |
| |
| <code c> | <code c> |