Plate-forme de développement

 

Pour éviter de perdre trop de temps dans le développement de mes applications, j'ai décidé de réaliser une plate-forme de développement.

En effet, dès qu'on commence à réaliser des programmes complexes cet outil devient indispensable pour débugger, réaliser des tests, etc.

Mon choix s'est porté sur une carte fabriquée par la société www.olimex.com, il s'agit du PIC-ICD2 vendue 89,95$ (j'étais un peu méfiant car le fabricant se trouve en Bulgarie mais je n'ai eu aucun problème et j'ai été livré très rapidement) :

Cette carte de développement possède une interface série/USB et est parfaitement compatible de l'application MPLAB-IDE. L'application est disponible gratuitement sur le site . Le connecteur ICSP permet de programmer et de debugger in situ la carte d'essais (c'est à dire sans jamais la déconnecter).

Comme la carte n'est vendue sans notice, ni CD-ROM, je vous précise que l'alimentation en 9V ne doit pas respecter la polarité +/- car le montage dispose d'un pont redresseur. Par ailleurs, j'utilise le connecteur ICSP marqué DEBUG (à gauche de la photo). L'autre connecteur ICSP (en bas de la photo) sert à reprogrammer le Firmware dixit Olimex.

Cette carte de développement doit être reliée à une autre carte pour faire des essais, j'ai choisi pour cela d'intégrer le PIC16F877 car même si ce microcontroleur est devenu désuet face à l'arrivée des nouvelles familles de PIC, il possède néanmoins beaucoup de capacités en nombre de ports, convertisseur A/D, etc. et il accepte en plus le protocole ICD2 pour faire du débuggage.

J'ai choisi bien entendu le modèle 20Mhz.

Réalisation d'une carte avec le 16F877

Le schéma logique, ci-dessous, a été réalisé avec le logiciel de CAO sPlan

Le circuit a été réalisé avec le logiciel de CAO LochMaster.

Vous noterez les barettes tulipes de chaque côté du PIC16F877, elles serviront par la suite à construire tout type de montage électronique en se repiquant dessus juste avec des fils (comme par exmple une platine d'essais).

A partir de maintenant, il suffit de paramétrer le PIC-ICD2 dans le logiciel MPLAB-IDE.

Il faut bien suivre la procédure décrite dans le menu Help > Release Notes, Attention en cas de fause manipulation avec l'interface USB, on doit tout recommencer (désinstaller le driver USB pluis le réinstaller). Cette opération modifie la base de registres de Windows 2000 et il faut posséder un outil regini.exe fourni par Microsoft).

J'ai été bloqué à un moment donné avec MPLAB-IDE car en mode debugger > select tool > MPLAB SIM je n'avais plus la fleche verte qui indique la position dans l'exécution de mon programme

J'ai résolu le problème en diminuant sur mon disque dur le chemin (ou l'arborescence) pour atteindre mon dossier de travail ; le nombre de caractères était trop grand !

Vérification du bon fonctionnement de la plate-forme :

J'ai relié sur PORTA.0 une LED et une résistance pour réaliser un montage très simple ; le clignotant.

Le programme en C.

//******************************************************************************
// Project: LED Blinking.c
// Ce projet fonctionne avec un PIC 16F877-20
// Temporisation reliée avec une boucle de comptage
// 21/01/06	Le projet a pour but de faire clignoter une LED
// 
// External Oscillator 20 Mhz, No WDT, No MCLR, PWRT  

/* PORTA */
/* 7    6    5    4    3    2  pin PIC  	*/
/* 5    4    3    2    1    0  PORTA        */
/*                                          */

#define ICD2_DEBUG
#pragma chip PIC16F877
#pragma config WDTE=off, FOSC=HS

#pragma bit LED @ PORTA.0 ;

/****************************************************/
// PROCEDURES
void wait_ms(uns16 tm);

/****************************************************/
void main(void)
{
/****************************************************/
// INHIBITION FONCTIONS INUTILES    
 ADCON1=0x06; // Port A utilisÚ en I/O digital
           
/****************************************************/	
// PORTA et PORTB
	PORTA = 0b.0000.0000;
	TRISA = 0b.0000.0000; // 0 = Output, 1 = Input  		
   
for(;;)
{
	LED=0;
    wait_ms(1000);
 
	LED=1;
	wait_ms(500);
}
//fin du main
}

/*** Tempo ***/
// tm=1 correspond Ó 1ms pour Q=20Mz 
void wait_ms(uns16 tm)
{
uns16 t1, t2;

	t1 = tm*5;
	do{
	t2 = 90;	
	while( --t2!=0 );
	}
	while( --t1!=0 );
}

Et ça marche, ...