Programmation in-situ de la mémoire flash du HC08
Transcription
Programmation in-situ de la mémoire flash du HC08
Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Programmation in-situ de la mémoire flash du HC08 Nabil Al-HOSSRI, département GEII IUT Bordeaux1 E-mail: [email protected] Sommaire PROGRAMMATION IN-SITU DE LA MEMOIRE FLASH DU HC08 ........ 1 INTRODUCTION ................................................................................ 2 LA MEMOIRE FLASH ........................................................................... 2 PROGRAMMATION IN-SITU EN MODE MONITEUR ............................................ 3 LA PRISE RS232 DU PC ..................................................................... 3 PROGRAMMATEUR COMMERCIAL ............................................................. 4 0BPROGRAMMATEUR « MAISON » .......................................................... 6 LOGICIEL CODE WARRIOR ................................................................... 7 CARTE MICROCONTROLEUR TYPE MC68HC908GP32.................................... 9 CARTES D’APPLICATION......................................................................11 Carte d’affichage sur LCD 2x16 alphanumérique ......................11 Carte de visualisation sur LCD graphique 128x64 pixels ............12 Interface permettant de dialoguer en duplex entre PC et micro ..13 Interface d’un clavier matriciel 16 touches ..............................14 Programmation in-situ de la mémoire flash du HC08 ________________________________________ 1 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Introduction Lors du développement d’une application électronique basée sur des systèmes à microcontrôleur, il est nécessaire de reprogrammer à plusieurs reprises les composants, surtout pendant la phase de mise au point de l’application. Or il est pénible de sortir le composant de son support, le placer sur le programmateur, le replacer dans le circuit, pour finalement s’apercevoir que le soft ne marche pas et qu’il faut réitérer la manœuvre !!! En effet, à cette occasion, il peut subir plusieurs dommages : pattes qui se tordent, dessoudage nécessaire quand il s’agit d’une technologie CMS. On voit vite l’intérêt de pouvoir reprogrammer le composant sans le sortir de sa carte cible. Afin de pouvoir programmer un composant logique, il va falloir aménager les cartes cibles. Néanmoins, nous voulons que l’encombrement supplémentaire et le nombre de composant soient minimisés le plus possible. Il faut aussi ne pas perdre trop de pattes d’entrées-sorties sur les composants. Afin de réaliser tout ceci, on va prévoir des connecteurs sur la carte qui nous permettront de relier un programmateur in-situ à nos microcontrôleurs. Nous utilisons essentiellement des microcontrôleurs HC08 de la firme Freescale. Le programmateur doit permettre la programmation in-situ des microcontrôleurs, et aussi leur debugging, procédure bien pratique en phase de développement d’une application. La mémoire flash La mémoire Flash des microcontrôleurs HC08 de la firme Freescale peut être programmée ou effacée, selon l’utilisation des routines fonctionnant dans le mode autonome ou le mode moniteur. En mode autonome le micro exécute les codes qui ont été programmés par l’utilisateur, dans sa mémoire Flash. C'est le mode de fonctionnement habituel d’un processeur. En mode moniteur, le micro exécute les routines qui ont été figées, au cours de sa fabrication, dans une zone de sa mémoire. Ce mode est employé pour gérer une communication sérielle, via une seule broche (PTA0 pour HC08GP32), avec un équipement extérieur. L’effacement et la reprogrammation de la mémoire flash du micro font aussi appel à ce mode. Les niveaux logiques appliqués sur quelques broches du micro utilisé déterminent, après une mise sous tension, son mode de fonctionnement. Pour le HC08GP32 voir le tableau 1 suivant : Mode moniteur du HC08GP32 Nom Niveau ou tension VDD IRQ\ PTA0 PTA7 PTC0 PTC1 PTC3 Quartz Transmission 5V De 7V à 9V «1» «0» «1» «0» «1» 9.8304 MHz 9600 Bauds Tableau 1 Conditions de mise en mode moniteur du HC08GP32. Le dialogue avec un PC se fait via la ligne bidirectionnelle PTA0. Pour plus de détails se référer à la section « Monitor ROM » ici . Programmation in-situ de la mémoire flash du HC08 ________________________________________ 2 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Programmation in-situ en mode moniteur Pour programmer, in-situ (‘sur place’, ou ICP, pour : In-Circuit Programming), un microcontrôleur de la famille HC08 de chez Freescale, on doit disposer de l’équipement suivant (Figure 1) : Programmateur HC08 Carte d’application Figure 1 Plate-forme de programmation in-situ du HC08. Cette plate-forme comprend : Un PC possédant un port série à la norme RS 232. Un logiciel (compilateur/debugger) capable de contrôler le cycle dit « power off/on » pendant lequel le micro doit être mis hors tension (VDD du micro < 100mV, voir aussi Tableau 1). Ce cycle est nécessaire pour que le micro démarre en mode moniteur. Une interface (programmateur) qui assure une mise en dialogue correct entre le PC et le micro. Une carte micro montée en mode moniteur (tableau 1). La prise RS232 du PC La prise RS 232 du PC est en général au format DB9 (9 broches) de type femelle. Du côté de l’application, il est de type mâle. Le tableau 2 suivant exprime les différentes broches de ce connecteur : N° Nom E/S Description 1 CD E Carrier Detect: Déclare que l'autre équipement reçoit une réponse. 2 RD E Received Data : Entrée de réception des données 3 TD S Transmitted Data : Sortie d'émission des données 4 DTR S Data Terminal Ready : Indique à l'autre équipement que l'on souhaite communiquer. 5 SG 6 DSR E Data Set Ready : Indique que l'équipement opposé est prêt. 7 RTS S Request To Send : Demande à l'autre équipement de se tenir prêt à recevoir. 8 CTS E Clear To Send : Indique que l'autre équipement est prêt à recevoir. 9 RI E Ring Indicator : Annonce que le modem reçoit un appel. Signal Ground : Masse Tableau 2 Les 9 Broches de la prise RS 232 du PC Programmation in-situ de la mémoire flash du HC08 ________________________________________ 3 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Les quatre broches principales utilisées par notre programmateur sont évidemment les broches de transmission des données 2 et 3, la broche 4 (DTR) dont on verra plus loin le rôle, et naturellement la masse (broche 5). Les niveaux logiques de ces broches sont représentés par: Niveau « 1 » logique est une tension de -12V. Niveau « 0 » logique est une tension de +12V. A noter que les tensions logiques sur un système informatique sont en général de 0 et 5V, et c’est le cas de notre microcontrôleur HC08. Un circuit d'adaptation s’avère nécessaire pour convertir ces tension en ± 12V et réciproquement. Figure 2 Le circuit MAX232 de chez MAXIM. On y voit les valeurs des condensateurs à adopter. Le circuit MAX232 de la figure 2 est conçu pour réaliser cette fonction. Les 4 condensateurs dont il est équipé permettent de générer les tensions de 10V et -10V à partir du 5V. En pratique, la mesure réelle donne ±9,3V. Programmateur commercial Le programmateur doit répondre aux exigences suivantes : Au repos, il doit mettre le microcontrôleur en mode moniteur (cf. Tableau 1) et de ce fait : 1. alimenter le micro sous une tension VDD=5V, 2. appliquer à l’entrée IRQ\ une tension entre 7 et 9V, 3. positionner data (PTA0 pour HC08GP32) à une tension de 5V. A l’arrivée d’une impulsion (-12V) sur la ligne DTR du port série du PC : 1. couper l’alimentation (VDD≤100mV) du micro, Programmation in-situ de la mémoire flash du HC08 ________________________________________ 4 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ 2. mettre l’entrée IRQ\ à zéro, 3. positionner data à zéro. Un schéma, dans sa version commerciale, accompagné de l’explication claire de son fonctionnement, a été publié par Freescale sous forme d’une note référencée (AN-HK- GND 4.7u C9 1k 2N3906 10k R11 Data 5v_micro 2N3904 100n R3 330 LED D2 C7 5v fixe VCC 74HC125 6 C6 470u C5 1N4007 CONN-H2 1 2 D1 1/2 watt min De 9v à 12v J2 Prise femelle 100n 1 U2 2 GND 7805 VO VI 10u 4 C1 10u 10u 5 C3 C4 MAX232 VS+ VS2 6 C2+ CONN-D9F Tx_PC Rx_PC C1- T1OUT R1IN T2OUT R2IN 14 13 7 8 DTR_PC 5 9 4 8 3 7 2 6 1 J5 C2- T1IN R1OUT T2IN R2OUT C1+ U1 10u Coté PC 180 3 C2 2.2k 1 RV1 R7 11 12 10 9 3 R5 10k 5 Tx_micro Rx_micro 3 10k R6 VCC U3:B U3:A 74HC125 10k R4 2 1k R10 8 74HC125 9 U3:C Buffers 3 états 100n 10u C10 10 C8 Q4 10k R9 Q3 2.2k R1 1N914 D5 1N914 D4 10k R2 2N3906 R12 5v_micro DTR_PC = -12v Power off CONN-SIL4 D'après la note AN-HK-33 IRQ\ VDD du micro Data Masse J1 Vers micro HC08 Vtst 5v_micro Data 1 2 3 4 DTR_PC = -12v Power off 1 Programmateur Freescale HC08 4 Q2 De 7.5V à 8.5V Vtst 33H ). A cause de la mauvaise qualité de ce document nous nous sommes permis de le reproduire à la figure 3. Ce programmateur est destiné à fonctionner, sous Code Warrior, en CLASS 1(cycle power off/on contrôlé par le signal DTR) et une vitesse de transmission de 9600 bauds. Figure 3 Schéma fonctionnel, d’après la note AN-HK-33H du programmateur Freescale HC08. , La figure 4 montre une réalisation fonctionnelle de ce programmateur. Programmation in-situ de la mémoire flash du HC08 ________________________________________ 5 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Figure 4 Un produit fini du programmateur Freescale réalisé par Christian CAZAUBON et Christian PECOSTE (GEII Bordeaux-2002). Programmateur « maison » Il pourrait être techniquement intéressant de développer notre propre programmateur. Dans ce but en nous inspirant du schéma commercial donné plus haut, et d’autres programmateurs présentés sur le site http://www.68hc08.net , nous avons élaboré un schéma simplifié qui le rend plus compact et plus économique car il minimise le nombre de composants utilisés, tout en préservant ses qualités fonctionnelles. Ce dernier est présenté, ci-dessous, dans le schéma de la figure (5). Son originalité réside dans l’utilisation du signal DTR pour contrôler, à la sortie IRQ\, le cycle power off/on, ce qui économise un boîtier de buffers et un transistor. Programmateur simplifié HC08 Vers micro HC08 J3 1 2 3 4 Vtst 5v_micro DATA C1 D4 100n 8.2V R2 R10 1k 1k CONN-SIL4 De 7 à 9V Vtst J4 1 2 VCC R3 13 5 9 4 8 3 7 2 6 1 CONN-H2 5 4 18 19 DTR_PC Tx_PC C1- C1+ T1OUT R1IN T2OUT R2IN T1IN R1OUT T2IN R2OUT MAX233 Rx_PC 14 12 17 CONN-D9F Coté PC Prise femelle VS+ C2a+ C2b+ VSaVSb- C2aC2b- 2 3 1 20 DATA 11 15 Rx_micro D3 10k R5 CONN-H2 1 VI 10k +5V U1 D1 1 2 1k R6 VCC J2 R8 1N4148 16 10 U2 De 9 à 12V VCC Masse 8 1k J1 IRQ\ 5v_micro DATA Masse 7805 VO 3 5V_micro Q1 GND 2N2905 D2 LED 2 R1 330 R7 C4 4.7k 10u GND N. AL HOSSRI Figure 5 Schéma fonctionnel de notre programmateur « maison » Programmation in-situ de la mémoire flash du HC08 ________________________________________ 6 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Notre collègue Martial Leyney s’est empressé de réaliser, tester et valider le bon fonctionnement de ce programmateur simplifié. Vous trouvez sur la figure 6 le montage final (à gauche), connecté à une carte d’application (à droite) à base de microcontrôleur type MC68HC908JL3. Figure 6 Un produit fini du programmateur « maison » réalisé par Martial Leyney (GEII Bordeaux-2008). Logiciel Code Warrior Le logiciel utilisé est Code Warrior. C’est un éditeur de la firme FREESCALE, d'environnement de développement (IDE) spécifique aux microcontrôleurs appartenant à ). Au début de chargement, en classe 1, d’un programme, la famille HC(S)08 (voir ici Code Warrior envoie, via la ligne DTR (cf. Tableau 2), une impulsion (-12V), de durée programmable par l’utilisateur. Cette impulsion doit être traduite par le programmateur par un cycle power off/on, ce qui met, on l’a vu, le micro en mode moniteur (effacement et reprogrammation de sa mémoire flash). La durée de l’impulsion DTR doit être suffisante pour que le programmateur puisse exécuter correctement le cycle power off/on. Dans le cas d’un programmateur, compte tenu de son temps de réponse, la durée programmée présentant le meilleur compromis est d’environ 900ms. Les démarches à suivre, sous Code Warrior, pour programmer la durée de l’impulsion DTR sont : au chargement d’un projet sous Code Warrior, le menu suivant s’ouvre : Programmation in-situ de la mémoire flash du HC08 ________________________________________ 7 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ un clic sur la flèche verte la fenêtre ci-dessous : permet de lancer le debugger et de faire apparaître 1. Sélectionnez la classe 1 à l’aide de la commande Add A Connection 2. Pour un premier effacement de la mémoire flash du micro, cochez la case « Ignore Security… » et exécutez manuellement le cycle power off/on. cliquez sur le bouton Advanced Settings… et remplissez le tableau comme cidessous: Programmation in-situ de la mémoire flash du HC08 ________________________________________ 8 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ validez le tout avec le bouton « Contact Target with These Settings » finalisez avec le bouton « Yes ». Patientez lors du chargement. It’s over! Carte microcontrôleur type MC68HC908GP32 Cette carte doit répondre aux exigences suivantes : disposer évidemment d’un microcontrôleur, par exemple, dans notre cas, du type MC68HC908GP32, monté en mode moniteur (voir Tableau 1). être munie d’un connecteur 4 broches lui permettant de dialoguer (effacement et reprogrammation de la mémoire flash du micro) avec le programmateur de la Figure 4. être munie des connecteurs permettant de piloter une carte d’application. Ces exigences aboutissent alors à un schéma représenté par la Figure 6. Retirer le fil d'alimentation extérieure +5v avant de brancher le câble de programmation J8 1 2 Aalimentation extérieure de +5V Schéma du câblage du microcontrôleur MC68HC908GP32 à insérer dans une application en vu de programmation in-situ (voir tableau 1). R6 1 2 J2 D1 220 LED Connecteur de programmation 1 2 3 4 Vtst 5v_micro DATA Masse IRQ 5v_micro PTA0 J1 U1 20 19 C3 22p 1 2 R1 X1 9.8304 2.2M 3 4 5 C4 6 14 22p 2 4 IRQ C2 1 3 BOU1 470n Reset du micro 33 34 35 36 37 38 39 40 PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7 R4 PTE0 PTE1 12 13 VDD VSS VDDA VSSA CGMXFC OSC2 OSC1 RST IRQ PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7 PTE0/TXD PTE1/RXD C1 VDDAD VSSAD PTB0/AD0 PTB1/AD1 PTB2/AD2 PTB3/AD3 PTB4/AD4 PTB5/AD5 PTB6/AD6 PTB7/AD7 PTC0 PTC1 PTC2 PTC3 PTC4 PTD0/SS PTD1/MISO PTD2/MOSI PTD3/SPSCK PTD4/T1CH0 PTD5/T1CH1 31 32 23 24 25 26 27 28 29 30 7 8 9 10 11 100n PTB0 PTB1 PTB2 PTB3 PTB4 PTB5 PTB6 PTB7 R2 R3 10k 10k PTC0 PTC1 PTC2 PTC3 PTC4 15 16 17 18 PTD0 PTD1 PTD2 PTD3 21 22 PTD4 PTD5 R5 10k 10k MC68HC908GP32 Figure 6 MC68HC908GP32 (40 broches) mis en mode moniteur. La résistance PULLUP de la ligne PTA0 se trouve dans le programmateur de la Figure 3 Programmation in-situ de la mémoire flash du HC08 ________________________________________ 9 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Pour simplifier son insertion dans une application, on peut l’encapsuler dans un souscircuit comme le montre la Figure 7. C’est vrai, les connecteurs, dans cette carte, sont bien présents, mais il faut voir que dans une application ils ne sont pas tous utilisés. Notre souci était de créer une carte micro universelle que l’on puisse exploiter quelle que soit la nature de l’application. Ainsi les ports A et B sont divisés en deux demi-octets (connecteurs de j9 à j12) et les deux sorties PTD4 et PTD5 de PWM sont isolées et disponibles aussi sur le connecteur j13. J4 PTE0 PTE1 PTD4 PTD5 1 2 3 4 PTA3 PTA2 PTA1 PTA0 1 2 3 4 8 7 6 5 4 3 2 1 J7 J11 J12 1 2 3 4 PTD0 PTD1 PTD2 PTD3 PTD4 PTD5 PTB7 PTB6 PTB5 PTB4 PTB3 PTB2 PTB1 PTB0 Port B Port D 1 2 3 4 5 6 PTB7 PTB6 PTB5 PTB4 PTB3 PTB2 PTB1 PTB0 J10 PTB3 PTB2 PTB1 PTB0 PTE0 PTE1 J9 PTA7 PTA6 PTA5 PTA4 PTE0 PTE1 8 7 6 5 4 3 2 1 1 2 3 4 1 2 3 PTA7 PTA6 PTA5 PTA4 PTA3 PTA2 PTA1 PTA0 PTB7 PTB6 PTB5 PTB4 1 2 PTD5 PTD4 Port E J5 J6 J14 1 2 PTC0 PTC1 PTC2 PTC3 PTC4 PTA7 PTA6 PTA5 PTA4 PTA3 PTA2 PTA1 PTA0 Port A Port C 1 2 3 4 5 MC68HC908GP32 J3 J13 CCT001 Figure 7 Sous circuit de la carte MC68HC908GP32 (40 broches). Tous les ports sont disponibles sur des connecteurs. La figure 8 donne une idée du typon que l’on peut réaliser sous le routeur ARES. 7654 8.5x6cm IRQ\ IRQ\ 7 +5v PTA0 3210 Port A Port A 0 76543210 0 7 6 5 44 7 7 0 33 2 1 0 Port B Port B 0 76543210 0 MC68HC908GP32 45 +5v +5v M Reset E 0 Port 4C Port 0 1 M 0 Port D 5 2 3C 4 Port 0 1 EM 01 Port 0 1Port 2 3D4 5 Figure 8 A titre indicatif voici comment se présente le typon du schéma précédent, avec les différents connecteurs. Programmation in-situ de la mémoire flash du HC08 ________________________________________ 10 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Cartes d’application Les applications sont trop vastes pour que l’on puisse les énumérer ici. Il suffit en réalité d’avoir de l’imagination et un besoin à satisfaire pour en créer une. Cependant, nous allons vous présenter dans la suite quelques applications courantes : Carte d’affichage sur LCD 2x16 alphanumérique (pour avoir plus ) d’informations, clic ici Son schéma d’adaptation avec notre carte universelle HC08 est illustré sur la figure 9. LCD1 Port A ou B J3 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 D7 D6 D5 D4 D3 D2 D1 D0 K A D7 D6 D5 D4 D3 D2 D1 D0 E RW RS VEE VDD VSS 8 7 6 5 4 3 2 1 Bonjour J5 1 2 3 4 D7 D6 D5 D4 D3 D2 D1 D0 E RW RS VDD Port A, B, C ou D VDD D7 D6 D5 D4 RV1 J2 47k 2 1 0 +5v R1 C1 180 J4 J1 2 1 100n 1 2 3 0 +5v Port A, B, C ou D D1 E RW RS LED Figure 9 Interface d’affichage sur LCD alphanumérique. Il couvre trois possibilités de fonctionnement du LCD : o la première possibilité en mode 4 bits, dont les données et les signaux de contrôle sont connectés sur deux ports différents ; o la deuxième, toujours en mode 4 bits, mais dont les données et les signaux de contrôle sont connectés sur le même port ; o enfin, évidemment, en mode 8 bits, forcément sur deux ports distincts. Cette carte est facilement routée sur la figure 10. Programmation in-situ de la mémoire flash du HC08 ________________________________________ 11 7 D0 D1 D2 D3 D4 D5 D6 D7 0 0 +5V D4 D5 D6 D7 RS RW E Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ 16 RS RW E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 1 Bonjour 8.5x5.7cm Figure 10 Le typon de l’interface LCD 2x16 alphanumérique. Cette fois ci le « Bonjour » est dans le bon sens !.. Carte de visualisation sur LCD graphique 128x64 pixels (pour plus de précisions, clic ici ): Son schéma d’adaptation avec notre carte universelle HC08 est illustré sur la figure 11. La figure 12 représente le typon correspondant (ce qui prouve qu’on peut vraiment faire afficher ce qu’on veut et aller jusqu’à manipuler le temps !) LCD1 GDM128X64A 24:00:01 VDD H 2 1 J4 6 5 4 3 2 1 8 7 6 5 4 3 2 1 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 VDD K A VEE RST CS2 CS1 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 E RW RS V0 VDD VSS 2 1 J3 J1 J2 Données Port A ou B R1 Commandes Port A, B ou D SW1 VDD 47 1/2W C1 RV1 100n 47k Figure 11 Le schéma de l’interface LCD 128x64 pixels. Programmation in-situ de la mémoire flash du HC08 ________________________________________ 12 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ 10x10cm H 24:00:01 RST CS2 CS1 E RW RS 0 0 Commandes 0 0 Données DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 7 +5v +5V+5v 1 Contraste 20 Figure 12 Le typon de la carte d’adaptation entre le HC08 et le LCD 128x64 pixels. Interface permettant de dialoguer en duplex entre PC et micro (pour plus de précisions, clic ici ): C’est un montage simple et facile à réaliser. Elle permet au micro de communiquer avec un PC via le port série RS 232. Son schéma est le suivant : C4 PC 3 1 6 2 7 3 8 4 9 5 1 10uF J1 C1Rx_PC 14 13 7 8 Tx_PC 2 6 Vers micro C1+ T1OUT R1IN T2OUT R2IN VS+ VS- U1 T1IN R1OUT T2IN R2OUT J2 11 12 10 9 Tx_micro Rx_micro 1 2 3 PTE0 PTE1 MAX232 C5 CONN-D9F C3 C2 10uF 10uF C25 100n C2+ C1 4 VCC J3 1 2 +5v 0 GND VCC 10uF Ce qui peut aboutir au typon ci-dessous : Programmation in-situ de la mémoire flash du HC08 ________________________________________ 13 +5v 0 0 PTE1 PTE0 Nabil AL HOSSRI http://nalhossri.free.fr _______________________________________________________________________________ Interface d’un clavier matriciel 16 touches En général ce type de clavier possède sa propre carte adaptatrice qui est constituée d’un connecteur huit broches (voir image ci-contre). Ce dernier peut être facilement connecté à notre carte universelle HC08. Pour exploiter la fonctionnalité KBI de notre micro, le clavier doit être connecté au port A (voir explication ici H). Accueil Programmation in-situ de la mémoire flash du HC08 ________________________________________ 14