«

»

Hello World !

  • 2 – Initialisation de certains registres

Certains registres doivent impérativement être initialisés avant d’exécuter la boucle sans fin dans laquelle est mise à jour l’état de la Led :

    • Lignes 281-283 du listing, les 2 registres Pointeur de Pile W15 et le registre de test de la pile SPLIM (0x20) sont initialisés pour permettre l’utilisation de 2 plages d’adresses : la 1ère [0x800…0x8FF] pour une zone de travail de 256 mots et la seconde [0x900…0x9FF] pour la stack de 256 mots gérée par le registre  W15.
    • Ligne 285, le bit CLKDIV<PLLEN> doit être positionné à 1 car c’est ce mode de génération de l’horloge système qui a été configuré dans CW2. Lignes 292-294, une boucle d’une durée forfaite de 150 µS (paramètre TLOCK) est déroulée pour attendre que la PLL soit lockée avant de poursuivre l’exécution.
    • Ligne 297, le registre AD1PCFG est entièrement initialisé à 0xFFFF car aucune fonction analogique n’est utilisée dans le programme; toutes les entrées / sorties sont du type digitale.
    • Ligne 300, le bit 15 du registre TRISB (initialisé au Reset à 0xEFBF) est remis à 0 car la Led est connectée sur la pin  RB15, toutes les autres pins étant configurées en entrée et en particulier RB5 à laquelle est connectée le bouton poussoir.
    • Ligne 303, le bit CNPU2<CN27PUE> est positionné à 1 pour bénéficier de la résistance de rappel (pull-up) aux +3 Volts sur l’entrée RB5 qui est connectée au bouton poussoir (vu du programme nous avons la logique suivante : 0 pour un appui et 1 pour un relâcher du bouton poussoir).

Important!

Aucune autre initialisation n’est nécessaire pour réaliser ce petit programme.

Notice

Dans un programme plus complexe et notamment écrit en Langage C, il sera préférable d’utiliser la stack dans la plage [0x800…(SPLIM – 1)] pour bénéficier de la détection de débordement lors des opérations de push et de pop au travers de W15. En effet un trap du type « Stack Error » sera exécuté dès lors qu’à l’issue de ces opérations, le registre W15 devient inférieur à 0x800 ou supérieur ou égal à SPLIM. A noter que la valeur 0x800 est la valeur d’initialisation au Reset de W15.

 

  • 3 – La routine de temporisation de 10 mS

Le but de cette routine est de réaliser sans l’utilisation de Timer une attente de 10 mS exactement (hors appel depuis d’autres parties du code). Pour cela il faut exécuter 160000 cycles d’une durée de 62.5 nS chacun et qui se répartissent comme 160000 = 1 + ((4 * 39999) – 1) + 1 + 1 + 2 en application de la spécification PIC24F Family Reference Manual (CPU) avec les précisions suivantes :

    • Ligne 394du listing, le registre W9 varie entre les valeurs 39997 et -1 fournissant bien 39999 boucles de 4 cycles car à la ligne 396, l’instruction de branchement  bra  NZ,wait_for_10mS_more s’exécute en 2 cycles sauf pour la dernière boucle (origine du -1 dans la formule de calcul).
    • Lignes 398 et 399, deux instructions nop permettent de compléter à 160000 cycles.

Notice

La valeur d’initialisation à 39998 du registre W9 est volontaire pour montrer l’utilisation à la ligne 385 de l’instruction add  W9,#0x01,[W15] qui permet de tester en 1 cycle le contenu du registre W9 à une valeur particulière et ce sans le modifier en s’appuyant sur la 1ère position disponible de la stack accédée en écriture par [W15].

Important!

Cette ligne de code assembleur est tirée du code généré par le cross compilateur  pic30-gcc utilisé pour les développements en Langage C. Nous ferons souvent appel à cette méthode qui consiste à s’inspirer d’un code assembleur produit après compilation d’un « petit bout de code » écrit en Langage C.

 

  • 4 – La routine de mise sur voie de garage

Le but de cette routine est d’éviter de continuer sur une erreur grave qui, dans la plupart des cas, n’est pas récupérable. Dans un autre programme Hello World !, nous montrerons la manière de provoquer, voire de récupérer l’erreur sauf pour « Oscillateur en défaut » qui est difficile à mettre en œuvre. De plus, nous montrerons  par la même qu’il est fortement conseillé d’implémenter le traitement correspondant dans le cas de programmes plus complexes même si ce traitement ne fait que constater … qu’il y a eu une erreur.

Notice

Ligne 275 du listing, il est supposé que la pin RB5 est toujours programmée en output.