mercredi 24 décembre 2014

ATmega168pb, le 8 bits à la fête! Aperçu du kit Atmel ATmega168 X PLAINED.

And now for something completely different…

Après avoir posté quelques billets sur différents micro-contrôleurs, notamment ceux de la famille Z8F de Zilog, les circuits 32 bits de chez Microchip dans une application bien pensée que sont les produits Maximite et Micromite, ou encore les circuits compatibles ARM0 de NXP, aujourd'hui je propose un très petit aperçu des composants 8 bits de chez Atmel. En l’occurrence le processeur ATmega168pb, nouvellement présenté et dont la découverte est facilitée par un kit d'évaluation nommé 'ATmega168 X PLAINED Mini'.


Ce qui est intéressant avec ce nouveau micro-contrôleur, bien que ce soit un processeur 8 bits, c'est qu'il propose une architecture RISC rapide, un prix très réduit malgré la présence d'un nombre assez important de périphériques embarqués, et la mise à disposition de la part d'Atmel d'un logiciel de développement/programmation intégré de bonne facture. En un mot, Ce circuit se présente un peu de la même façon que les Z8F de Zilog.

En résumé, voici ce que nous propose un ATmega168pb (extrait de la documentation Atmel):

  • Up to 20 MIPS Throughput at 20MHz
  • On-chip 2-cycle Multiplier
  • 16KBytes of In-System Self-Programmable Flash program memory
  • 512Bytes EEPROM
  • 1KBytes Internal SRAM
  • Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
  • 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
  • Real Time Counter with Separate Oscillator
  • Six PWM Channels
  • 8-channel 10-bit ADC with Temperature Measurement
  • Programmable Serial USART with Start of Frame Detection
  • Master/Slave SPI Serial Interface
  • Byte-oriented 2-wire Serial Interface (Phillips I 2 C compatible)
  • Programmable Watchdog Timer with Separate On-chip Oscillator
  • On-chip Analog Comparator
  • Interrupt and Wake-up on Pin Change
  • Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby, and Extended Standby
  • 27 Programmable I/O Lines

...pour les caractéristiques essentielles, ce qui présente tout de même un certain potentiel de flexibilité dans un très petit circuit. Il pourrait se placer entre les micros de chez Zilog avec plus de rapidité d'exécution et plus de périphériques embarqués, et les 32 bits de chez Microchip en présentant certes moins de puissance de calcul, mais aussi une bien plus grande facilité dans la gestion du placement des périphériques sur les pattes de sorties.

La page du site d'Atmel ou il est possible de commander le kit d'évaluation :

http://store.atmel.com/PartDetail.aspx?q=p:10500404#tc:description
Avant toute tentative d'utilisation de ce kit, il convient de télécharger le logiciel de développement Atmel Studio 6. Et de constater que le package d'installation constitue un joli pavé de près de 700Moctets de données, auxquelles il conviendra de rajouter 200Moctets de mises à jours diverses et variées à la date de ce billet. Bien plus que ce que Propose Zilog avec son logiciel de développement. Point intéressant : l'application de programmation en Flash du micro-contrôleur fait parti du logiciel de développement. Inutile donc de chercher sur la toile, une solution tierce 'gratuite' susceptible de ne pas fonctionner correctement, comme ce qui aurait pu être mon cas avec le logiciel FlashMagic si les développeurs de cet utilitaire n'avaient pas réagi très rapidement à ma demande de correction pour son bon fonctionnement avec le processeur NXP LPC810.

Une fois Studio 6 installé et la carte d'évaluation connectée dans un port USB libre de la machine de développement, le premier lancement de Studio 6 fait apparaître l'environnement de développement ainsi qu'un onglet affichant le matériel compatible Studio découvert :

http://synthelectro-fr.blogspot.com
Rapidement, l'envie d'en savoir un peu plus sur le fonctionnement de l'environnement de développement et sur le micro-contrôleur pousse à tenter une première programmation. Sur le site d'Atmel, se trouve un programme d'exemple appelé 'Morse' censé présenter par le clignotement de la LED utilisateur présente sur la carte d'évaluation, le code Morse correspondant à ce que l'on aura fournit au processeur par l'intermédiaire de son port Série. C'est d'ailleurs cette application qui est programmée dans le kit d'évaluation permettant, à défaut de savoir dans un premier temps de quoi il s'agit, de constater qu'il y a de la vie lorsque l'on connecte la carte au PC. C'est déjà ça.

Une constatation intéressante concernant le mode de programmation de la Flash du micro-contrôleur, concerne le fait que celui-ci s'effectue par le port SPI du circuit. Laissant ainsi libre le port série pour tout type d'expérimentations. Cela peut peut-être paraître anodin, mais il m'est arrivé quelques mésaventures avec un circuit LPC1114 répondant 'synchronized' à une suite d'octets envoyés sur son port série, alors qu'il n'était nullement en mode programmation, le système de détection automatique de 'baud rate' du LPC1114 se déclenchant à 'l’insu de mon plein gré' !!!

Plutôt que de compiler de nouveau cette application et de la re-programmer dans le processeur, j'ai préféré partir de zéro et écrire un programme simple envoyant quelques caractères par le port série.

Et voici le 'programme du siècle', ou plus simplement un 'Hello World' un peu plus évolué que l'habituel clignotement d'une LED :
/*
 * TestCom.c
 *
 * Created: 23/12/2014 10:34:39
 *  Author: eric
 */ 

#include <avr/io.h>

#define F_CPU                   16000000UL  // Oscillateur interne à 16MHz
#define LED_ON                  PORTB |=  (1<<PORTB5)
#define LED_OFF                 PORTB &= ~(1<<PORTB5)
#define USART_BAUDRATE          9600
#define BAUD_PRESCALE           (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

void InitSystem(void);

int main(void)
{
unsigned long Temp;
 
 InitSystem();
 
    while(1)
    {
     //TODO:: Please write your application code 
        while (!(UCSR0A & (1<<UDRE0)));
        UDR0 = 'D';
        for (Temp = 10000000; Temp; Temp--);
        while (!(UCSR0A & (1<<UDRE0)));
        UDR0 = 'F';
    }
}

void InitSystem(void)
{
 DDRB |= (1<<PORTB5);                   // PB5 en sortie (LED0)
 PORTB |= (1<<PORTB5);                  // PB5 pullUp
 LED_OFF;                               // start with the LED off

 UCSR0B = (1 << RXEN0)  | (1 << TXEN0); // Autorisation RX/TX
 UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);// Mode 8 bits

 UBRR0H = (BAUD_PRESCALE >> 8);         // Baud rate LSB du registre UBRR
 UBRR0L = BAUD_PRESCALE;                // Baud rate MSB du registre UBRR
}
Rien de bien compliqué en somme si ce n'est qu'en guise de clignotement de LED, le caractère 'D' est envoyé par le port série puis, après une boucle vide comptant jusqu'à 10.000.000, le caractère 'F' est envoyé à la console, le tout, dans une boucle sans fin. Ce simple programme m'a permis de constater que la boucle de comptage s'effectue en 6 secondes.

Une fois ce programme compilé, un simple démarrage de session de débogage permet de lancer la programmation de la flash du composant puis de démarrer le programme interne. Il est tout à fait plaisant de constater que dès lors, toutes les opérations permettant l'évolution en pas à pas du programme ainsi que la visualisation des variables et des mémoires internes au processeur sont accessibles simplement, et en temps réel, ainsi que la gestion des points d'arrêts. Je retrouve ici tout ce qui fait l'efficacité de la solution Zilog.

Session typique de débogage sous Studio 6. 
Un petit mot sur le processeur lui-même : il s'agit, donc, d'un processeur 8 bits. De ce fait, il ne présente pas la complexité d'un circuit même 'simple' de type ARM comme le LPC1114FN28 de NXP. Les mnémoniques assembleur utilisées sont très simples ainsi que l'architecture des registres. Lors de l'élaboration du programme ci-dessus, je n'ai absolument pas utilisé quelque librairie Atmel que ce soit. J'ai programmé directement les registres concernés par mon 'application', tout simplement. Je retrouve avec ce système, comme je l'ai rappelé précédemment, toute la facilité et la rapidité de développement que propose les circuits Zilog, tout en offrant un peu plus de puissance et de périphériques embarqués, notamment l'EEPROM, totalement absente des circuits Z8F.

Et puisque j'évoque la 'puissance' de ce processeur, j'ai comparé le résultat de ce programme avec ceux obtenus lors d'un test précédent sur des machines fonctionnant sous interpréteur Basic. En 'force brute', l'ATmega168pb exécute un simple comptage à une vitesse supérieure à 350 fois le même type de test effectué sur un processeur PIC32 à 50MHz sous interpréteur Basic, le Micromite. Le Micromite étant lui-même 130 fois plus rapide que le bon vieux Tandy PC-2. L'ATmega168pb est donc près de 50 000 fois plus rapide que le PC-2. Évidement, cette comparaison est 'tendancieuse', les environnements de ces trois processeurs étant très différents les uns des autres.

Cependant, si l'on considère les outils disponibles aujourd'hui pour une personne désireuse de se lancer dans la réalisation de matériels embarqués, force est de constater qu'il y a vraiment de quoi faire petit, économe en énergie, tout en étant vraiment très performant. Le tout pour un budget minimal puisqu'à considérer que la phase la plus lente dans tout le processus d'élaboration est celle du chargement du logiciel Studio 6, il est tout à fait possible d'imaginer utiliser cette chaîne de développement sur un portable équipé d'un simple processeur Core 2 Duo. C'est mon cas, avec un Core 2 à 2.10 MHz. Ce type de Portable se trouve aujourd'hui en occasion à moins de 200€, à comparer aux 3500 Francs nécessaires pour acquérir un Sharp PC 1500 (TRS80-PC2) à l'époque de sa sortie. Les outils de développement sont fournis gracieusement par Atmel.

Le tout pour moins de 200€ ?....
Conclusion : je me suis laissé tenter par une publicité Atmel,vantant tous les avantages du circuit ATmega168pb, proposé sur une carte de développement minimale mais pratique au prix de de 8,88$ hors frais de port (24/12/2014). Je pensais être en présence d'un circuit minimaliste, il n'en est rien. Bien qu'en version 8 bits, et sous réserve que le besoin en calculs intensifs ne soit pas l'objectif, ce circuit est très flexible, puissant et pratique à programmer/debugger avec les outils Atmel. Au delà de la découverte, il serait dommage de ne pas l'utiliser dans une application concrète…

Aucun commentaire:

Enregistrer un commentaire