Table des matières

Cet article est une ébauche à compléter, vous pouvez partager vos connaissances en le modifiant.

AVR

Les AVR (Advanced Virtual RISC ) d’Atmel sont de la famille des microcontrôleurs RISC. L’architecture a été conçue par deux étudiants de l’institut de technologie de Norvège (NTH : Norges Tekniske Høgskole).

Les AVR sont basés sur une architecture CPU Harvard modifiée. Ils disposent de 32 registres de travail de 8 bits. Ils permettent d'approcher la vitesse d'une instruction par cycle d'horloge, soit par exemple près de 20 millions d'instructions par seconde avec une horloge à 20 MHz.

Gamme des microcontrôleurs

Les AVR sont divisés en familles ayant chacune ses spécificités.

Pourquoi choisir les AVR ?

Le reste je vous laisse le découvrir dans le tutorial qui suit ou dans le datasheet ;-)

Les ports d'entrée / sortie

DDRx : Registre qui impose la direction des ports. ex: DDRA=0b11110000 ; les bits 0 à 3 du portA sont configurés en entrée et de 4 à 7 en sortie.

PORTx : Registre d'écriture des niveaux logiques sur le port x ex: PORTA=0b11110000 ; Si le port est en sortie (voir DDRx), les bits 0 à 3 du portA passent à l’état bas et de 4 à 7 à l’état haut.

PINx : Registre de lecture des niveaux logiques sur le port x

Résistance de tirage

Chaque pin de chaque port possède une résistance de tirage activable en mettant la pin en question en entrée (Registre DDRx) et en mettant le niveau logique à 1 (PORTx)
ex : DDRA=0b10101010 et PORTA=0b11111111 ; Les résistances de tirage sont actives sur les pins 0,2,4,6 du port A. les autres pins sont en sortie et au niveau haut.

Le bit PUD (Pullup disable) du registre SFIOR permet de désactiver toutes les résistances de tirage sur tous les ports.

La résistance de tirage est comprise entre 20 et 50kΩ

Récapitulatif

DDRx PORTx Entrée/Sortie Résistance de tirage Description
0 0 Entrée Non La pin est en entrée en haute impédance
0 1 Entrée Oui La pin est en entrée avec résistance de tirage
1 0 Sortie Non La pin est en sortie et au niveau bas
1 1 Sortie Non La pin est en sortie et au niveau haut

Lecture d'une pin

Entre la mise en entrée d'une pin et sa lecture il faut qu'au moins 1 cycle d'horloge s'écoule. Si vous souhaitez lire immédiatement la pin après l'avoir mise en entrée intercalez un nop entre la configuration de DDRx et la lecture de PINx. Voir l'exemple en C.

Pin non connecté

Il est recommandé d'activer la résistance interne, pour fixer un niveau logique à l’entrée, si elle n'est pas utilisée. Ca ne coûte rien et ça réduit la consommation. Ne la connectez pas à VCC ou GND en cas d'erreur de config vous risquez de court-circuiter la pin.

Interruptions externes

Les interruptions externes sont déclenchées sur un changement d’état des pins INT0, INT1 ou INT2.
Les interruptions peuvent être déclenchées sur un front descendant, montant ou un niveau bas. (INT2 ne peut être déclenchée que sur des fronts) Le niveau apres un front doit être maintenu au moins pendant la durée d'un cycle d'horloge.

Configuration du déclenchement

MCUCR :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00

Bit 1 et 0 - ICS01 et ICS00 servent à configurer INT0.
Bit 3 et 2 - ICS11 et ICS10 servent à configurer INT1.

ISC11 ISC10
ISC01 ISC00 Description
0 0 Interruption sur niveau bas
0 1 Interruption sur front montant ET descendant
1 0 Interruption sur front descendant
1 1 Interruption sur front montant

MCUCSR :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
JTD ISC2 - JTRF WDRF BORF EXTRF PORF

Bit 6 - ISC2

ISC2 Description
0 Interruption sur front descendant
1 Interruption sur front montant

Choix de l'interruption

GICR :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
INT1 INT0 INT2 - - - IVSEL IVCE

L'interruption de INT1 est activée si INT1 (bit 7) est à 1
L'interruption de INT0 est activée si INT0 (bit 6) est à 1
L'interruption de INT2 est activée si INT2 (bit 5) est à 1

Interruption globale

L'interruption n'est activée que si le bit I (Interruption globale) du registre SREG est activé.
La moyen le plus simple de l'activer est d'utiliser la fonction sei

Voir l'exemple en C : Utiliser les Interruptions externes

Timer

Introduction

Un timer est un compteur cadencé par une horloge.

L’horloge peut :

Le timer peut :

Les applications possibles sont :

Timer 0 (8 bit)

Source de l'horloge

Le timer peut être cadencé par un signal appliqué sur la pin T0 ou par l'horloge système.


T0

Le signal appliqué sur T0 doit avoir une fréquence inférieure à la fréquence système / 2.5 et un rapport cyclique de 1/2.

Configuration du déclenchement

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00

Bit 2,1 et 0 :

CS02 CS01 CS00 Description
0 0 0 Timer désactivé
1 1 0 Incrémentation du timer sur front descendant de T0
1 1 1 Incrémentation du timer sur front montant de T0

Horloge système

L'horloge système (quartz, oscillateur RC interne etc) passe par un diviseur de fréquence appelé “prescaler”. Ce prescaler permet de diviser la fréquence appliquée au compteur (timer) par 8,64,256 ou 1024.

Diviseur de fréquence (Prescaler)

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00

Bit 2,1 et 0 :

CS02 CS01 CS00 Description
0 0 0 Timer désactivé
0 0 1 Fréquence système
0 1 0 Fréquence système/8
0 1 1 Fréquence système/64
1 0 0 Fréquence système/256
1 0 1 Fréquence système/1024

Mode de fonctionnement

Normal

Le compteur va s'incrémenter jusqu'à sa valeur max, soit en 8 bit 0xFF.
Arrivé à 0xFF, il recommencera à partir de 0x00 jusqu'à 0xFF et ainsi de suite.

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
WGM01 WGM00 Description
0 0 Timer en mode normal
CTC (Clear time on compare match)

Le compteur va s'incrémenter jusqu'à la valeur du registre OCR0.
Arrivé à la valeur de OCR0, il recommencera à partir de 0x00 jusqu'à la valeur de OCR0 et ainsi de suite. OCR0 définit donc la valeur max du compteur. OCR0 doit être inférieur à 0xFF.

:avr:timer_ctc.jpg

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
WGM01 WGM00 Description
1 0 Timer en mode CTC
Fast PWM

FIXME

:avr:timer_fast_pwm.jpg

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
WGM01 WGM00 Description
1 1 Timer en mode Fast PWM
Phase Correct PWM

FIXME

:avr:timer_phase_correct_pwm.jpg

TCCR0 :

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
WGM01 WGM00 Description
0 1 Timer en mode Phase Correct PWM

Interruption

FIXME


Sortie OC0

FIXME

USART

USART : Universal Synchronous and Asynchronous serial Receiver and Transmitter, liaison série synchrone et asynchrone.

Vous verrez souvent parlez d'UART plutôt que d'USART, sachez que l'USART imbrique toutes les fonctionnalités de l'UART.

TWI (I2C)

FIXME

Comparateur analogique

FIXME

CAN

FIXME

Programmateur / Debuggage

Il existe plusieurs méthodes de programmation :

Programmation ISP (In System Programming)

C'est la méthode de programmation la plus courante et la plus simple. Vous pouvez réaliser un programmateur pour quelques euros.
Cette méthode de programmation permet de programmer directement un microcontrôleur dans son système; càd qu'il n'est pas nécessaire de déconnecter le micro de son système pour le reprogrammer.

Programmateurs supportant ce mode de programmation : STK500, Dongle AVR ISP 2

Programmation - Debuggage JTAG (Joint Test Action Group)

Le JTAG n'est pas vraiment un programmateur mais plutôt un système de debuggage. Il permet de voir l'évolution de votre micro (registres, mémoire etc) et d'influer sur eux en temps réel et en fonction de l'exécution de votre programme. Le debuggage permet les mêmes méthodes d'exécution qu'en simulation : pas à pas, point d'arrêt etc

Programmateurs supportant ce mode de programmation : JTAGICE, Programmateur JTAG clone –> Lien rompu ! :-\

Programmation Bootloader

Le bootloader est un petit programme, programmé dans votre microcontrôleur, capable d'écrire dans la mémoire flash un programme provenant d’une source externe comme l'UART (Généralement connecté au port série d’un ordinateur). Ce mode de programmation est surtout utilisé pour les microcontrôleurs ne supportant pas le programmation in situ (dans le système), ce qui ne pas le cas des AVR. Donc à part pour une application bien spécifique, il n’y a pas d’intérêt à l’utiliser. (Ou on peut l'utiliser pour faire des mise à jour firmware via une interface USB ou série ce qui évite de devoir ouvrir l'apareil et donc ainsi le client fait sa mise à jour.)

Programmateurs supportant ce mode de programmation : Il faut juste programmer le bootloader avec un programmateur quelconque. Ensuite plus aucun programmateur n'est plus nécessaire.

Programmation Haute tension

La programmation haute tension (12V) est rarement utilisées vu qu’elle ne permet pas la programmation in situ, par contre elle permet de reprogrammer un micro dont les fuses bits ont été mal programmé et qui entraîne un disfonctionnement de la programmation ISP.

Programmateur supportant ce mode de programmation : STK500

Pour la programmation des ATmega 128, 64 et 103

Les ATmega128,64 et 103 n'utilisent pas les pattes MISO et MOSI pour la programmation ISP mais les pattes RXD0 et TXD0.
Une solution pour utiliser l'UART0 et la programmation est d'utiliser un montage de ce type :
http://www.embedit.de/phpkit/include.php?path=content/articles.php&contentid=76 –> Lien rompu ! :-\

Lors de la programmation la patte RESET est forcée à 0, la patte /SHDN passe aussi 0 et force les sorties du MAX3222 à passer en haute impédance.
La programmation peut se faire sans aucun risque de court circuit.

RESET n'étant pas forcée à 0, RESET passe à VCC par l'intermédiaire de R2. Le MAX3232 est activé.

Sinon vous pouvez aussi utiliser un simple multiplexeur.

Brochage

DIP des AVR les plus utilisés

:avr:atmega8_dil.jpg:avr:atmega16_dil.jpg
ATmega 8 ATmega 16
:avr:atmega32_dil.gif:avr:atmega8535_dil.jpg
ATmega 32 ATmega 8535

Liens externes