====== ATMEL XMEGA ====== La famille des XMEGA est la nouvelle génération de [[microcontrôleur]] d'[[ATMEL]] qui remplace l'ancienne gamme des [[AVR]] ATMEGA. ===== Fonctionalités - Comparatif ATMEGA ===== ^ XMEGA ^ ATMEGA ^ | ADC : 12bits | 10 bits | | [[DMA]] | - | | Très faible consommation en veille (100nA @ 1.6V) | Nettement plus | | Cryptage : AES, DES, CRC| - | | 32 sorties PWM | 2 - 3 ? | | 6 UARTS | 4 | | 4 I²C (TWI) | 2 | | 4 SPI | 1 | | 11 Timer | 3 | | Fonction de génération de signaux (AWex) | - | | Interface pour bouton tactile | - | | XCL (XMEGA Custom Logic) (1)| - | (1) : Possibilité de générer de la glue logique simple (Portes Logiques, bascules, multiplexeurs etc ...) ===== Les ports d'entrée / sortie ===== Les entrées/Sorties des XMEGA sont regroupés par port de 8 bits. Ces ports s'appellent PORTx où x est la lettre du port. Exemple : PORTA, PORTB. Les Pin indivituelles s'appellent Pxn où x correspond au nom du port et n au numéro de la pin. Exemple : PA0 === La direction ===== Chaque pin peut être utilisée en sortie ou en entrée. Ce choix se définit dans le registre DIR. Si DIRn est à "0" la pin est paramétrée en entrée si DIRn est à "1" la pin est configurée en sortie. ^ Direction ^ Etat logique ^ ^ Entrée | "0" | ^ Sortie | "1" | PORTR.DIR = 0xFF; //Met port R en sortie === Etat d'une sortie ===== L'état de la sortie est contrôlé par le registre OUT. La sortie passera à VCC si OUTn est à "1" et la sortie passera à 0V si la OUTn est à "0" ^ Etat logique ^ Tension de sortie ^ ^ "0" | 0V | ^ "0" | VCC | PORTR.OUT = 0x0F; //Met PR0 à PR3 3.3V et PR4 à PR7 à 0V === Lecture de l'état d'une entrée ===== L'état logique d'une entrée peut être obtenu par une lecture du registre IN. unsigned char EtatPortA; EtatPortA = PORTA.IN; === Configuration ===== Chaque Pin peut avoir une configuration particulière. Ce paramétrage est réalisé via le registre PINnCTRL. ^ Nom ^ Configuration de l'entrée/sortie ^ |PORT_OPC_TOTEM_gc | 0 ou VCC | |PORT_OPC_BUSKEEPER_gc | Mémorise le dernier état sur l'entrée via une résistance Pull-up ou Pull-down | |PORT_OPC_PULLDOWN_gc | Pull-down sur l'entrée | |PORT_OPC_PULLUP_gc | Pull-up sur l'entrée | |PORT_OPC_WIREDAND_gc | OUT=1 -> H, OUT=0 -> 0V (Collecteur ouvert)| |PORT_OPC_WIREDANDPULL_gc | OUT=1 -> Pull-Up, OUT=0 -> 0V (Collecteur ouvert avec résistance de tirage)| |PORT_OPC_WIREDOR_gc | OUT=1 -> VCC, OUT=0 -> H | |PORT_OPC_WIREDORPULL_gc | OUT=1 -> VCC, OUT=0 -> Pull-Down| PORT_OPC_BUSKEEPER_gc permet de maintenir un niveau logique sur un fil qui passe en haute impédance et ainsi éviter un état indéterminé sur l'entrée. PORTA.PIN0CTRL |= PORT_OPC_PULLUP_gc; //Activation de la résistance de tirage à l'état haut sur PIN0 du PORT A Sur les PIN déclenchant des interruptions, il est possible de définir le mode de déclenchement. PORTA.PIN0CTRL |= PORT_ISC_RISING_gc; ^ Nom ^ Configuration de l'entrée ^ |PORT_ISC_BOTHEDGES_gc |Front montant et descendant | |PORT_ISC_RISING_gc | Front montant | |PORT_ISC_FALLING_gc | Front descendant | |PORT_ISC_LEVEL_gc | Niveau bas | |PORT_ISC_INPUT_DISABLE_gc | Désactivation du buffer d'entrée | PORT_ISC_INPUT_DISABLE_gc permet de réduire la consommation quand la pin n'est pas utilisée ou utilisée en analogique. Dans ce cas, l'entrée sera dans le registre IN sera toujours à 0 PORT_ISC_LEVEL_gc il est possible de faire une detection sur niveau haut en inversant l'entrée === Inversion ===== Il est possible d'inverser une entrée. Appliquer 0V sur l'entrée donnera un "1" logique et inversement, appliquer VCC donnera un "0". PORTA.PIN0CTRL |= PORT_INVEN_bp; === Interruption ===== Chaque entrée a 2 interruptions. Activer une interruption se fait en 3 étapes : - Configurer le registre PINnCTRL (Choix du mode de déclenchement, front montant etc ...) - Mettre à "1" le bit correspondant à l'entrée dans le registre INT0MASK - Définir le niveau de priorité en paramétrant les registres INT0LVL et INTLVL La priorité sélectionnée doit être activée dans le PMIC (Programmable Multilevel Interrupt Controler). Le flag d'interruption global doit également être activé === Sortie de veille ===== Quand l'XMEGA se met en veille son horloge est désactivée. Un changement sur l'entrée doit être détecté de maniéré asynchrone. Tous les modes de déclenchement (front montant, niveau etc ...) ne sont pas possible sur toutes les pin. Seule la PIN2 de chaque port permettra un reveil du microcontroleur quelque soit le mode de déclenchement choisi. Pour les autres PIN, il faudra soit les paramétrer en PORT_ISC_BOTHEDGES_gc ou en PORT_ISC_LEVEL_gc. === E/S périphériques ===== Les E/S des périphériques USART, SPI, Timer sont paramétrables sur pin que l'on souhaite pour avoir plus de flexibilité hard/soft. ===== Horloges ===== Après un démarrage, le microcontrôleur utilise l'oscillateur 2Mhz interne. L'horloge peut ensuite être modifiée softwarement à tout moment. L'horloge périphérique pour fonctionner 2x ou 4x plus rapidement que l'horloge CPU. ==== Horloges internes ==== * 32Mhz * 2Mhz * 32.768Khz * 32KHz (ULP - ultra low power) Les horloges internes sont calibrées en usine. Les valeurs de calibration sont stockés dans la mémoire flash du microcontrôleur. Ces valeurs doivent être chargés lors de l'initialisation des horloges afin d'avoir la plus grande précision possible. === 32 Mhz === Oscillateur interne calibré à 32 Mhz lors de la fabrication. Une boucle à verrouillage phase numérique permet de faire varier sa fréquence de 30Mhz à 55Mhz. C'est cette oscillateur qui est utilisé pour la connexion USB qui nécessite une horloge de 48Mhz. +/-1% de précision. Cette horloge peut être utilisée pour les bus de communications UART, SPI etc ... Un quartz externe n'est pas nécessaire. === 2 Mhz === +/-1% de précision. Cette horloge peut être utilisée pour les bus de communications UART, SPI etc ... Un quartz externe n'est pas nécessaire. === 32.768Khz === +/-2% de précision. === 32KHz (ULP) === 20% de précision. Utilisé pour le BOD et le Watch dog. Consommation : 1µA ==== Horloges Externes ==== * Quartz 0.4Mhz à 16Mhz * 32.768Khz * Signal carré externe ==== PLL et prédiviseur ==== === PLL === Fréquence d'entrée : 400kHz à 32Mhz\\ Fréquence de sortie : 8 à 128 Mhz Multiplicateur de la fréquence interne de 1x à 31x Fréquence max de sortie pour le CPU : 32Mhz ==== Prediviseur ==== Diviseur de fréquence paramétrable /1 à /2048 {{::xmega_prescaler.png?700|}} {{::xmega-clocks.png?600|}} ==== Timer ==== 7 Timer de 16 bit (4 de type 0 et 3 de type 1)\\ Chaque timer est associé un port. Le timer TCx0 est associé au port x.\\ Exemple de dénomination :\\ Type 0 : TCC0 (Port C), TCD0 (Port D), TCE0 (Port E), TCF0 (Port F)\\ Type 1 : TCC1 (Port C), TCD1 (Port D), TCE1 (Port E) 4 Timer de 8 bit Possibilité de créer des timers de 32bit en utilisant 2 timer\\ Générateur de signaux sur le timer 0 (AWex)\\ Compteur sur entrée externe et mesure de fréquence === Horloge === Les sources d'horloge ^ Dénomination ^ Horloge ^ | TC_CSEL_OFF_gc | Timer off | | TC_CSEL_DIV1_gc | fCLK,SYS | | TC_CSEL_DIV2_gc | fCLK,SYS/2 | | TC_CSEL_DIV4_gc | fCLK,SYS/4 | | TC_CSEL_DIV8_gc | fCLK,SYS/8 | | TC_CSEL_DIV64_gc | fCLK,SYS/64 | | TC_CSEL_DIV256_gc | fCLK,SYS/256 | | TC_CSEL_DIV1024_gc | fCLK,SYS/1024 | tc_write_clock_source(&TCD1, TC_CLKSEL_DIV8_gc); === Modes de fonctionnement === * Normal mode. * Frequency Generation mode. * Single Slope PWM. * Dual Slope PWM, overflow on TOP. * Dual Slope PWM, overflow on TOP and BOTTOM. * Dual Slope PWM, overflow on BOTTOM. tc_set_wgm(&TCD1, TC_WGMODE_SINGLESLOPE_gc); == Normal mode == === Registre de comparaison === Vous savez que le timer du microcontroleur s'incrémente à chaque coup d’horloge. La valeur du timer peut être comparée à un registre CCx. En fonction du résultat de cette comparaison le microcontrôleur peut déclencher une interruption ou changer l'état d'une sortie. tc_write_cc(&TCD1, TC_CCB, 10000); === Sortie Timer === Nous avons vu que le microcontroleur peut changer l'état d'une sortie sur le résultat de la comparaison avec le registre CCx. Chaque CCx a un pin associée : {{::timer_mapping_io.png?400|}} Exemple d'utilisation : En mode PWM, si la valeur du timer est inférieur à CCx, la pin Pxy sera à l'état haut. Si la valeur du timer est supérieur à CCx, la pin Pxy sera à l'état bas. Il est donc possible de faire varier le rapport cyclique de Pxy en changeant simplement la valeur de CCx. tc_enable_cc_channels(&TCD1,TC_CCBEN); ====== Veille ====== Plusieurs modes de mise en veille possible : =====Idle===== * Tous les périphériques sont fonctionnels * Tous les périphériques peuvent réveiller le microcontroleur * Le contrôleur DMA et les systèmes d'interruptions sont fonctionnels =====Power save===== * Horloges coupées sauf l'horloge la RTC * La RTC, les interruptions externes, la liaison I2C, le watchdog peuvent redémarrer le microcontrôleur =====Power down===== * Toutes les horologes sont coupées * Les interruptions externes, la liaison I2C, le watchdog peuvent redémarrer le microcontrôleur =====Standby===== * Power down mais les oscillateurs sont fonctionnels pour un démarrage rapide * =====Extended Standby===== * Power save mais les oscillateurs sont fonctionnels pour un démarrage rapide ====== USB ====== L'indication de la présence du module USB est indiqué par la lettre U en suffix dans la référence du composant.\\ Exemple : ATxmega64A1**U** Dans les documentations, vous verrez aussi souvent la dénomination xmegaAU. Il s'agit de tous les microcontroleurs de la série **A** disposant d'une interface USB. L'XMEGA ne nécessite aucun composant externe pour le connecter en USB. Il s'agit d'une interface USB "périphérique" et non hote. Ce qui veut dire que votre XMEGA sera reconnu comme une périphérique si vous le connecté à votre PC (Support de stockage, clavier, souris etc ...). Il ne sera pas possible de connecter des périphériques à votre XMEGA. ===== Drivers ===== Atmel fournit une série de driver que vous pouvez utiliser en fonction de vos besoins : * **CDC** (Communication Device Class) - Port COM virtuel * **HID Mouse** - Émulation d'une souris * **HID Keyboard** - Émulation d'une souris * **HID Generic** - Il s'agit d'un driver générique. Il faudra développer votre propre driver coté PC pour pouvoir l'utiliser. * **Mass Storage (MSD)** - Émulation d'une carte mémoire ou d'une clé USB externe. * **Personal Healthcare** - Pour les systèmes médicaux ayant comme vocation d'envoyer des données à monitorer. * **DFU Bootloader** - Il s'agit d'un driver permettant de programmer le microcontrôleur via la liaison USB. ====== Série ====== [[Atmel]] a créé différente séries avec des spécificités particulières.\\ Le nom de la série est indiqué dans la référence du composant. Exemple : ATxmega64**A**1U\\ Il s'agit donc d'un XMEGA64 de la série A. ===== Tableau comparatif ===== {{::compare_xmega_series.png?1000|}} ==== Série A ==== Il s'agit de la série standard. A utiliser quand vous n'avez pas de besoin spécifique. Atmel picoPower technology DMA controller Event System Dual 12-bit ADC 12-bit DAC AES/DES crypto engine Full-Speed USB device interface Multiple USARTS, SPI and two-wire interfaces ==== Série B ==== La série B est équivalente à la série A en intégrant un contrôleur LCD. En contrepartie, elle perd le module de cryptage. Atmel picoPower technology Segment LCD controller with: Contrast control Integrated LCD buffers SWAP mode ASCII character mapping Support for scrolling text Programmable segment blinking LCD power supply Full-speed USB device interface Dual 12-bit ADCs DMA controller Event System Atmel AVR single-cycle CPU ==== Série C ==== La série C est orientée vers les fonctions USB. Il s'agit de la série A avec des fonctionnalités en moins. Atmel picoPower technology Event System 12-bit ADC Full-Speed USB device interface ==== Série D ==== La série D est orientée vers des projets faible consommation. Elle est équivalente à la série C sans le module USB Atmel picoPower technology Event System 12-bit ADC ==== Série E ==== La série E est orientée vers des projets nécessitant un faible encombrement. Les boitier sont du type QFN de 32 pins Atmel picoPower technology XMEGA Custom Logic (XCL) Enhanced DMA 12-bit 1MSPS DAC, 2 channels 12-bit 300kSPS ADC, 16 channels Asynchronous Event System Enhanced timer/counters Fast mode+ 1MHz support on TWI Fast wake-up from internal oscillators System wake-up from USART ==== Bootloader ==== Télécharger le logiciel [[http://www.atmel.com/tools/flip.aspx?tab=overview|FLIP for Windows (Java Runtime Environement included)]]\\ **Appuyer sur le bouton SW0 puis alimenter la carte**. Le bootloader se mettra en attente de programmation. Démarrer le logiciel FLIP {{::xmega-a3bu_flip.png?500|}} Device -> Select ... {{::xmega-a3bu_flip2.png?200|}} Settings -> Communication >> USB >> Open {{::xmega-a3bu_flip3.png?500|}} File -> Load HEX file ... Sélectionner le fichier votre fichier **.hex** qui se trouve dans le dossier Clique sur **RUN** {{::xmega-a3bu_flip4.png?500|}}