Le Moniteur du PIC16F87x(A)

P Launay 2006

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Table des matières

Pourquoi un moniteur ?

Le Moniteur du PIC16F877

Fonctionnement du moniteur

Les six champs de l'enregistrement Hex sont décrits comme suit:

Pratique : graver un simple programme utilisateur

Le Moniteur et le Format Hex

Algorigramme du moniteur

Compatibilité des programmes

Pourquoi un moniteur ?

Pour la gravure de simple programme utilisateur dans un PIC, nous utiliserons un moniteur qui communique par la liaison série

Avantage du moniteur

Une seule carte PIC suffit, une alimentation +5V unique est nécessaire au lieu de 2 alimentations +5V et +12V, enfin un logiciel standard GTKTerm qui servira aussi bien pour programmer que pour dialoguer avec la carte PIC, au lieu d'un logiciel spécifique et d'une carte programmateur, vous pouvez programmer sans enlever vos cartes d'applications.

Inconvénient du moniteur

Prend 768 mots(de 14 bits) moniteur simple ou 1K mots(de 14 bits) moniteur complet avec programme pour skypic-down, sur 8K mots(de 14 bits). Cette inconvénient est mineur car il est rare de faire des programmes > 2 K mots(de 14 bits) et très rare de faire des programmes >4 K mots(de 14 bits).

Le programme utilisateur ne démarre qu'au bout de 5 secondes.

Le cas de la gravure avec un programmateur spécifique est abandonné, il n'amène que des inconvénients :

Ne respecte pas le protocole de la liaison série RS232, contairement à Skypic-down

Nécessite une carte programmation spécifique, un transistor et 3 résistances seulement avec skypic-down.

Le Moniteur du PIC16F87x(A)

Il faut avoir préalablement installé gputils pour utiliser gpasm.

Ce moniteur ou bootloader a été écrit par Jack Dollhausen en assembleur et il est publié sous licence GPL, ce qui nous permet de l'étudier,de le modifier et de le distribuer.

Site de Jack Dollhausen :http://www.wsu.edu/~jackdoll

Moniteur pour PIC16F87X

Ce moniteur est crée pour les PIC 16F877 mais pourra être modifié (licence GPL) simplement pour les pics 16F870, 871, 873, 874, 876 et avec quelques ajustements pour bien d'autres 16f87,16f88..

En fait il existe 2 versions 16F877 et 16F877A (programmations différentes) comme vous pouvez le voir sur le site : http://www.wsu.edu/~jackdoll/jmon/index.htm

Ce moniteur de 768 octets qui va d'abord nous permettre de charger un programme utilisateur par la liaison série RS232 à 8 fonctions. Lire comment ça marche, how it works : Demo session http://www.wsu.edu/~jackdoll/jmon/html/session.htm

Fonctionnement du moniteur

A la mise sous tension, la liaison série est initialisée dans notre cas à 9600 bauds, avec 1 bit de start, 1 bit de stop, pas de parité et sans gestion RTS, CTS. Tout ceci est modifiable dans le moniteur.

Si au bout de 5 secondes, aucun caractère n'est arrivé, le programme utilisateur, s'il existe, est lancé.

Sinon une des 8 fonctions est exécutées.

Les 8 fonctions sont :

0: peekflash Danger : permet de lire et modifier les valeurs en mémoire flash (programme)

1: peekdata Attention : permet de lire et modifier les données en mémoire vive RAM

2: peekee Attention : permet de lire et modifier les données en mémoire EEPROM

3: loader Charger un nouveau exécutable (hex) dans la mémoire de programme Flash

4: runcode Lancer le programme utilisateur (si il est chargé)

5: dumpee Envoie les 256 octets Eeprom vers l'usart

6: togint Basculement de l'autorisation globale des interruptions GIE

7: runmain Lancement en 1800H (moniteur complet lance PIC Skypic-down)

Pour comprendre le moniteur, nous devons connaître les fichiers exécutables .hex. Ces fichiers sont des fichiers textes, qui reprennent le format Hex Intel, dont chaque ligne est un enregistrement dont le codage est donné ci -dessous :

Les six champs de l'enregistrement Hex sont décrits comme suit:

: Longueur de l'enregistrement Adresse Type Code/Données Somme de contrôle (Checksum)



Champ Longueur (caractères) Contenu
Début d'enregistrement 1

Les deux points (:) sont utilisés comme indicateur de début d'enregistrement

Longueur de l'enregistrement 2 Nombre de paires de caractères dans le champ Code/Données
Adresse 4

Les deux octets indiquant l'adresse à laquelle l'information du champ Code/Données est chargée.

Type d'enregistrement 2

Type d'enregistrement (00 ou 01) selon qu'on a un enregistrement de données type 0 ou de fin de fichier type 1.

Code/Données 0-2n

De 0 à n octets de code et/ou des données chargeables en mémoire. L'AS met au maximum 32 octets (64 caractères) dans ce champ.

Somme de contrôle Checksum 2

Ce champ contient l'octet le moins significatif du complément à deux de la somme des données des champs 'Longueur de l'enregistrement','Adresse', 'Type d'enregistrement' et 'Code/Données'.

Chaque enregistrement est terminé par un retour de chariot (13 dans le code ASCII).



Cas particulier du PIC 16F877, (PIC14 la flash contient 8K mots de 14 bits, chaque mot prend 2 octets)

Exemple deux lignes du moniteur :103FE000080099270317831203178D0A03198F0AF4

:

10h

3FE0h

00h

08h 00 99 27 03 17 83 12 03 17 8D 0A 03 19 8F 0Ah

F4h

ligne Longueur de l'enregistrement 16 octets, 32 caractères Adresse à divisé par 2 soit ici 1FF0h Type enregistrement données Code/Données voir dessous Somme de contrôle (Checksum)

contenu de 1FF0h 08 poids faible et 00 poids fort soit 0008, contenu 1FF1h=2799, [1FF2h]=1703, [1FF3h]=1283, [1FF4h]=1703, [1FF5h]=0A8D,[1FF6h]=1903,[1FF7h]=0A8F

:00000001FF

:

00

0000

01

rien

FF

début ligne Longueur de l'enregistrement 00 mots,00 octets, 00 caractères Adresse à divisé par 2 soit ici 0000h Type enregistrement fin de fichier Code/Données Somme de contrôle (Checksum)

Remarque la somme de la ligne est nulle 01+FF=00 modulo 100h, c'est aussi vrai pour toutes les lignes la somme avec le cheksum d'une ligne est nulle modulo 100h.

Si vous voulez voir un fichier hex, voici celui du ventilateur : ventilo1.hex

Pratique : graver un simple programme utilisateur

Cas 1 : vous avez un programme utilisateur dans le PIC que vous voulez lancer.

Vous alimentez le PIC et au bout de 5 secondes, votre programme s'exécute.

Cas 2 : vous souhaitez charger un (nouveau) programme utilisateur dans le PIC.

Dans une console, vous lancez gtkterm -r '*'

Alimentez le PIC ou faire un reset et rapidement taper « 3 »

Sur GtkTerm vous verrez : Jack's Monitor V1.0

> LOAD HEX (chargement de programme), charger le programme en cliquant dans le menu Fichier Envoie de Fichier brut.

Sélectionner alors le fichier exécutable .hex de votre choix et valider, il se charge alors puis s'exécute.

Le Moniteur et le Format Hex

La fonction principale du moniteur est de charger un programme utilisateur au format hex.

Fonctions 3: loader ; Charger un nouveau exécutable (hex) dans la mémoire de programme Flash

1)Le moniteur attend les « : » qui indique un début de ligne, début d'enregistrement d'une ligne. Le cheksum est remis à 0, il additionnera tout les octets reçus jusqu'à la fin de la ligne.

2)Le moniteur reçoit ensuite un octet ( 2 caractères) nommé Wcount qui donne le nombre de mots de données de la ligne . Celui servira pour compter les données.

3)Le moniteur reçoit ensuite l'adresse, les poids forts divisés par 2sont mis dans EEADRH (temporairement dans Mtmp) et les poids faibles divisés par 2 dans EEADR

EEADRH et EEADR n'ont pas été choisi au hasard, il permettent d'écrire en EEPROM ou Flash

Il existe 3 exceptions

si l'adresse >=2000h, cas du mot de configuration, la ligne est abandonnée.

si l'adresse >=1C00h, c'est une erreur, écriture dans le moniteur interdite.

si l'adresse =0000h, alors l'adresse devient D000h. Voir compatibilité des programmes.

4)Le moniteur reçoit le type d'enregistrement.

Si celui-ci vaut 0 : Type 0 , enregistrement de données

si celui-ci vaut 1 : Type 1 , fin de fichier , le reste des données est perdue et la fonction 3 est terminée.

5)Wcount est recopié dans Wctr.

Le moniteur reçoit les données et décrémente Wctr, les données sont stockées en RAM dans Line_buff. Le moniteur arrête de recevoir des données quand Wctr =0.

6)Le moniteur reçoit le cheksum et vérifie que la somme des octets de la ligne est nulle.

Si ce n'est pas le cas, une erreur s'affiche et la fonction 3 s'arrête

7)Les Wcount données en RAM dans Line_buff sont écrites en mémoire Flash aux adresses EEADRH,EEADR et suivantes.

8)Retour en 1).

Le programme sort normalement en 4, quand le type d'enregistrement vaut 1.

Algorigramme du moniteur

Vous trouverez ici une partie de l'algorigramme du moniteur et la source algorithme du moniteur en OpenOffice Dessin

Vous voulez rentrer dans les détails, lisez les sources écrites en assembleur et commentées en anglais évidemment !

Le moniteur a été entièrement écrit en assembleur et compilé avec gpasm, pour une raison simple l'assembleur est le langage qui prend le moins de place, celui fait 768 octets.

Les autres fonctions 0, 1, 2 permettent de faire du dépannage (debug) que nous étudierons plus tard.

La fonction 4 lance le programme utilisateur en D000, comme expliquer ci-dessous.

La Fonction 7 permet pour le moniteur complet de lancer le programme PIC de dialogue avec Skypic_Down. Voir plus bas.

L'ensemble des fonctions sont dans un fichier symbol-table.inc

Compatibilité des programmes.

Nous allons travailler sous GNU Linux avec le moniteur mais les programmes utilisateur écrit en C doivent être standard, c'est à dire que le même programme pourra être chargé avec un programmateur et sur n'importe quel système d'exploitation.

Concrètement pour le PIC16F87x :

Adresse de reset : 0000h.

adresse d'interruption 0004h

Lors d'un reset, le PIC commence à l'adresse 0000h, les adresses 0000h à 0003h servent à faire un saut vers le programme principal.

Quand l'unique programme est le programme utilisateur chargé avec un programmateur, il n'y a pas de problème.

Pour le moniteur, les adresses 0000h à 0003h sont réservées pour le moniteur qui font un saut vers le moniteur en 1D08h, les adresses utilisateurs qui devraient être en 0000h-0003h sont transférés en D000h-D003h.

Le moniteur lance donc le programme utilisateur en D000h au lieu de 0000h

Ce petit transfert permet de rendre les programmes standards.

Les interruptions ne sont pas concernées car le moniteur ne les utilise pas.