Pour enseignant mise en oeuvre carte hc12
Transcription
Pour enseignant mise en oeuvre carte hc12
Pour enseignant mise en œuvre carte hc12.doc 1. 1 Mise en œuvre rapide du MC9S12DP256 et de la carte associée : CML12S-DP256 (de Axiom) 1.1. Le microcontrôleur type HC12 : MC9S12DP256 1.1.1. Résumé des caractéristiques Processeur ‘16bits’ mais dénomination peut être un peu commerciale, en fait les registres principaux sont identiques à l’HC11 (deux Accumulateurs A et B de 8 bits regroupables en un seul de 16 bits, c’est peu !). Les bus internes sont par contre bien 16 bits, et les bus externes en mode étendu peuvent avoir une structure 16 bits. Donc échanges et exécution des programmes accélérés par rapport à l’HC11. Registres identiques à l’HC11 Modèle d’interruption identique. Bus adresse 16 bits, bus données (interne ou externe) 8 ou 16 bits Assembleur compatible avec l’HC11, existence par contre d’instructions et de modes d’adressages bien plus performant (en particulier les adressages indexés avec incrémentation automatique, ainsi que des produits 16 bits par 16 bits, des divisions 32bits par 16 bits). On trouve même des instructions orientées traitement de signal du genre multiplication accumulation, pondération …. Mémoires internes : 256k Flash 4k EEPROM 12k RAM 20 lignes I/O avec possibilité d’interruption et de réveil (« Wakeup ») +29 simples lignes I/O (en « single chip » seulement, sinon servent pour le bus extérieur) Deux convertisseurs Analogique Numérique de 8 voies 10 bits Cinq bus CAN 2.0 à 1Mbit/s Timer à compteur 16 bits, 8 canaux. Deux Pulse accu : un de 8 et un de 16 bits. Huit canaux PWM (Modulateur de largeur d’impulsion) Deux ports série asynchrone RS232 (SCI) Trois ports série synchrone type SPI Un bus IIC compatible I2C Bus Fmax de 25MHz PLL pour différentes cadences à partir d’un seul quart de 4MHz ou 5 MHz. Package 112 pattes LQFP 1.1.2. Espace adressable de 1 Méga octets ! 1) Principe de la pagination Ce processeur à seulement 16 bits d’adresses permet d’adresser plus de 64k octets de mémoire grâce à un système de pagination : Un certain nombre de « pages » de 16k octets sont placées aux mêmes adresses de 8000 à BFFF. Six bits supplémentaires constituant le numéro de page sont stockées dans un Registre de Page. On dispose ainsi de 64 pages de 16k accessible de 8000 à BFFF et ce processeur peut donc accéder à un espace de 1Moctet ! Remarques : On peut accéder directement à certaines pages (pages 3D, 3E, 3F) par d’autres adresses. 2005 Pour enseignant mise en œuvre carte hc12.doc 2 Les pages peuvent être internes ( ‘On chip’ ) au processeur ou externes (‘Off Chip’) dans le cas du processeur en mode étendu. Le compilateur C de IAR System permet une compilation en mode paginé, mais pour de petites et moyennes applications comme ce sera le cas ici, nous travaillerons toujours en mode non paginé, comme pour des microcontrôleurs et compilateurs plus simples. Le domaine adressable n’est pas entièrement exploité, mais c’est suffisant dans de nombreux cas. 2) Différentes versions Plusieurs versions existent, deux registres internes en lecture seule (MEMSIZ0 et MEMSIZ1) nous renseignent sur notre processeur : Mémoire physique FLASH EEPROM : 48k Espace mémoire total On_chip : 256k 16 pages de 16k, N° 30 à 3F Espace mémoire possible total Off_chip : 768k 48 pages de 16k, N° 00 à 2F Accès de 0000 à 3FFF équivalant à la page 3D Accès de 4000 à 7FFF équivalant à la page 3E Accès de 8000 à BFFF avec N° de page sur 6 bits Accès de C000 à FFFF équivalant à la page 3F On se reportera au plan mémoire un peu plus loin. 1.1.3. Mise au point par port BDM Sur de nombreuses cartes à microcontrôleurs la mise au point s’effectue par : - Un moniteur : Logiciel en ROM sur la carte permettant la liaison avec l’ordinateur de développement, le téléchargement, le pas à pas … Sonde et logiciel, permettant le Debug en temps réel, bien plus - Un Emulateur : onéreux, mais plus performant. - Pour l’HC12 un port « BDM » signifiant Background Debug Module, travaillant sur interruptions permet le dialogue avec l’ordinateur de développement. Aucun logiciel de dialogue n’est présent sur la carte. Un câble de liaison spécial par contre assez onéreuse est nécessaire….. Au niveau des possibilités et des performances en développement, on se situe entre le moniteur et l’émulateur. 1.1.4. Les différents modes du processeur 1) Mode Special Single Chip : Vecteur Reset Inhibé. Mode parfois nécessaire pour la prise en main initiale par le BDM. Le passage dans les autres modes peut s’effectuer par la suite. L’application définitive n’est pas possible dans ce mode, le vecteur Reset étant inhibé ! 2) Mode Normal Single Chip Gestion du Vecteur Reset .Mode normal pour applications Single Chip. Mode de démarrage utilisé pour travailler avec les outils et le Debugger de IAR System que nous utiliserons. Le passage dans le mode suivant peut s’effectuer par la suite. 3) Mode Normal Expanded Wide Gestion du vecteur Reset. Bus externe de 16 bits de données. C’est le mode étendu avec circuits supplémentaires directement câblés sur le BUS. 2005 Pour enseignant mise en œuvre carte hc12.doc 3 Et au démarrage ? Les valeurs (0 ou 1) de trois lignes BKGD/MODC, MODB et MODA sont mémorisées sur le front montant du signal classique Reset , et fixent trois bits MODC, MOD et MODA d’un registre interne déterminant le mode au démarrage. Par programmation, on peut modifier ensuite une seule fois ce mode. Avec les outils IAR Systems, la prise en main par le BDM est possible en Normal Single Chip. On configurera donc matériellement le système pour démarrer toujours (mise au point et application finale) en Normal Single Chip, code 100 pour MODC MODB MODA. On pourrait aussi démarrer et rester en Special single Chip mais uniquement en mise au point car ce mode ne gérant pas le vecteur Reset empêchera l’application définitive de démarrer automatiquement à la mise sous tension ! 1.1.5. Registres de configuration de l’HC12 ! L’HC12 contient des centaines de registres, et de nombreuses options de modification du plan mémoire, de protection de zones de Flash ….. Nous n’en décrirons qu’un strict minimum et petit à petit en fonction des besoins …. 1) Configuration lors du téléchargement Ces registres (extraits de « Core user guide » ) sont à configurer avant téléchargement par le fichier .mac de configuration du BDM qui sera étudié par la suite: CML12S-DP256.mac La carte fonctionne normalement en mode étendu large, avec bus donnée étendu à 16 bits (mode Normal Expanded Wide). Les ports PORTA, PORTB, PORTK et PORTE servent au mode étendu. PEAR $A 1 1 0 0 $0C Carte CML-12DP256 Signal RW validé Strobe octet bas validé (Pour travailler avec PORT E générant des signaux de contrôle en mode étendu) MISC $13 0 1 0 1 $05 microcontrôleur avec FLASH et EEPROM validées en FLASH Stretch 1 Tck ROMON ROMHM 0 pour accéder directement à la FLASH et à l’EEPROM aux adresses <8000. On remarque pour l’accès aux adresses externes une valeur 1 Tck d’allongement de cycle, les accès mémoire externes sont donc très légèrement ralentis. 2005 Pour enseignant mise en œuvre carte hc12.doc MODE (Flash) $0B 0 4 $00 Single Chip ? 0 1 1 $EB Normal Expansion Wide carte CML-12SDP256 IVIS EME EMK $E3 juste après téléchargement Pour carte et application finale Mode Etendu Mode 000 Special Single Chip 111 Normal Expansion Wide IVIS permet de rendre visible les cycles internes, nécessaire au moment du téléchargement par le BDM (dans le cas de chargement dans la RAM externe), inutile et nuisible ensuite pour les circuits en zone externe. EME et EMK à 1 (Emulate E et K) font travailler PORT E et PORT K en gestion des signaux de contrôle pour le mode étendu. PPAGE $30 Le N° de page $2F par exemple (Attention voir le plan mémoire et les restriction de travail en mode non paginé) 2) Configuration à replacer en début d’exécution pour l’application définitive A la mise sous tension, seules le Mode initial et la présence de la FLASH sont définies par cablage. Le fichier de configuration du téléchargement est sans objet pour l’application finale. Si on veut conserver le mode étendu, il faut donc nécessairement compléter la bonne configuration au moment de l’exécution de l’application définitive. On doit donc placer en début du main() ces quelques lignes : // Lignes utiles seulement pour l’application définitive PEAR = 0x0C ; PEAR = 0x0C ; //deux fois pour plus modifiable ensuite MODE = 0xE3 ; // IVIS ne doit plus être à 1 ! MODE = 0xE3 ; //deux fois pour plus modifiable ensuite MISC = 5; PPAGE = 0x2F ; // Si on se sert de cette page Remarques : - Ces lignes peuvent se laisser en développement, les cinq premières sont sans effet (car les bits concernés ne sont modifiables qu’une ou deux fois après un démarrage), la dernière est redondante. - Le bit ROMON de MISC est évidemment déjà à 1 par câblage à la mise sous tension. Ces lignes comme nous l’avons déjà vu peuvent se placer : - Cas général, dans le C Startup - Cas particulier fréquent pour des applications sans variables initialisées dans la RAM supplémentaires : en début de main(). 2005 Pour enseignant mise en œuvre carte hc12.doc 1.2. 5 La carte associée : CML12S-DP256 (de Axiom) 1.2.1. La carte La carte possède 256 k octets de RAM supplémentaires. Mais si l’on travaille en C avec le mode le plus simple Non Paginé, on ne peut y stocker du code que dans la page initiale, et des données à condition de gérer soi même le numéro de page. Position des cavaliers : NO_AUTO Ouvert MODC Ouvert Mode Normal Single Chip au démarrage ECS Fermé Ligne ECS.PK7 ECS à 1 au démarrage, valide la FLASH de l’HC12 (bit ROMON du registre MISC, voir plus loin). Cette ligne sert aussi à Emuler en RAM une portion de FLASH de l’HC12, et permet si on le souhaite en développement, de manipuler un code de taille plus importante. MEM_EN Fermé RAM externe validée 1.2.2. Démarrage A priori avec le processeur configuré en mode « Normal expanded wide » c’est à dire avec des composants extérieurs et un bus de donnée externe de 16 bits (l’HC12 est un peu un 16 bits rappelons le). Le mode « Normal Single Chip » est possible, on se prive alors des circuits RAM supplémentaires, mais en contre partie on récupère tous les ports qu’utilise le mode étendu. En mise au point : La carte démarre à la mise sous tension (ou bouton Reset), ainsi que lors de chaque prise en main par la sonde BDM, en mode Normal Single Chip. Le fichier de commande du BDM : CML12S-DP256.mac spécifie les initialisations successives à effectuer avant (et même après) le chargement du code, en vue du fonctionnement en mode étendu 16 bits : Normal Expanded Wide. Application finale : La carte démarre par câblage, en mode Normal Single Chip Des instructions en début de programme sont nécessaires pour reconfigurer le mode Normal Expanded Wide. On doit les placer : -Dans le cas général, dans le Boot du C (le C Startup), il faut alors modifier le C Startup fourni par le constructeur du compilateur. -Plus simplement en début du main() si on n’utilise pas de variables initialisées dans la RAM supplémentaire. Attention : ne pas confondre le fichier CML12S-DP256.mac qui configure ce processeur et la carte, avec le fichier de commande classique de l’édition de lien qui détermine le bon chargement des sections en mémoire, que l’on à nommé ici : CML12S-DP256.xcl 2005 Pour enseignant mise en œuvre carte hc12.doc 6 1.2.3. Options BDM nécessaire (Outils IAR) Validation de la programmation de l’EEPROM et de la FLASH. (Avec Bit ROMON = 1, registre MISC) Choix Sonde BDM (Avec Cristal fréquency 4MHz dans onglet P&E Micro) Choix du Microcontroleur Choix du Mode de travail Fichier.mac de configuration du téléchargement 1.2.4. Plan mémoire de la carte avec FLASH et RAM Comme la carte ne contient que 256k de RAM, les zones pages (00…1F) (20….2F) (30….3F) sont adresses images. On choisit la page 2F par exemple au départ. Page choisie au départ Interdit pages 00 RAM Externe 240k 1F 20 21 2E 2F 30 0F 10 Externe 00..0F 10…1F 20…2F adresses images 2005 Flash Interne Non accessible en Non paginé 3F FLASH Interne 256k Pour enseignant mise en œuvre carte hc12.doc 7 HC12 Mode étendu, compilation en mode Non Paginé Avec Flash et RAM Bit ROMON = 1 FFFF Vecteurs d’interruption Ram externe 16 pages de 16k : 256k FLASH 16k (et page 3F) 20 C000 BFFF 21 22 Accès Pages de 16k 2E 8000 7FFF 2F FLASH 16k (et page 3E) 4000 3FFF 1000 0FFF 0400 0000 Page initiale RAM Interne EEPROM 12k 4k Registres Valeur du registre MISC : 0 1 Stretch 1 Tck 0 1 $05 ROMON Si on travaille avec le compilateur en mode Non Paginé : • La RAM extérieure (Adresses de 8000 à BFFF, pages de 20 à 2F) n’est utilisable que pour des variables Non Initialisées, avec programmation de la page. • La page 2F est par exemple la page initiale. • On accède à la FLASH seulement aux adresses 4000 à 7FFF et C000 à FFFF (et non par leur pages respectives 3E et 3F !) • Tout le reste de la FLASH (14 pages de 30 à 3D) soit 224k est inutilisable. La carte permet aussi une « Emulation » de la FLASH de 16k (4000 à 7FFF) en mémoire RAM externe (page 3E). Ceci permet de développer tout en RAM de plus gros programmes. Nécessité pour cela d’avoir bit IVIS = 1 (de MODE) et option de debug sans FLASH (ROMON = 0). On n’exploitera pas cette possibilité. 2005 Pour enseignant mise en œuvre carte hc12.doc 1.3. 8 Choix des mémoires pour une compilation en mode NON PAGINE 1.3.1. Carte en développement Pour cette carte, et avec les outils IAR System, on pourrait charger le code en FLASH, le mode BDM permet tout de même la mise au point ! Mais travailler en permanence avec le code en FLASH allonge les phases de téléchargement, et diminue aussi théoriquement un peu la durée de vie de la FLASH. D’autre part, pour de nombreuses autres cartes et autres processeurs ou un développement classique avec Moniteur est nécessaire, on est obligé de tout charger en RAM (Code et Données), et de modifier ensuite l’implantation en vue de l’application définitive. Un développement tout en RAM est donc intéressant dans un but pédagogique. Nous travaillerons donc ici de la façon classique en développement : tout en RAM. 1) Le plus simple : RAM interne On dispose de 12k de RAM interne. On peut choisir le partage : 2/3 Code de 1000 à 2FFF soit 8k octets 1/3 Data de 3000 à 3FFF soit 4k octets 2) Autres possibilités : - FLASH « emulée en RAM » On disposerait de 16k de RAM dans la zone FLASH de 4000 à 7FFF. On choisit de travailler avec la première solution qui est plus pédagogique car moins spécifique à cette carte ! - Code directement en FLASH de 4000 à 7FFF Le compilateur IAR et le BDM permet le debug dans ce mode. Utile donc pour des applications plus importantes. Mais le temps de téléchargement est plus important. 1.3.2. Application définitive Code en FLASH interne 16k de 4000 à 7FFF Variables en RAM interne 12k de 1000 à 3FFF On devra modifier le fichier de configuration. 2005 Pour enseignant mise en œuvre carte hc12.doc 1.4. 9 Vecteurs d’interruption Les vecteurs d’interruptions étant en FLASH, sont reprogrammables, le BDM dispense de table supplémentaire de Jump (il faudra tout de même en connaître le principe pour travailler sur d’autres microcontroleurs …!). Le C programme de la même façon les vecteurs d’interruptions en Mise au point et pour l’Application finale : le vecteur contient l’adresse du programme d’interruption à lancer. Pour l’HC12, même si des niveaux de priorité existent, une interruption à priori n’est pas interruptible. Si on désire cette intéressante possibilité pour des contraintes de temps réel, on sait que l’on peut remettre à zéro le masque général (bit I) dans les programmes d’interruptions non prioritaire. Nous donnons ci-après la table complète des vecteurs. On ne s’occupe pas de l’indication HPRIO (qui permettrait de modifier éventuellement l’ordre de prise en compte des interruptions. Table 1 : Remarque : Les vecteurs interruptions « Enhanced Capture » sont les mêmes que les interruptions « Output Compare ». 2005 Pour enseignant mise en œuvre carte hc12.doc 10 Table 2 : Remarque : La table des vecteurs débute donc à l’adresse : $FF80 Pour noter un décalage par rapport au début de la table (Pour la notation IAR System des interruptions), plutôt qu’une valeur obtenue par une soustraction manuelle, il est plus simple de noter : Adresse_vecteur – Adresse_début_table. Exemple : pour l’interruption du Timer TOC0, on peut écrire : Interrupt[0x6E] void it_toc0(void) Pour éviter des erreurs et une meilleure lisibilité, il est plus commode d’écrire : Interrupt[0xFFEE – 0xFF80] void it_toc0(void) 2005 Pour enseignant mise en œuvre carte hc12.doc 1.5. 11 Exemple de fichier de configuration du téléchargement : CML12S-DP256.mac Note : ce fichier est très spécifique de l’HC12 et de IAR. Donc pas utile aux élèves. Seul le fichier de commande d’édition de lien est général à tous les compilateurs. Des sortes de macro-fonctions (dont le mnémonique est assez parlant) sont présentes dans ce fichier, et les renseignements sont fournis pour chaque mode de travail désiré (6 modes). Ce fichier contient tout d’abord des indications sur toutes les zones mémoire utilisées par le MC6812DP256 et la carte utilisée. On repère ensuite les initialisations à effectuer avant le téléchargement (lettres BD ; Before Down Load) et après (lettres AD : After Download). // Sont des commentaires. Certaines écritures sont faites deux fois (paramètre nrwrites = 2) pour interdire ensuite toutes modifications (Certains bits ne peuvent être programmes qu’une ou deux fois seulement après une mise sous tension). Lire en premier tout ce qui est en gras. Bien s’assurer au préalable au niveau des options du BDM (IAR Systems) du mode de travail désiré: ici Normal Expanded Wide, ainsi que du bon processeur. Comme on désire travailler en mode Normal Expanded Wide, les valeurs en gras soulignées seront celles qui nous concerneront. Les autres d’ailleurs n’ont pas été mises à jour pour ce processeur et peuvent donc être erronées. Fichier : CML12S-DP256.mac // This C-SPY setup macro file is adapted for all MC9S12 derivatives with // 256 kilobyte flash eeprom. // The C-SPY macro __initSequenceB6812() has the following syntax: // // __initSequenceB6812(nrWrites, verifyFlag, afterDownloadFlag, // addr, data0, data1, data2, data3, data4, data5) // nrWrites - The number of successive writes that should be done // for the particular memory access. // verifyFlag - Selects whether a register read-back verification // scheme should be performed after the write access. // afterDownloadFlag - Selects whether the specific register initialization // should be done before or after the code and data // download has taken place. // addr - The memory mapped address of the register to be // written. // data0-data5 - The initialization data to be written is controlled // by the chip mode selected. E.g. if normal expanded // wide mode is used, the data2 parameter is written to // the register, while all other data parameters are disregarded. // data0 - Normal single chip mode // data1 - Normal expanded narrow mode // data2 - Normal expanded wide mode // data3 - Special single chip mode // data4 - Special expanded narrow mode // data5 - Special expanded wide mode // When running the target system stand-alone (without C-SPY and its // BDM connection), remember to move some of the necessary register // initializations found in this file, into cstartup.s33, low_level_init() 2005 Pour enseignant mise en œuvre carte hc12.doc 12 // or a similar location. execUserPreload() { var NV, V, BD, AD; NV = 0; // No verify V = 1; // Verify BD = 0; // Before download AD = 1; // After download // ************************************************************************** // EEPROM, RAM and Flash memory map for each chip mode // ************************************************************************** __eepromStartB6812(0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400); __eepromEndB6812(0x0FF0, 0x0FF0, 0x0FF0, 0x0FF0, 0x0FF0, 0x0FF0); // RAM interne __progCodeStartB6812(0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000); __progCodeEndB6812(0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF, 0x3FFF); // les deux zones de FLASH accessible directement __flash16aStartB6812(0x4000, 0x0001, 0x4000, 0x0001, 0x0001, 0x4000); __flash16aEndB6812(0x7FFF, 0x0000, 0x7FFF, 0x0000, 0x0000, 0x7FFF); __flash16bStartB6812(0xC000, 0x0001, 0xC000, 0x0001, 0x0001, 0xC000); __flash16bEndB6812(0xFFFF, 0x0000, 0xFFFF, 0x0000, 0x0000, 0xFFFF); // Mémoire paginée __flash16BankedStartB6812(16, 4, 0x8000, 0x0001, 0x8000, 0x8000, 0x0001, 0x0001); __flash16BankedEndB6812(0xBFFF, 0x0000, 0xBFFF, 0xBFFF, 0x0000, 0x0000); // INITIALISATIONS AVANT CHARGEMENT // PEAR __initSequenceB6812(2, V, BD, 0x000A, 0x10, 0x0C, 0x0C, 0xB0, 0x0C, 0x0C); // MISC __initSequenceB6812(1, V, BD, 0x0013, 0x0D, 0x0D, 0x05, 0x0D, 0x0C, 0x0D); // PAGE __initSequenceB6812(1, V, BD, 0x0030, 0x00, 0x2F, 0x2F, 0x00, 0x00,0x2F); // page 2F pour la carte d'extension // RTICTL, Disable RTI and COP while in background mode. Ne pas se soucier pourquoi. __initSequenceB6812(1, V, BD, 0x003B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); // COPCTL, COP disabled in normal modes! Ne pas se soucier pourquoi. // The actual Normal mode reset value is 0x07/0x87. // CME disabled, but should follow the VDDPLL pin. __initSequenceB6812(1, V, BD, 0x003C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); // MODE Expanded Wide avec IVIS = 1 Une fois seulement pour modifier ensuite __initSequenceB6812(1, V, BD, 0x000B, 0x80, 0xA0, 0xEB, 0x00, 0x2B, 0x6B); // INITIALISATIONS APRES CHARGEMENT // MODE Expanded Wide avec IVIS = 0 __initSequenceB6812(1, V, BD, 0x000B, 0x80, 0xA0, 0xE3, 0x00, 0x2B, 0x6B); // A conserver sans trop se soucier pourquoi : // INITRG, Make sure this is consistent with your register base address // and the addresses of the following registers. __initSequenceB6812(1, V, AD, 0x0011, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); } 2005 Pour enseignant mise en œuvre carte hc12.doc 1.6. 13 Exemple de fichier d’édition de lien en développement : CML12S-DP256.XCL Tout en RAM Interne 2/3 Code de 1000 à 2FFF 1/3 Data de 3000 à 3FFF soit 8k octets soit 4k octets Ce fichier est classique (modèle Compilateur IAR) comme pour l’HC11. Fichier : CML12S-DP256.xcl //************************************************************************ //* This template file is adapted for: //* CPU: MC9S12DP256 //* Memory model: Large (Small w. modifications) //* Floating point arithmetic: Single precision (Double precision with modification) //************************************************************************ // Inform the linker about the CPU family used -c6812 //************************************************************************ // Remarques : -P au lieu de –Z permet au linker de couper de grosses sections en // plusieurs pour lui faciliter parfois la tache. //************************************************************************ // *** Sections de type CODE en RAM interne en développement ***** // 1000 à 2FFF pour le développement // 4000 à 7FFF application finale (Si nécessaire, développement possible également) -Z(CODE)CDATA0,CDATA1,CCSTR= 1000-2FFF -P(CODE)RCODE,CODE,CONST,CSTR,CHECKSUM=1000-2FFF //********* ************************************************************** // The interrrupt vectors are assumed to start at 0xFF80 //************** ******************************************************** -Z(CODE)INTVEC=FF80-FFFF // En flash // ****Sections de type DATA : toujours en RAM 256 octets de pile**** -Z(DATA)DATA1,IDATA1,UDATA1,ECSTR,WCSTR,TEMP,CSTACK+100=30003FFF // Non utilisé en page 0 sont les registres de l’HC11 ! -Z(DATA)DATA0,IDATA0,UDATA0=FFFFFFFF-FFFFFFFF //********************* ************************************************** // Select optimal printf/sprintf and scanf/sscanf formatters. // By selecting a smaller and more optimal formatter, the library size will be reduced considerably. //************************************************************************ // Three formatters are available for printf/sprintf // _formatted_write fully ANSI-C compliant // _medium_write lacks FP support // _small_write further reduced //************************************************** -e_small_write=_formatted_write //************************************************** // Two formatters are available for scanf/sscanf: 2005 Pour enseignant mise en œuvre carte hc12.doc //_formatted_read fully ANSI-C compliant // _medium_read lacks FP support //************************************************** -e_medium_read=_formatted_read //************************************************************************ // // // // Select the appropriate "C" library to use library memory model Floating point arithmetic cl6812 large or small single precision "doubles" cl6812d large or small double precision "doubles" cl6812 Nom du fichier librairie 2005 14 Pour enseignant mise en œuvre carte hc12.doc 2. 15 Les extensions nécessaires aux Travaux pratiques, et maquette complète de développement L’HC12 possédant de nombreux ports, les diverses extensions (Clavier, panneau cristaux liquides, moteur ….) sont câblées non plus directement sur le bus, mais comme on le fait beaucoup désormais sur les ports eux mêmes : séries (bus IIC), séries rapides (bus SPI) ou parallèles. Le tableau et schéma suivant résument les différents éléments, toutes entrées et sorties protégées. Eléments Moteur pas à pas et 4 leds Panneau Cristaux liquides, à contrôleur intégré. Circuit Double CNA 1 ou 2 Capteurs de température Clavier 16 touches Sur Port M (Bits PM7..PM4) Port H Bus IIC Bit PS2 du Port S Bus SPI0 avec circuit interface série rapide //, ligne d’interruption PJ1 pour touches C et D du clavier Potentiomètre et tension de 0 à 5v Entrée analogique AN0 Ligne d’entrée analogique (avec Entrée analogique AN1, Ze 10kΩ Ω interrupteur pour travail en 0..5V ou –2,5V... + 2,5V ) Entrée Trigger (pour échantillonnage) AN7 Diverses entrées et sorties sur le port T ou Entrées PT1, PT6, PT7 Timer et pulse Accumulateur. Sorties PT2, PT3, PT5 Une ligne d’interruption Bit PJ0 de PORTJ Ligne Sortie du Port P, ou Sortie PWM PP0/PWM0 (sans filtrage) Deux connecteurs supplémentaires (internes) Sur Port T et Port P. ATTENTION : pour F_BUS > 4MHZ Debug et même lancement par GO Impossibles !!!!! Il faut alors Télécharger par le Debug Lancer juste par le bouton Reset, si accessible sur les maquettes. 2005 Pour enseignant mise en œuvre carte hc12.doc 16 Connecteur supplémentaire PORT T Données PT2 Panneau Afficheurs LCD PT3 1 PP0/PWM0 Controle Interruption PT1 PT5 PJ0 PT6 PT7 2 CNA sur IIC Connecteur Port Série PORTP RS232 Clavier 16touches Sur port SPI0 Moteur pas à pas Et 4 Leds Int PJ1 Capteurs de température sur PS2 Trigger externe Entrée 0.. 5V ou –2.5 … + 2,5 AN7 Convertisseur ATD0 AN1 AN0 Potentiomètre 0....5V Commutateur Mode 0..5V ou -2,5..+2,5 Du fait de la présence de périphériques sur des ports du microcontrôleur, la carte utilise des driver et des routines d’initialisations pour les ports tels que SPI, bus IIC. Avec le même quartz de 4MHz, La fréquence F_BUS qui est par défaut de 2MHz, peut être modifiée comme suit : 4, 8, 16 ou 24MHz (Existence d’une PLL dans l’HC12). On pourra donc toujours laisser la fonction ini_carte() ; juste en début du main() On notera qu’elle n’est vraiment nécessaire que pour l’usage du clavier, du périphérique CNA, et si on désire modifier F_BUS. Si on ne met pas cette fonction, et si un message apparaît disant que F_BUS inconnu, placer alors #define F_BUS 2 2005 Pour enseignant mise en œuvre carte hc12.doc 3. 17 Port Integration Module 3.1. généralités Ce module interne à l’HC12 assure la liaison entre les différents composants internes et les broches du circuit. Dans ce module se situe entre autre tous les ports parallèles. Schéma général : Adresse de base : $240 On voit donc que chaque port servent à plusieurs fonctions différentes. En Mode étendu, PORTA PORTB PORTE et PORTK sont réservés à la gestion du Bus externe (Adresses, Données sur 8 ou 16 bits, sélection des pages, signaux de contrôle …). Ces ports seront donc inutilisables en entrées sorties classiques. Remarque : La partie convertisseur Analogique Numérique fait partie d’un autre module interne. Dés que l’on valide sur certaines lignes des fonctionnalités autres que le port parallèle de base, on inhibe alors automatiquement les entrées-sorties à usage générale correspondantes, et leurs registre de base deviennent sans objet. 3.2. Ports parallèles d’entrée-sortie (I/0) en usage général que l’on utilisera Sur Cette Maquette Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). 3.2.1. Port T : 8 bits I/O et Timer Chaque Bit se programme individuellement : PTT $240 2005 Port I/0 8 bits Pour enseignant mise en œuvre carte hc12.doc DDRT $242 18 Registre de Direction 0 1 Data Direction Register PERT $244 Bit en entrée Bit en sortie Validation de Résistances de Pull up ou Pull down (Pratique ! !) Pull Enable Register Type de Pull Si validé dans PERT: 0 Up 1 Down PPST $245 Pull Polarity Select Sur la maquette : Diverses lignes utilisables en entrée ou en sortie, gestion du Timer et du Pulse accu. Connecteur supplémentaire interne. 3.2.2. Port H : PTH DDRH PERH $260 $262 $264 8 bits I/0 et Interruptions Port I/0 8 bits Registre de Direction Validation de Résistances de Pull up ou Pull down Réservé sur la maquette au panneau cristaux liquides. Possibilités de lignes d’interruption non utilisables sur la maquette. 3.2.3. Port J : 2 bits I/0 et Interruptions + 2 bits IIC, interruptions,CAN4 PTJ $268 Port I/0 2 ou 4 bits CAN4 et IIC DDRJ $26A Data Direction Register PERJ $26C Pull Enable Register 2005 Registre de Direction 0 1 Bit en entrée Bit en sortie Validation de Résistances de Pull up ou Pull down (PRATIQUE ! !) Pour enseignant mise en œuvre carte hc12.doc Type de Pull et de Front d’interruption (Pull si validé) 0 pull Up Front ↓ Actif 1 pull Down front ↑ actif PPSJ $26D Port Polarity Select PIEJ $26E Port Interrupt Enable 0 inhibé 1 Validé Classique : logique positive Port Interrupt Enable PIFJ $26F Port Interrupt Flag Ecrire 1 pour Remettre à zéro le drapeau On se servira de : 19 PJ0, PJ1 : PJ1 : PJ7,PJ6 : 3.2.4. Port M : Port Interrupt Flag 0 inhibé 1 Validé (Classique, logique positive) Entrées binaires ou interruption interruption lignes L3 L4 clavier Bus IIC vers double CNA 8 bits I/0, bus CAN, bus BDLC Registres classiques : PTM $250 Port I/0 8 bits DDRM $252 Registre de Direction PERM $254 Validation de Résistances de Pull up ou Pull down PPSM $255 Si validé dans PERM, Type de pull (0 up, 1 down) On ne se servira que des bits PM7 à PM4 pour le moteur pas à pas. 3.2.5. Port S : 8 bits IO Port Série SCI0, Port série rapide SPI0 Registres identiques : PTS $248 Port I/0 8 bits DDRS $24A Registre de Direction PERS $24C Validation de Résistances de Pull up ou Pull down PPSS $24D Si validé dans PERS, Type de pull (0 up, 1 down) On ne se servira que du bit PS2 pour les capteurs de température. 3.2.6. Port P : 8 bits I/0, PWM,SPI Registres identiques : PTP $258 DDRP $25A PERP $25C PPSP $24D Port I/0 8 bits Registre de Direction Validation de Résistances de Pull up ou Pull down Si validé dans PERP, Type de pull (0 up, 1 down) Disponible sur connecteur supplémentaire interne Sinon on ne se servira que du bit PP0 en sortie binaire ou PWM0. 2005 Pour enseignant mise en œuvre carte hc12.doc 4. 20 Le Timer de l’HC12 Il contient une soixantaine de registres, on décrit ici le minimum ! Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). Nous ne décrivons ici que les fonctions de base. Il utilise le PORT T pour la gestion de lignes d’Input Capture (mesure de fréquences) ou Output Compare (En Générateur de signaux) PORT T PT7 PTO 8 lignes Input Capture Ou Ouput Compare Mode Standard de Raz Drapeau TSCR1 $46 0 0 Mode Wait 0 Le Timer tourne en mode Wait 1 Le Timer s’arrête en mode Wait Validation Timer TSCR2 $4D 0 Timer System Control Register 1 Prédiviseur OVE 0 0 0 N Validation Interruption Overflow TIOS $40 IO7 IO6 IO1 IO0 0 Travail en Input Capture 1 Travail en Output Compare Si on se sert des lignes, on doit sélectionner leur mode de travail au moyen des registres suivant : TCTL1 et 2 TCTL1 $48 OM7 OL7 OM4 OL4 TCTL2 $49 OM3 OL3 OM0 OL0 2005 Timer System Control Register 2 Prédiviseur Entre Eclock et TimerClock : Par 2N donc : 1,2,4,8,16,32,64,128 pour code 0,1,2,3,4,5,6,7 Timer Input Capture & Ouput Compare Selection Obligatoire pour valider le mode Output Compare, sinon Input Capture par défaut ! Timer Control Register 1 et 2 Pour lignes IOC7 --- IOC0 Si Output Compare : 00 non actives 01 IOCi Toggle 10 IOCi à 0 11 IOCi à 1 Pour enseignant mise en œuvre carte hc12.doc TCTL3 $4A TCTL4 $4B 21 EDG EDG 7B 7A EDG EDG 4B 4A EDG EDG 3B 3A EDG EDG 0B 0A Timer Control Register 3 et 4 Pour lignes IOC7 --- IOC0 Pour Input Capture 00 Inactif 01 front ↑ 10 front ↓ 11 front ↑et↓ TIE $4C Timer Interrupt Enable Validation Interruption lignes IOCi En Ouput Compare ou Input Capture TFLG1 $4E Timer Interrupt Flag 1 Mode Standard : Remise à zéro en écrivant 1 Drapeaux d’interruption lignes IOCi En Ouput Compare ou Input Capture TFLG2 $4F Timer Interrupt Flag 2 Mode Standard : Remise à zéro en écrivant 1 Drapeau d’interruption Overflow TCNT $44 Timer Counter Lecture Seule 0 à 65535 TC0...7 soit TCi $50+2i Timer Compare (N°0 à N°7) CFORC $41 f7 f6 f1 f0 Ecrire un bit à 1 force une action identique à celle de l’ Output Compare sur la ligne correspondante (si elle est dans ce mode). Utilisation : Si l’action Toggle est programmée, on peut lorsque l’évènement est survenu, provoquer par programmation de nouveau un Toggle, et ainsi générer des impulsions de fréquence = 1/Ttimer (Au lieu de 1/2Ttimer) 2005 Compare Force Register Pour enseignant mise en œuvre carte hc12.doc 5. 22 Les Port analogique de l’HC12 : ATD (Analogic to Digital) On ne parle pas de CAN (Convertisseur Analogique Numérique), car on peut confondre désormais avec les bus série : CAN ! Deux Convertisseur AN 8 ou 10 bits, de 8 voies, ATD0 et ATD1 Attention : l’entrée analogue n’est pas à haute impédance, résistance max de source conseillée : 1kΩ Fck bit : FATDCKmax = 2MHz et FATDCKmin = Fckbus/2 Tension d’entrée max : 5,2 V entre 0 et 5,2V Temps de conversion minimum sur 10 bits : Tconv10min = 7µs Mais si Fckbus = 2MHz (Fck par défaut) : FATDCKmax = Fckbus/2 = 1MHz et donc Fckbit = 1MHz et Tconv10min = 14µ µs Schéma de principe: Ce module possède diverses fonctions : trigger sur signal extérieur (échantillonnage), conversions multi canaux, registre tampon en sortie …. et 30 registres internes, et donc un assez grand nombre de bits actifs ! Nous n’étudions le convertisseur 8 voies ATD0, l’autre étant identique aux adresses de ses registres près. Il fonctionne en séquence se conversion : une séquence = 1 à 8 conversions. Fonction de transfert : Code= Vin .2N VrH −VrL 2005 Pour enseignant mise en œuvre carte hc12.doc 23 Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). Fast Flag Clear mieux à 1 Validation Trigger externe Entrée sur AN7 Validation ATD ATD0CTL2 $82 1 1 IE 0 Registre Controle 2 IF Drapeau d’interruption Action du Trigger possible externe : de fin de Séquence 00 front ↓ Validation d’interruption 01 front ↑ 10 niveau 0 et conversion en de fin de Séquence 11 niveau 1 en continu Mode normal non Fifo ATD0CTL3 $82 0 0 Registre Controle 3 De 1 à 8 : Nombre de conversions par séquence. 4 au Reset. Réglages des cadences de conversion bit (Voir ci_contre) ATD0CTL4 $84 Résolution : 0 10 bits 1 8 bits 2005 Prédiviseur Réglage de durée d’échantillonnage : 00 Vitesse max 11 Le plus précis mais plus lent Registre Controle 4 Prédiviseur pour Vitesse max: Fbus(MHz) Prédiviseur 2 0 4 0 8 1 12 2 16 3 20 4 24 5 Pour enseignant mise en œuvre carte hc12.doc 24 Types de séquence de conversion : 0 simple séquence 0 Séquence Mono canal, sur le canal N° K 1 continue 1 Séquence Multi canal, à partir du N°K ATD0CTL5 $85 Cadrage des 10 bits sur 16 bits : 0 Gauche 1 Droit N° de canal K de 0 à 7 Registre Controle 5 Une écriture dans ce registre démarre une séquence de conversion Type de code : 0 Non signé 1 Signé (Complément à 2) Attention : si cadrage droit, extension de signe non faite !! DONC EVITER LE CADRAGE DROIT EN SIGNE ! En mode Trigger : cadence trop rapide (Overrun) Remise à zéro : Ecriture de 1 ou nouvelle conversion ATD0STAT0 $86 Registre Status 0 0 En mode Continu : lecture donnée non faite à temps Remise à zéro : Ecriture de 1 Drapeau de Fin de Séquence de conversion Remise à zéro (en mode Fast Clear): Lecture donnée ATD0STAT1 $8… F7 F6 F0 Drapeau individuel de fin de conversion (utile seulement si séquence de plus de 1) ->Remise à zéro (en mode Fast Clear): Lecture donnée 2005 Registre Status 1 Pour enseignant mise en œuvre carte hc12.doc ATD0DRiH $90 + 2i ATD0DRiL $91 + 2i 25 16 Registres de Donnée 8 bits : Exemple port 2: Adresses : $94,$95 En mode 10 bits, On peut lire directement les 16 bits à Si l’on effectue qu’une seule l’adresse ATDDRiH. conversion, quel que soit le canal, la donnée se trouve en En mode 8 bits : ATD0RR0 Si cadrage gauche, on récupère l’octet dans ATDDRiH Si cadrage droit, on récupère l’octet dans ATDDRiL Différents codes obtenus : Utilisation du code signé : Pratique pour raisonner sur un signal (N bits cadrés à gauche et nombres pouvant être interprétés en Q15(16), de module < 1 ). Un circuit analogique à ampli opérationnel (décalage avec gain éventuel) permettant une excursion entre –Vmax et +Vmax doit être placé avant le convertisseur, celui ci n’acceptant que des tensions comprises entre VRL et VRH toutes deux positives. Attention en C, on peut très bien toujours définir (par les directives #define) des labels non signés, mais faire ensuite les cast corrects pour récupérer la donnée 8 ou 16 bits en signé ou non signé. 2005 Pour enseignant mise en œuvre carte hc12.doc 6. 26 Le port PWM L’HC12 possède 8 canaux possible PWM. Avec sortie sur les 8 bits du port P. On peut travailler en 8 canaux 8 bits ou 4 canaux 16 bits (ce dernier mode non étudié ici). Il contient une trentaine de registres, on décrit ici le minimum ! Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). PWME $A0 Validation de chaque canal PWM PWMPOL $A1 Polarité de chaque canal PWM : 0 signal à 0 en début de cycle 1 signal à 1 en début de cycle PWMPRCLK $A3 0 0 NA Prédiviseur A Pour canaux : 0145 NB Prédiviseur B Pour canaux : 2367 PWMCNTi $AC+i Lecture à tout instant Une écriture quelconque le met à 0 ! PWMPERi $B4+i PulseWideModulation Enable PulseWideModulation Polarity PulseWideModulation Prescale Clock F _ BUS Clock interne = 2N N = NA ou NB (prédiviseur de 1 à 128) PulseWideModulation Counter_i Utile pour re démarrer à zéro PulseWideModulation Periodi Second diviseur, et alors: Mi N = Na ou NB déterminait un prédiviseur identique pour chaque groupement de 4 canaux. Mi est un diviseur supplémentaire spécifique pour chaque canal i. 2005 FPwm _ i = F _ BUS M i .2 N Pour enseignant mise en œuvre carte hc12.doc PWMDTi $BC+i 27 PulseWideModulation Dutyi cycle Réglage du rapport cyclique: Première partie de cycle C’est l’entrée véritable du modulateur PWM réalisé. Et avec toujours : PWMDTi < PWMPERi ! Cas polarity 0 : 0 donne Th = 1 T Rapport cyclique = 100. Cas polarity 1 : PWMPERi − PWMDTYi PWMPERi 0 donne Th Rapport cyclique = 100. 2005 Début de cycle à 0 Th Duty cycle Début de cycle à 1 T =0 PWMDTYi PWMPERi Th Duty cycle Pour enseignant mise en œuvre carte hc12.doc 7. 28 Le port SCI : Sérial Communication Interface (RS232) Deux ports SCI0 et SCI1. Full Duplex (il peut émettre et recevoir en même temps) Systèmes de réveil du récepteur. Détection d’erreurs de trame Block Diagram : Nous n’étudions ici que le les bits assurant le fonctionnent de base, et le port SCI0. Le port SCI1 est identique à part les adresses de ses registres. Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). SCI0BD $C8,C9 BR (de 1 à 8191) 0 0 0 SCI0CR1 $CA Validation d’un bit de parité en MSB 0 Normal 0 1 2005 - - - Parité : paire (0) impaire (1) 1 start bit, 8 bits data, 1 stop bit 1 start bit, 9 bits data, 1 stop bit SCI Baud Rate byte H F _ BUS Baud _ rate= 16.BR SCI Control register 1 Pour enseignant mise en œuvre carte hc12.doc 29 SCI0CR2 $CB SCI Control register 2 - - - - Validation Validation Interruption Emetteur (pour registre Validation émission vide) Interruption Validation (pour registre Récepteur réception plein) SCI0SR1 $CC TDRE Registre émission vide - - - - - - SCI Status register 1 RDRF Registre de réception plein Pour remettre à zéro : Lecture de SCI0SR1 quand bit à 1 (inutile donc dans boucle d’attente de 1) suivi d’une écriture dans SCI0DRL pour TDRE ou d’une lecture de SCI0DRL pour RDRF SCI0DRL $CF Bit 7 2005 Bit 0 SCI Data Register Low La donnée classique 8 bits Pour enseignant mise en œuvre carte hc12.doc 8. 30 Le port SPI : Sérial Périphérique Interface Interface d’entrée sortie série rapide synchrone. Usage le plus courant : En maître, interface en entrée/sortie, ou unidirectionnel, avec des composants tels que CAN, CNA, interface SPIParallèle … possédant ce type de port. Trois à quatre fils de liaison sont suffisant, et on peut parfois câbler plusieurs périphériques sur un même port SPI. L’HC12 possède 3 ports de ce type : SPI0, SPI1, SPI2, d’adresse de base $D8, $F0, $F8 respectivement. Description minimale en mode maître, et pour un usage le plus simple. Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). 1 LSB en premier 0 MSB en premier Validation port SPI SPIxCTRL1 Base+0 1 SPIxSR Base+3 0 0 1 - 0 - - SPR 0 SPI Baud Rate: F _ bus ( SPPR + 1)2 ( SPR +1) Attention : max F_bus/4 0 Baud = SPI Baud Rate: SPIF 0 SPTEF SPIF interrupt flag Et Fin de sérialisation 2005 1 Polarité et phase de l’horloge (voir plus loin) SPPR SPIxBR Base+2 1 Sortie SS (Slave_Select) active 1 maître Validations interruption (non détaillé ici) SPIxCTRL2 Base+1 0 CPOL CPHA SPI Contrôle Register 1 - 0 0 SPI Transmit Empty Interrupt flag 0 0 F _ bus ( SPPR + 1)2 ( SPR +1) Attention : max F_bus/4 Baud = Pour enseignant mise en œuvre carte hc12.doc SPIxDR Base+5 31 SPI Data Register Format pour CPHA = 0 : Format pour CPHA = 1 : Pour certains périphériques, un premier Ck doit être présent avant la première donnée. 2005 Pour enseignant mise en œuvre carte hc12.doc 32 Exemple de programmation très simple, SPI1 en mode maître: // à 500kHz F_BUS 2MHz // à 1MHz F_BUS 4MHz // à 2MHz F_BUS >=8MHZ void init_spi1(void) // En maître, baud = voir ci-dessus { char c=0; if(F_BUS <= 8)c=1; // div par 4 if(F_BUS == 12)c=0x20; // div par 6 code 0 010 0 000 if(F_BUS == 16)c=2; // div 8 if(F_BUS == 24)c=0x21; // div par 12 code 0 010 0 001 SPI1CR1 = 0x52; // 0101 0010 spi1 validé, maitre, validation Sélection esclave SPI1CR2 = 0x10; // 0001 0000 normal SPI1BR = c; // Baud rate = Fbus/1 = 4/4 = 1MHz (pas plus car Baud <=Fbus/4) } Comme pour recevoir une donnée il faut emettre n’mporte quoi pour générer l’horloge (Mode Maître), il est souvent pratique de faire une seule fonction d’entrée sortie : char spi1_io(char octet) // en Maitre { static char c; // sinon l'optimisateur peut le supprimer ! c = SPI1SR; // obligatoire juste avant envoi, sinon envoi ignoré SPI1DR = octet; // envoi data while((SPI1SR & 0x80) ==0); // attente sérialisation c = SPI1DR ; // lecture et en même temps raz drapeau de fin de sérialisation } Autre exemple de programmation, le port SPI0 cablé sur la maquette Il est cablé sur un interface SPI parallèle et gère le clavier. Voir le chapitre correspondant. 2005 Pour enseignant mise en œuvre carte hc12.doc 9. 33 Le bus IIC Rappel protocole IBAD $E0 0 Interrupt Enable IBCR $E2 Ibus Enable Sélection Emission/Réception Sélection Maitre/Esclave Ibus Control Register - MS TxRx Ibus Address Register Adresse 7 bits, en tant qu’esclave 0 Accusé de réception 0 (normal) 1(pas d’accusé) Repeat Start Pour mode Slave : 0 Réception, le maître écrivant 1 Emission, le maître recevant IBSR $E3 Ok adressé en tant qu’esclave Raz par écriture dans IBCR TCF IAAS IBB IBAL Transfert en cours 0 SRW Ibif RxAK Perte d’arbitrage de bus Raz par écriture de 1 Bus occupé Evolue sur détection de signaux Start et Stop 0 Accusé reçu 1 Accusé non reçu Ibus Interrupt (et it si validé), pour : Perte d’arbitrage Fin de transfert d’octet (TCF à 1) Adréssé en tant qu’esclave Raz : écrire 1 2005 Ibus Status Register: Pour enseignant mise en œuvre carte hc12.doc 34 IBDR $E4 Ibus Data Register IBFD $E1 Ibus Frequency divider Pour programmer cadence et temps critiques. Data transfert Tck_SCL Il faut voir la doc technique complète pour comprendre, car assez complexe. On donne ici un exemple pour un circuit Esclave entièrement compatible IIC: un CNA MAX318, ayant pour caractéristiques : FSCL <= 400kHz, SCLhold_Start > 0,6µs, SDAhold > 0,3µs, SCLhold_Stop > 0,6µs. Le tableau suivant montre le code correct pour assurer la vitesse maximale possible sur ce circuit, en fonction de la fréquence du bus HC12. F_BUS (MHz) FckSCL SDA_hold SCL_hold Start SCL_hold Stop et Code (kHz) (µs) (µs) (µs) 2 $00 100 3,5 3 5,5 4 $00 200 1,75 1,5 2,75 8 $00 400 0,875 0,75 1,375 16 $40 400 0,875 0,75 1,375 20 $43 384,6 0,8 0,9 1,4 24 $45 400 0,75 0,92 1,33 2005 Pour enseignant mise en œuvre carte hc12.doc 35 10. La PLL Registres et bits utiles pour l’usage le plus simple. Remarque : Lors de la première initialisation des différents bits, on peut directement écrire 0 dans les bits non utilisés (soit c’est la valeur par défaut, soit écrire 0 est sans effet). CRG signifie « Clock and Reset Générator » SYNR $34 0 Synthetiser Register 0 SYNR REFDV $35 0 0 0 Reference Divider: 0 SYNR + 1 REFDV + 1 SYNR + 1 F _ Bus = FQuartz. REFDV + 1 F _ PLL = 2.FQuartz . REFDV CRGFLG $37 - - 0 - Lock - - - CRG Flag Bit Lock 1 indique le bon verrouillage de la boucle CLKSEL Pllsel $39 - - - - - - Clock Select Register Bit PLLSEL 1 indique que l’HC12 sera cadencé par F_PLL et non F_Quartz Au Reset, l’HC12 est toujours cadencé à F_quartz (4MHz dans notre cas) et donc F_bus = 2MHz. On peut ensuite programmer la PLL pour monter jusqu'à F_quartz = 48MHz max, et ainsi F_bus = 24MHz ! donc 12 fois plus rapide …. Attention : avec un quartz de 4MHz (cas de la carte utilisée), le debuggage avec la sonde BDM ne marche plus au delà de F_bus = 4MHz. Mais on peut tout de même exécuter un programme à la cadence maximale, en téléchargeant le code, puis en exécutant par Reset le Manuel sur la carte. Exemple de programmation simple : void init_Fbus(void) // Frequence du Bus, FQuartz = 4MHz // Possibles: 2(celle par defaut) 4 8 12 16 24 // Mais en Debug BDM, max 4MHZ // Prend F_BUS défini en ini_carte.h { #define Fquartz 4 // Frequence de référence: Freference = FQuartz ou FPLL // Fbus = Freference/2 2005 Pour enseignant mise en œuvre carte hc12.doc 36 // FPLL = 2*Fquartz * (SYNR + 1) / (REFDV + 1) // --> Fbus = Fquartz * (SYNR + 1) / (REFDV + 1) if (F_BUS != 2) { REFDV = 0; SYNR = (F_BUS/Fquartz) - 1; // 1: 8Mhz, 3: 16MHz 5: 24MHZ, mais en Debug pas plus de 4MHz, sinon Debug BDM ne marche pas while((CRGFLG & 0x08) == 0); // attente verouillage bit LOCK CLKSEL = 0x80; // PLL devient référence au lieu du Quartz } else { CLKSEL = 0x00; // Quartz redevient référence par défaut } } > RAPPEL : ATTENTION : pour F_BUS > 4MHZ Debug et même lancement par GO Impossibles !!!!! Il faut alors Télécharger par le Debug Lancer juste par le bouton Reset, si accessible sur les maquettes. 2005