dimanche 2 décembre 2012

Prise en main de EasyAVR 6


               1-Introduction et Installation:


Et bien voilà, c'est la grand jour et le papa Noël est passé avec un peu d'avance (normal il venait de Budapest).
Par soucis d'économie, je suis directement partie sur le kit EasyAVR avec un code de réduction qui allait bien.
Bref, le plus dure à été de déballer la carte de son corset anti-statique ! En effet, l'emballage est vraiment très protecteur....à tel point qu'il devait presque délicat de sortir la carte de son emballage. Ci-dessous une illustration du contenu du kit (LCD et TFT non visible).

Le kit est bien fournis, avec une version papier du manuel utilisateur. Après, on regrettera le fait que tout le manuel utilisateur de MikroC ne soit pas fournis en version papier.
Les DVD d'installation sont également présent.

Pour l'installation, il suffit d'insérer le DVD fourni et de réaliser l'installation de MikroC Pro (ou pas) puis des différent Driver.
Si comme pour moi, le DVD semble avoir une faiblesse....alors contourner cela depuis le site de MikroE par téléchargement des logiciels et driver.
Veillez à bien respecter l'ordre d'installation : logiciel, puis driver et ENFIN raccorder la carte au PC avec le câble USB !
Sinon, vous aurez gagné le droit à un fonctionnement erratique...
Une fois l'installation terminée, vous aurez le droit à un redémarrage du PC en règle !


               2-Premier Code--Hello World

On va démarrer avec un premier code simple. Il s'agira de réaliser un petit chenillard sur les LED (2 rangées)   raccordées sur les ports A et B du ATmega16.


Bien que l'IDE MikroC Pro soit sympa, celui de Atmel AVRStudio reste une référence. C'est pourquoi le code sera "montré" pour les 2 IDE et les différences expliquées.

Configuration :

La configuration choisie repose sur une utilisation directe des ports du MCU (MicroControllerUnit, terme utilisé par la suite pour définir le microcontroller).
Donc, on utilise directement les ports en Output. Cette configuration s'effectue dans le registre : DDRx, où x = A, B , C etc...
Dans notre exemple on obtient donc la syntaxe suivante (en hexa 0x):
DDRA = 0xFF;
Désormais toute les "Pin" du port A sont de type "Output". Elles vont donc pouvoir driver un courant de 20mA , max 200mA (données issues de la Datasheet de l'ATmega16). Concrètement, on obtient le schéma électrique suivant :
Illustration du schéma électronique de la sortie LED ATMega16 EasyAVR (schéma réalisé sous KiCad).

Forcer une sortie à un état logique:

Pour forcer une sortie à un état logique (1 ou 0), il existe plusieurs syntaxe en C. Nous évoquerons ici que les syntaxes testées (et comprises :) ). On verra par la suite les autres possibilités.
PORTA = 0;
Permet de forcer toutes les sorties à 0 du port A
PORTB = 0xff;
Permet de forcer toutes les sorties à 1 du port B (notation en hexa).

Pour forcer un bit particulier du registre PORTx, on peut aussi employer la syntaxe suivante :
PORTA.B4= 1;
Attention : cette syntaxe est valable sous l'environnement MikroC.
Il existe un équivalent générique sous AVRStudio (non présenté ici).
Dans le cas présent, cela signifie que le bit 4 du portA est mis ) l'état logique 1.

Contrainte du chenillard:

C'est l'architecture électronique qui impose le programme à rédiger. Dans le cas présent, chaque sortie étant directement reliées à une LED, alors il va falloir "balayer" le port A.
Une des méthodes possibles est d'utiliser la boucle FOR.
A chaque itération de la boucle, on viendra inscrire une valeur différente dans le registre PORTA.

==> i=i*2  st l'incrément à mettre en place pour avoir un changement de bit et compter de "2 en 2" et obtenir l'effet chenillard souhaité.

Exemple de code sous MikroC:


int i=0;
const unsigned long delay = 100;
void main() {
     DDRA = 0xFF;
     PORTA = 0;
     while(1){
              for (i=1;i<256;i=i*2) {
                   PORTA= i;
                   Delay_ms(delay);
              }
              PORTA = 0;
              Delay_ms(delay);
              PORTA = 0xff;
              Delay_ms(500);
              PORTA = 0;
              Delay_ms(500);
              PORTA = 0xff;
              Delay_ms(500);
              PORTA = 0;
     }
   
}



Exemple de code sous AVRStudio:



/*
 * Blinkg_HelloWorld_AVRStudio.c
 *
 * Created: 02/12/2012 16:46:15
 *  Author: Maison
 */

#include <avr/io.h>
#include <util/delay.h>

int i=0;
const unsigned long delay = 100;
int main(void)
{ //Setting of the port
DDRA = 0xFF; //Toutes les sorties en mode output
PORTA = 0;   // sortie à l'état bas
DDRB = 0xFF; //Toutes les sorties en mode output
PORTB = 0;   // sortie à l'état bas
    while(1)
    {
for (i=1;i<256;i=
i*2) {
PORTA= i;
_delay_ms(delay);
}
PORTA = 0;
_delay_ms(delay);
PORTA = 0xff;
_delay_ms(delay);
PORTA = 0;
_delay_ms(delay);
PORTA = 0xff;
_delay_ms(delay);
PORTA = 0;
for (i=1;i<256;i=i*2) {
PORTB= i;
_delay_ms(delay);
}
PORTB = 0;
_delay_ms(delay);
PORTB = 0xff;
_delay_ms(delay);
PORTB = 0;
_delay_ms(delay);
PORTB = 0xff;
_delay_ms(delay);
PORTB = 0;
} }

Et voici une courte vidéo pour le résultat finale :

3-Mais comment charger le code AVRAtmel depuis EasyAVR

J'essaierai de rajouter des captures d'écran une prochaine fois.
Mais il suffit de charger le .hex généré depuis AVRStudio depuis l'utilitaire AVRFlash Prog de MikroElektronika.

Nota : il est aussi possible d'utiliser le port JTAG ou AVRISP de l'EasyAVR pour utiliser un programmateur externe. Mais j'essaierai d'illustrer cela une prochaine fois.