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 SPIParallè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

Documents pareils