====== Architecture ====== AVR a un bus interne de données de 8 bits, par lequel on traite les données entre l'unité arithmétique de logique (ALU), le statut du registre (SREG), le compteur du programme (le PC), la mémoire vive (SRAM) et les périphériques. Le programme, une liste de commandes, qui sont exécutées dans l'ALU viennent d'une adresse dans la mémoire flash, indiquée par le compteur du programme. L'ALU a 32 registres de 8 bits, qui sont utilisés comme des opérandes en effectuant des instructions. [{{ :images:avr:avr_atmega128_block_diagram.png?580 |Block diagramme de l'ATmega128}}] ===== Instruction ===== L'AVR a deux étapes d'instructions. Lorsqu'une instruction est exécutée, la suivante est rapportée de la mémoire du programme. C'est pourquoi réaliser des instructions de saut prend 2 cycles sur l'accomplissement de la condition de saut. Puisque la nouvelle instruction est toujours allée chercher à l'adresse de mémoire suivante, il est nécessaire de renoncer à l'instruction précédente pour permettre d'aller chercher une nouvelle en sautant à une autre adresse, parce qu'il a été allé chercher une ancienne, à un faux emplacement. ===== Objectif général d'un registre ===== Le but général d'un registre R0-R31 est proche de celui d'un buffer pour stocker et traiter a la fois avec la mémoire et des données externes. Ils simplifient l'architecture du processeur, parce qu'ils sont rapidement accessibles par l'ALU et l'utilisation du bus de données pour lire des opérandes de la mémoire n'est pas nécessaire pour chaque opération. Les objectifs des registres sont utilisés pour exécuter toutes les opérations arithmétiques et logiques concernant les données. En programmant dans l'assembleur, il est possible de stocker les données urgentes dans des registres de but généraux. En programmant en C il apparaît un besoin de stocker une variable dans un registre, la variable est de plus définie comme "le registre". Par exemple: register char x; ===== Instructions de configuration ===== Les instructions de la plupart des AVRS consistent en 90-133 instructions différentes. ATmega128 a 133 instructions. Les instructions ont un, deux ou aucun opérande. La plupart des instructions prennent seulement un cycle pour être achevé, mais les plus complexes peuvent utiliser jusqu'à 5 cycles. Pour XMEGA, le successeur d'AVR, plusieurs instructions ont été modifiées pour utiliser moins de cycles. La plupart des instructions dans AVR sont utilisées pour des sauts, des déplacements et des comparaisons des données et exécutant des calculs arithmétiques. Un registre de statut est utilisé pour des calculs performants et des comparaisons. Il stocke le statut de sortie de l'ALU - si le résultat est négatif, positif, zéro, a excédé le maximum permis par la valeur (8 bits), a besoin de transférer un bit vers l'opération suivante etc (il y a quelques cas plus complexes). Voici un exemple de code rédigé en Assembleur qui contient de simples instructions, qui ajoutent 5 à un bit au hasard dans l'adresse de la mémoire $100 (256 en décimal). Ces instructions existent dans tous les AVR. ldi r1, 5 ; Load the constant 5 to general purpose register r1 lds r2, $100 ; Load the byte from the memory to register r2 add r2, r1 ; Add the value of r1 to r2 sts $100, r2 ; Write the value of r2 back to the memory ===== Le programme stack ===== Le programme stack est une structure de données, où les dernières données écrites dans la mémoire sont lues d'abord. Le programme stack de l'AVR'S peut être utilisé en opérant avec des sous-programmes, des interruptions et des données temporaires. Avant l'exécution d'un sous-programme ou d'une interruption, l'adresse dans le compteur du programme où le programme a été interrompu est stocké dans le stack. Quand le sous-programme ou l'interruption a terminé son exécution, cette adresse est lue et le programme continue de l'adresse où il a cessée auparavant. Le stockage de données temporaire dans le stack est d'habitude utilisé en traitant avec des morceaux plus courts de code, qui n'utilise pas la mémoire réservée au cours de l'exécution du programme. Des programmes d'assembleur plus simples sont d'habitude écrits pour qu'il ne soit pas nécessaire d'utiliser le stack, mais si le programme contient beaucoup de variables et des fonctions, les compilateurs s'en servent automatiquement. Le stack des micro-contrôleurs de série MegaAVR sont localisés physiquement dans la mémoire vive. Quelques dispositifs de la série tinyAVR n'ont pas de mémoire vive du tout et le stack est traité séparément, l'unité de mémoire assez limitée. Typiquement il n'y a aucun compilateur pour des matériels sans mémoire vive. Pour programmer dans une langage de plus haut niveau (le Pascal, C, C ++), il n'est pas nécessaire d'être familier avec les fonctions internes du micro-contrôleur, parce que le compilateur est capable de choisir les registres et les instructions séparément, mais savoir ce qu'il se passe dans le contrôleur est certainement avantageux. Il est nécessaire de connaître les instructions du micro-contrôleur en développant des applications critiques en termes de temps, où les opérations doivent être achevées avec une quantité limitée de cycles.