<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte

 

La Programmation des pics
par Bigonoff
Premiere partie - pic 16f84 - Révision 4

Téléchargement des fichiers originels ici
Publié le 26/10/2001

17. Le reste du datasheet

Index coursIndex du cours
Chapitre précédent16. Le mode Sleep
Chapitre suivant18. Astuces de programmation

 

17. Le reste du datasheet

Et voilà, nous arrivons au bout de l’étude de notre 16F84. Dans ce chapitre, je vais parcourir avec vous le datasheet de la 16F84 pour voir tout ce dont nous n’avons pas parlé jusqu’à présent. C’est donc une sorte de fourre-tout que je vous propose ici. Je n’entrerai cependant pas dans les descriptions techniques détaillées, car ceci n’intéressera que les électroniciens. Ceux-ci étant parfaitement aptes à comprendre une figure telle que la figure 3-1. Pour les autres, ceci n’apportera rien de plus à l’utilisation des PICs.

Cette leçon vous montrera du même coup comment comprendre un datasheet.

Comme les datasheet sont sans cesse mis à jour chez Microchip, je joints à la leçon celui qui m’a servi jusqu’à présent pour faire ces cours, et qui s’appelle "16F84.pdf " [ NDLR : datasheet ici ]

17.1 La structure interne

Figure 3-1, justement, vous voyez comment est construite une 16F84. Comme je le disais plus haut, ceci ne présente qu’un intérêt limité pour l’utilisation du processeur. Cependant, vous pouvez remarquer les largeurs de bus internes qui vous rappellent les limitations des modes d’adressage. Vous voyez par exemple que le PC (Program Counter) n’a qu’une largeur de 13 bits.

Le cœur de la 16F84, comme dans tout processeur, est l’ALU. C’est dans cette Unité Arithmétique et Logique que s’effectuent tous les calculs. Notez la liaison entre le registre W et l’unité ALU.

17.2 La séquence de décodage

Figure 3-2, vous voyez clairement la division d’un cycle d’horloge en 4. Chacun des 4 clocks nécessaires à la réalisation d’une instruction est détaillée. Vous voyez l’exemple 3-1 qui montre l’exécution d’un bout de programme. Notez que durant qu’une instruction est exécutée, la suivante est déjà chargée (" fetch "). Ceci explique que lors d’un saut, l’instruction suivante chargée n’étant pas celle qui doit être exécutée, il faut alors un cycle supplémentaire pour charger la bonne instruction.

17.3 Organisation de la mémoire

Sur la figure 4-1 vous voyez l’organisation mémoire de la PIC. Notez que la pile et le PC sont situés hors de l’espace d’adressage, et donc sont inaccessibles par le programme.

17.4 Les registres spéciaux

Le tableau 4-1 vous donne une vue globale de tous les registres spéciaux. La première colonne vous donne l’adresse du registre , la seconde le nom symbolique du registre, ensuite le nom de chaque bit.

L’avant-dernière colonne vous donne la valeur de chaque bit après une mise sous tension, tandis que la dernière colonne fait de même pour les autres types de reset (watchdog et MCLR). Les bits notés 0 ou 1 sont ceux dont le niveau est celui indiqué. Les bits notés " u " sont les bits non affectés par un reset. Les bits notés " x " sont les bits dont l’état ne peut être connu à ce moment.

17.5 L’électronique des ports

Les figures 5-1 à 5-4 permettront aux électroniciens de comprendre les spécificités des ports IO au niveau de leurs caractéristiques électriques.

17.6 Le registre de configuration

Le registre de configuration est situé à l’adresse 0x2007, hors de l’espace d’adressage normal de la PIC. Il n’est accessible qu’au moment de la programmation.

Vous accédez à ce registre à l’aide de la directive _CONFIG, ou à l’aide de la directive DA précédée de la directive ORG 0x2007. A ce moment, la donnée que vous indiquerez suite à la directive DA précisera le niveau des 14 bits utiles pour la 16F84 (5 bits pour la 16C84).

L’explication et la position de ces 14 bits sont donnés figure 8-1. N’oubliez pas qu’il s’agit ici d’un mot de 14 bits (tout comme les instructions).

A titre d’exemple, la ligne suivante :

  __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC

Correspondra donc pour une 16F84 à ceci :

  ORG 0x2007  
  DA B’111111111111110’  

JE VOUS DECONSEILLE CE GENRE DE PRATIQUE, nous verrons plus bas pourquoi.

17.7 Les différents types d’oscillateurs

La figure 8-3 nous montre la configuration que nous avons utilisée pour l’horloge de notre PIC. C’est l’utilisation avec quartz externe. La résistance RS est inutile pour un quartz classique. Si vous utilisez un résonateur céramique avec condensateurs intégrés, au lieu d’un quartz, vous pourrez supprimer les condensateurs C1 et C2.

La table 8-1 montre les différentes valeurs à utiliser en fonction des fréquences, ainsi que les modes correspondants sélectionnés par les bits de configuration FOSC1 et FOSC0 si vous utilisez un résonateur céramique.

La table 8-2 fait de même pour les oscillateurs à quartz.

Notez que les bits cités sont intégrés dans les _HS_ OSC et autres configurations d’oscillateur. C’est ce qui explique que vous ne les ayez jamais rencontrés directement.

La figure 8-4 indique comment utiliser une horloge externe au lieu de l’oscillateur interne. Rappelez-vous dans ce cas de ne jamais paramètrer votre _CONFIG sur RC sous peine de destruction de votre PIC.

Les figures 8-5 et 8-6 vous montrent comment construire un oscillateur externe. Je vous conseille à titre personnel d’utiliser dans ce cas le 74HCU04 qui fonctionne bien pour des fréquences supérieures ou égales à 4MHz. J’utilise pour ma part un schéma dérivé du montage parallèle indiqué. Mon montage, sur 4MHz, utilise une R de 3,3Mohms à la place des 47Kohms, je remplace la R ajustable par une fixe de 2Kohms, et je supprime la R ajustable à l’extrême gauche du schéma. Je remplace les deux condensateurs par des 27pF.

Reste le mode d’oscillateur avec réseau Résistance Condensateur. Dans ce mode, l’oscillation est assurée par deux composants passifs, sans nécessiter de quartz (pour raisons d’économie). N’utilisez ce mode que si vos constantes de temps dans votre programme ne sont pas critiques. Connectez suivant la figure 8-7 et utilisez une Résistance de l’ordre de 47Kohms et un condensateur de l’ordre de 27picofarads (27pF).

N’oubliez pas dans tous les cas que la vitesses d’exécution d’une instruction est le quart de la vitesse d’horloge. Utilisez la formule suivante pour calculer le temps d’un cycle de votre programme. Soit F la fréquence de l’horloge fournie et T le temps d’un cycle :

T = 4 / F

Par exemple, pour un quartz de 4MHz : T = 4 / 4000000 = 1 microseconde.

Et réciproquement : F = 4 / T pour calculer la fréquence qui correspond à un temps de cycle calculé.

Donc, si je veux un temps de cycle de 1,5 µs (microseconde), il me faudra une horloge cadencée à :

F = 4 / (1,5*10-6) = 2,667 * 106 = 2,667 MHz (Mega Hertz)

17.8 Le reset

Figure 8-8 vous avez le schéma du circuit de reset interne. Ne vous inquiétez pas, tout le travail a été fait pour vous. Retenez ceci : pour faire fonctionner la PIC normalement, reliez la pin MCLR au +5V. La mise à la masse de cette broche provoque un reset de la PIC.

Si vous voulez par exemple un bouton reset sur votre montage, reliez la pin MCLR au +5 via une résistance de 10Kohms. Placez votre bouton reset entre la pin MCLR et la masse.

Le tableau 8-3 vous montre tous les événements liés au reset, et leurs effets sur le PC(où le programme se branchera) et le registre STATUS. Je vous traduis le tableau ci-dessous.

Evénement

Branchement (PC)

STATUS

Mise sous tension

0x00

00011xxx

MCLR à la masse durant fonctionnement normal

0x00

000uuuuu

MCLR à la masse durant mode sleep

0x00

0001uuuu

Reset par dépassement timer watchdog

0x00

00001uuu

Sortie du mode sleep par dépassement watchdog

Suite programme (PC+1)

uuu00uuu

Sortie du mode sleep par interrupt avec GIE = 0

PC + 1

uuu10uuu

Sortie du mode sleep par interrupt avec GIE = 1

PC + 1 puis 0x04

uuu10uuu

 

Le tableau 8-4 est très intéressant, car il vous montre le contenu de chaque registre après un reset et après un réveil. Rappelez-vous que les valeurs " x " renseignent un état inconnu, " u " signifie inchangé par rapport à la valeur précédente, et ‘q’ signifie que l’état dépend de la cause de l’événement (voir tableau ci-dessus).

17.9 La mise sous tension

Dès que vous placez votre PIC sous tension, un circuit interne analyse la tension d’alimentation. Un reset automatique est généré dès que cette tension monte dans la zone 1,2 à 1,7 volts. Ceci est le reset de mise sous tension (Power On Reset). Notez déjà que ce circuit ne provoque pas un reset si la tension baisse. C’est à vous de gérer ce cas particulier s’il vous pose problème.

Ce reset déclenche un timer interne et indépendant de la vitesse de la PIC. Ce timer maintient le PIC à l’arrêt durant un temps typique de 72ms dès détection de la condition de reset . Ce timer est appelé " PoWeR-up Timer " ou PWRT. Il peut être mis en ou hors service via le bit de configuration PWRTE. Je vous conseille de le mettre toujours en service, sauf si le temps de démarrage sous tension était critique pour votre application.

Ensuite, après écoulement du temps précédent, nous avons un temps supplémentaire sous forme d’un comptage de 1024 oscillations de l’horloge principale (Oscillator Start-up Timer).

Ceci permet de s’assurer d’un fonctionnement stable de cette horloge. Cet OST n’est pas utilisé pour le mode d’oscillateur RC, et est en service pour les mises sous tension et les réveils (par pour les autres formes de reset).

La figure 8-10 vous montre le chronogramme typique d’une mise sous tension. J’explique rapidement. Sachez que le déplacement horizontal de gauche à droite représente le temps.

La ligne 1 montre l’arrivée de l’alimentation (VDD). Une fois cette alimentation arrivée à 1,2/1,7V, le processus de mise sous tension est amorcé.

La seconde ligne vous montre que le démarrage du processus ne dépend pas du niveau de la ligne MCLR. Dans cet exemple, cette ligne passe à l’état haut un peu plus tard. Si vous l’avez reliée au +5V, elle passera à 1 en même temps que la ligne VDD sans aucune sorte d’influence.

Ensuite, vous voyez que le reset interne (POR) est validé dès que l’alimentation est passée au point précité. S’écoule ensuite éventuellement le temps de 72ms du PWRT s’il est mis en service.

A la fin de ce temps, l’OST démarre ses 1024 cycles d’horloge pour les modes concernés. La procédure est alors terminée.

Si à ce moment MCLR est à 1, la PIC démarre directement (tableau 8-10). Si MCLR est toujours à 0, la Pic démarrera instantanément dès le passage de MCLR à 1 (tableau 8-11).

Le tableau 8-13 vous montre ce qui se passerait si l’alimentation montait trop lentement en tension, alors que MCLR est relié à l’alimentation.

Dans ce cas, le reset interne serait terminé avant l’établissement de la tension normale, ce qui n’est pas conseillé. Dans ce cas, utilisez le schéma de la figure 8-9 pour ralentir la montée en tension sur MCLR et allonger le temps du reset.

Les figures 8-14 et 8-15 vous donnent les méthodes de protection à utiliser en cas de baisse de la tension sans arrêt complet.

17.10 Caractéristiques électriques

A partir du chapitre 11, vous trouvez toutes les spécifications électriques de votre composant. Ceci intéresse les électroniciens concepteurs de montages particuliers. Pour un usage courant, les explications des leçons précédentes suffisent largement. Pour des applications pointues au niveau des spécificités électriques, il vous faudra étudier ces tableaux plus en détail. Je pense donc inutile de détailler ces caractéristiques détaillées.

17.11 Portabilité des programmes

Voilà un point crucial. Que deviendra votre programme si vous changez de modèle de PIC ? Voici ce que vous devez faire pour assurer la portabilité de votre programme

  • Vous devez impérativement utiliser les directives prévues (_CONFIG) au détriment des accès directs style (ORG 0x2007). En effet, ces emplacements et leur contenu sont susceptibles de modifications d’un modèle à l’autre.
  • Vous devez utiliser les fichiers " .inc " de Microchip correspondant à la PIC sur laquelle va tourner votre programme. Par exemple " P16f84.inc ".
  • Vous devez lire les nouveaux datasheets pour analyser les différences entre le composant initial et le nouveau. Au besoin effectuez des modifications dans votre source.
  • Vous pouvez ensuite recompiler votre programme, après avoir remplacé la ligne " include " par celle contenant le nouveau fichier " include "

Notez donc que votre programme sera d’autant plus facilement portable que vous aurez suivi les consignes données, que vous aurez utilisé au maximum les déclarations, define et macros, et que vous aurez commenté votre programme.

Notez également que si vous avez compris ce qui précède, UN FICHIER .HEX CONCU POUR UN COMPOSANT NE PEUT JAMAIS ETRE UTILISE TEL QUEL POUR UN AUTRE COMPOSANT, sauf cas très rares. N’espérez donc pas placer tel quel votre fichier 16F84 dans une 16F876.

17.12 Les mises à jour des composants

A l’appendice E, vous trouverez un tableau donnant les différences entre la 16C84 et la 16F84. Nous allons y jeter un œil.

La première ligne montre que PWRTE a changé de niveau. En effet, PWRTE à 1 mettait en service le timer sur reset de 72ms pour la 16C84. Pour la 16F84, il faut mettre ce bit à 0.

Notez déjà que si vous avez utilisé la directive _CONFIG, il vous suffira de recompiler votre programme, car le nouveau fichier " p16F84.inc " intègre automatiquement la modification. Si par contre vous avez voulu utiliser une écriture directe en 0x2007, en dépit des avertissements de ces leçons, il vous faudra modifier votre programme.

Ensuite vous voyez que la capacité en RAM utilisateur (variables) est passée de 36 octets à 68 octets.

Puis vous constatez que Microchip a ajouté un filtre sur la pin MCLR afin d’éviter que des parasites ne provoquent un reset inopinément. Ceci allonge cependant la longueur de l’impulsion nécessaire pour provoquer un reset souhaité.

Viennent ensuite un avertissement sur quelques caractéristiques électriques de la PIC. Cet avertissement vous renvoie aux différents tableaux des caractéristiques électriques.

Directement après, encore une correction au niveau du fonctionnement du PORTA, lorsque la PIC était utilisée avec une fréquence inférieure à 500 KHz.

Puis Microchip a ajouté un " trigger de schmitt " au niveau de l’entrée RB0 lorsqu’elle est utilisée en interruption. Pour les non-électroniciens, sachez simplement que cela limite le risque de fausse interruption suite à un niveau incertain sur la pin.

Vous voyez également que la mise à 0 des bits 7 et 6 de EEADR ne provoque plus une modification du courant consommé par la PIC. C’est une correction de bug. En effet, sur la 16C84, le fait de laisser ces pins à l’état haut augmentait le courant consommé.

Notez ensuite que le fameux CP (code protect) qui contenait un seul bit sur la 16C84, passe maintenant à 9 bits. Ceci permet de créer différents types de code protect différents sur les autres PICs de la famille (protection data, protection eeprom etc.).

Une fois de plus, si vous aviez utilisé les directives _CONFIG, il vous suffit de recompiler votre programme.

Constatez enfin la correction d’un bug interne lorsque vous placiez le bit GIE à 0. Désormais, une interruption ne pourra plus être générée au cycle suivant. La boucle " loop " qui était nécessaire pour vérifier la bonne mise hors service des interruptions n’est plus nécessaire sur le 16F84. Cette boucle était de la forme :

loop      
  bcf INTCON , GIE ; Arrêter les interruptions
  btfsc INTCON , GIE ; Tester si une interruption n’a pas remis GIE à 1
  goto loop ; si, alors on recommence


17.13 Conclusion

Vous voilà maintenant en possession de la totalité des informations nécessaires pour développer vos propres programmes en 16F84. Attention, il vous faudra cependant pratiquer avant de devenir un " crack " de la programmation. Vous vous direz souvent : " c’est pas possible, ça devrait marcher, ma 16F84 est défectueuse ". Dans 99% des cas, ce sera un bug de votre programme, que vous trouverez peut-être après plusieurs jours de recherche. Ne vous découragez pas et relisez les documentations, même si vous êtes certains de les connaître par cœur.

Je vous ai souvent volontairement fait faire des erreurs, que j’ai corrigées par la suite. J’ai fait cette démarche dans le but de vous faciliter la vie, en vous montrant ce qui était parfois de fausses évidences, et en vous expliquant la bonne démarche pour obtenir un résultat fiable.

Je ne vous laisse pas encore tomber, car je vais vous expliquer quelques astuces bien pratiques pour les programmes les plus courants. Mais déjà maintenant, vous êtes capables de travailler seul.

Je vous ai fourni le dictionnaire de rimes, à vous d’écrire les poèmes…


 

Index cours
Index du cours
Chapitre précédent
16. Le mode Sleep
Chapitre suivant
18. Astuces de programmation

 


Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/cours/pic16f84/PART1_cours17.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail