Microcontrôleur MC 68HC711D3 Motorola 07/11/2001  Patrick ABATI 
Liste des cours

 

 ARCHITECTURE INTERNE 


architecture

 

 RESET ET INTERRUPTIONS 

RST*(13) entrée - sortie de démarrage. Pilotée par un circuit du type MC34064.

Un Reset peut être dû à un niveau bas sur cette entrée (vecteur $FFFE-$FFFF), ou au Chien de garde (vecteur $FFFA-$FFFB), ou à un problème d'horloge (vecteur $FFFC-$FFFD).

IRQ*(14) entrée d'interruption masquable, active soit sur niveau bas, soit sur front descendant, mise directement à Vdd si non utilisée.

XRQ*(10) entrée d'interruption non masquable, mise directement à Vdd si non utilisée.

Il y a 18 vecteurs d'interruptions et 3 vecteurs de Reset:
$FFD6-$FFD7 ASCI
$FFD8-$FFD9 SSPI
$FFDA-$FFDB Front sur entrée du Pulse Accumulator
$FFDC-$FFDD Dépassement de capacité du P.A.
$FFDE-$FFDF Dépassement de capacité du Timer
$FFE0-$FFE1 Timer IC4/OC5
$FFE2-$FFE3 Timer OC4
$FFE4-$FFE5 Timer OC3
$FFE6-$FFE7 Timer OC2
$FFE8-$FFE9 Timer OC1
$FFEA-$FFEB Timer IC3
$FFEC-$FFED Timer IC2
$FFEE-$FFEF Timer IC1
$FFF0-$FFF1 Interruption périodique
$FFF2-$FFF3 IRQ (externe)
$FFF4-$FFF5 XIRQ (externe et non masquable)
$FFF6-$FFF7 Interruption programmée (SWI)
$FFF8-$FFF9 Code illicite
$FFFA-$FFFB Chien de garde (reset)
$FFFC-$FFFD Problème d'horloge (reset)
$FFFE-$FFFF Reset

        Lors d'une interruption, les registres mémorisés dans la pile sont: PC, IY, IX, ACCA, ACCB, CCR, soit 9 octets.

    Lorsqu'une interruption est en cours de traitement, les autres sont inhibées jusqu'à l'instruction RTI qui permet un retour au programme principal. D'autres interruptions peuvent alors être traitées, suivant leur degré de priorité (qui ne suit pas obligatoirement l'ordre chronologique : voir registre HPRIO $003C).

    La pile est généralement positionnée, lors de l'initialisation, sur l'adresse la plus haute de la RAM, soit $00FF.


 Exemple de programme de mise en oeuvre de l'interruption externe IRQ 

 Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* ESSAI D'UNE INTERRUPTION SUR IRQ(14).
* On visualise sur les leds le passage au programme d'interruption. A.P. octobre 1994
*
DDRC EQU $0007 Registre de direction de données
PORTC EQU $0003 Registre de sortie
OPTION EQU $0039 Registre des options
*
ORG $F000
* Initialisation:
Reset LDS #$00FF Initialisation pile
LDAA #$06
STAA $003F NOCOP+EPON
BSET OPTION $20 IRQE=1:front descendant sur IRQ
LDAA #$FF PC0 à PC7 en sorties
STAA <DDRC
CLR PORTC Raz sorties
CLI Lever le masque d'interruptions
* Programme principal:
BRA * Boucle sans fin simulant le prog.principal
* Programme d'interruption:
Inter COM PORTC Complémenter port C
RTI Retour au programme principal
* Vecteurs:
ORG $FFF2 Vecteur IRQ
FDB Inter
ORG $FFFE Vecteur Reset
FDB Reset
*
* Pour lancer le programme: [V], appuyer sur Reset, basculer en Run Only, relâcher Reset.
*
* Attention: l'interruption IRQ peut fonctionner, soit sur un front descendant, soit sur niveau
* bas. La configuration doit se faire dans OPTION, avant les 64 premiers cycles suivant un
* Reset.
*
END Fin du listing

***********************************************


 MODES DE FONCTIONNEMENT 

Le micro-contrôleur possède deux principaux modes de fonctionnement:
- microprocesseur (certains ports sont utilisés comme bus adresses, données, contrôle),
- micro-contrôleur (Normal Single Chip):
MODA(37) entrée à relier directement à Vss.
MODB(36) " " Vdd.


 HORLOGE 

XT(40) entrée horloge
EXT(39) sortie horloge
Ces bornes sont généralement reliées à un quartz 8 MHz ( + 2 condensateurs de 22pF et une résistance de 1MW ).
E(38) sortie horloge interne de fréquence f(quartz)/4


 ALIMENTATION 

Vdd(21) reliée au +5v
Vss(1) reliée au 0v


 ESPACE ADRESSABLE 

espace

 

 LES REGISTRES DE L'UNITE CENTRALE 

 REGISTRES 8 BITS 

ACCA Accumulator A
ACCB Accumulator B
CCR Condition Code Register (registre d'état)


 REGISTRE 16 BITS 

ACCD Double Accumulator ( ACCA + ACCB )
IX Index Register X (utilisation de l'adressage indexé)
IY Index Register Y (utilisation de l'adressage indexé)
SP Stack Pointer (gestion de la pile pour les sous-programmes et les programmes d'interruptions)
PC Program Counter (contient l'adresse de la prochaine instruction à exécuter).

 INSTRUCTIONS PARTICULIÈRES 

BSET mise à 1 d'un bit d'un registre
BCLR mise à 0 d'un bit d'un registre
Syntaxe: BSET(ou BCLR) Registre Bit
BRSET branchement si le bit est à 1
BRCLR branchement si le bit est à 0
Syntaxe: BRSET(ou BRCLR) Registre Bit Label


 MODES D'ADRESSAGES 

Immédiat
Étendu
Direct
Indexé (X ou Y)
Implicite
Relatif

Les entrées/sorties et la RAM se trouvant en page 0 (0000-00FF), il est conseillé d'utiliser le mode d'adressage direct (<) plutôt que le mode étendu (économie d'un octet par instruction).

Exemple: 
STAA <$90 code machine : 97 90 (direct)
STAA $90 code machine: B7 00 90 (étendu)
Stocker le contenu de ACCA à l'adresse RAM $0090.


 LES INSTRUCTIONS 

 Chargements, Sauvegardes et Transferts 
Mise à zéro d'un registre mémoire : CLR ou d'un accumulateur CLRA, CLRB.
Chargement : LDAA, LDAB, LDD, LDX, LDY, LDS.
Sauvegarde : STAA, STAB, STD, STX, STY, STS.
Mise d'octet(s) dans la pile : PSHA, PSHB, PSHX, PSHY.
Sortie d'octet(s) de la pile : PULA, PULB, PULX, PULY.
Transfert : TAB, TBA, TAP, TPA, TSX, TSY, TXS, TYS.
Echange : XGDX, XGDY.


 Opérations arithmétiques 
Addition : ABA, ABX, ABY, ADDA, ADDB, ADDD, ADCA, ADCB.
Comparaison : CBA, CMPA, CMPB, CPD, CPX, CPY, TST, TSTA, TSTB.
Incrémentation : INC, INCA, INCB, INX, INY, INS.
Décrémentation : DEC, DECA, DECB, DEX, DEY, DES.
Soustraction : SUBA, SUBB, SUBD, SBCA, SBCB.
Complément à deux : NEG, NEGA, NEGB.
Multiplication : MUL.
Division : FDIV, IDIV.
Ajustement décimal : DAA.


 Décalages et rotations 
Décalage vers la gauche : ASL, ASLA, ASLB, ASLD, LSL, LSLA, LSLB, LSLD.
Décalage vers la droite : ASR, ASRA, ASRB, LSR, LSRA, LSRB, LSRD.
Rotation vers la gauche : ROL, ROLA, ROLB.
Rotation vers la droite : ROR, RORA, RORB.


 Opérations logiques 
Et logique : ANDA, ANDB, BITA, BITB.
Ou logique : ORAA, ORAB, Ou exclusif : EORA, EORB.
Complémentation : COM, COMA, COMB.
Mise à un (ou à zéro) d'un bit : BSET, BCLR, SEC, CLC, SEI, CLI, SEV, CLV.


 Branchements et sauts 
Suivant l'état du bit : BRSET, BRCLR, BCS, BCC, BVS, BVC, BEQ, BNE, BMI, BPL.
Signés : BGE, BGT, BLE, BLT.
Non signés : BHI, BHS, BLO, BLS.
Inconditionnels : BRA, BRN, JMP, BSR, JSR, RTS, RTI.


 Divers 
SWI, WAI, NOP, STOP, TEST.


 LES PORTS D'ENTREES-SORTIES DU MC68HC711D3 

 PORT A 
Double fonction: entrées-sorties classiques ou entrées-sorties Timer.
PA0(27) entrée logique ou entrée de capture (IC3)
PA1(26) " " (IC2)
PA2(25) " " (IC1)
Il est préférable de relier les entrées PA0, PA1, PA2 à Vdd ou à Vss dans le cas où elles ne sont pas utilisées.
PA5(23) sortie logique ou comparaison (OC3)
PA3(24) entrée ou sortie logique ou sortie comparaison (OC5) ou entrée de capture (IC4)
PA7(22) entrée ou sortie logique ou entrée accumulateur d'impulsions (PAI) ou sortie comparaison (OC1)
Il est recommandé de programmer PA3 et PA7 en sorties dans le cas où ces bornes ne sont pas utilisées.

 REGISTRES RELATIFS AU PORT A 
PORTA Port A Data ($0000)
PACTL ($0026) Direction de donnée PA7 et PA3
+ Registres du Timer.


 PORT B 
PB0(35) entrée ou sortie logique
PB1(34) entrée ou sortie logique
PB2(33) entrée ou sortie logique
PB3(32) entrée ou sortie logique
PB4(31) entrée ou sortie logique
PB5(30) entrée ou sortie logique
PB6(29) entrée ou sortie logique
PB7(28) entrée ou sortie logique
Il est recommandé de programmer en sorties les bornes non utilisées du Port B.

 REGISTRES RELATIFS AU PORT B 
PORTB Port B Data ($0004)
DDRB Data Direction Register for Port B ($0006)


 PORT C 
PC0(2) entrée ou sortie logique
PC1(3) entrée ou sortie logique
PC2(4) entrée ou sortie logique
PC3(5) entrée ou sortie logique
PC4(6) entrée ou sortie logique
PC5(7) entrée ou sortie logique
PC6(8) entrée ou sortie logique
PC7(9) entrée ou sortie logique
Il est recommandé de programmer en sorties les bornes non utilisées du Port C.

 REGISTRES RELATIFS AU PORT C 
PORTC Port C Data ($0003)
DDRC Data Direction Register for Port C ($0007)
PIOC Parallel I/O Control ($0002) (Bit CWOM: sorties CMOS ou Drain ouvert).


 PORT D 
Certaines bornes sont réservées aux communications série synchrone et asynchrone.
PD0(15) entrée ou sortie logique ou entrée RxD du ASCI
PD1(16) entrée ou sortie logique ou sortie TxD du ASCI
ASCI: Asynchronous Serial Communications Interface
PD2(17) entrée ou sortie logique ou entrée/sortie MISO du SSPI
PD3(18) entrée ou sortie logique ou entrée/sortie MOSI du SSPI
PD4(19) entrée ou sortie logique ou entrée/sortie SCK du SSPI
PD5(20) entrée ou sortie logique ou entrée/sortie SS* du SSPI
SSPI: Synchronous Serial Peripheral Interface
PD6(12) entrée ou sortie logique
PD7(11) entrée ou sortie logique
Il est recommandé de programmer en sorties les bornes non utilisées du Port D

 REGISTRES RELATIFS AU PORT D 
PORTD Port D Data ($0008)
DDRD Data Direction Register for Port D( $0009)
+ registres du SSPI et du ASCI.


 ASCI Asynchronous Serial Communications Interface 
C'est un circuit de liaison série asynchrone, qui fonctionne en full-duplex (transmission et réception pouvant être simultanées). Le format des mots est: 1 start, 8 ou 9 bits, 1 stop. Les fréquences de transmission et réception sont les mêmes, programmables dans une large plage et élaborées à partir de l'horloge interne E. L'utilisation du circuit interface MAX 232, permet une connexion simple du type RS232.

Bornes spécifiques: RD(15): Receive Data et TD(16): Transmit Data

Registres:
BAUD ($002B) vitesse de la liaison ($30: 9600 bauds)
SCCR1($002C) format du mot ($0: 8 bits)
SCCR2($002D) contrôle (autorisation, interruptions...)
SCSR ($002E) état (registre de transmission vide...)
SCDR ($002F) données (transmission et réception)

acsi

Lorsqu'un mot est reçu, l'indicateur RDRF (registre de réception plein) du registre d'état SCSR passe à 1. Une lecture du registre SCSR, suivie d'une lecture du SCDR permet de "récupérer" le mot, tout en mettant l'indicateur RDRF à zéro.

Lorqu'un mot à été transmis, l'indicateur TDRE (registre de transmission vide) du SCSR passe à 1. Une lecture du SCSR, suivie d'une écriture dans le SCDR (pour une nouvelle transmission) repositionne l'indicateur TDRE à zéro.

Le test d'un indicateur peut se faire de la façon suivante:
BRCLR SCSR TDRE Label
ce qui signifie : brancher à Label si le bit TDRE du registre SCSR est à zéro.

L'écriture ou la lecture du registre SCDR se fait de façon classique:
LDAA #Donnée
STAA <SCDR
ce qui signifie : charger l'accumulateur A (en immédiat) avec la valeur Donnée, puis sauver son contenu (en direct) dans le registre de transmission SCDR.

Il y a 5 sources possibles d'interruptions. Les plus utilisées sont:
l'interruption de transmission (TIE),lorsque le registre de transmission est vide,
l'interruption de réception (RIE),( lorsque le registre de réception est plein,
Toutes les interruptions renvoient à un seul vecteur $FFD6-$FFD7, ce qui peut contraindre à devoir identifier la source de l'interruption par tests successifs des différents indicateurs du registre d'état.


 EXEMPLE DE PROGRAMME DE MISE EN OEUVRE DE L'A.S.C.I. 

Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Essai du SCI du 68HC711.
* La sortie transmission TD(16) est reliée à l'entrée réception RD(15). L'octet reçu sur RD est
* donc retransmis sur TD.On visualise sur un oscilloscope un signal carré d'amplitude 5v, de
* rapport cyclique 1/2(code transmis $55),de fréquence 9600/2 = 4800 Hz.
*
BAUD EQU $2B Registre vitesse
SCCR1 EQU $2C Registre format
SCCR2 EQU $2D Registre validation
SCSR EQU $2E Registre état
SCDR EQU $2F Registre données
TDRE EQU $80 Bit TDRE=1 si Registre de transmission vide
RDRF EQU $20 Bit RDRF=1 si Registre de réception plein
*
ORG $F000
*
Reset LDS #$00FF Initialisation Pile
LDAA #$06
STAA <$3F NOCOP+EPON
LDAA #%00110000 Vitesse de transmission:9600 bauds
STAA <BAUD
* Le registre SCCR1 est mis à zéro à la suite d'un Reset
* Le format du mot est donc: Start + 8 données + Stop
LDAA #%00001100 Transmission-réception autorisée
STAA <SCCR2
LDAA #%01010101 Start(0) 1 0 1 0 1 0 1 0 Stop(1)
Trans BRCLR SCSR TDRE Recep Registre de transmission vide?
STAA <SCDR
Recep BRCLR SCSR RDRF Trans Registre de réception plein?
LDAA <SCDR
BRA Trans
*
ORG $FFFE
FDB Reset Vecteur de reset
*
* Essai sur émulateur: [V] [D] [O] [R] [R]
*
END Fin du listing
***********************************************


 SSPI Synchronous Serial Peripheral Interface 

C'est une liaison série synchrone rapide (1Mbit/s) qui permet des connexions d'une grande simplicité matérielle sur des composants pourvus de ce type de bus.
Principe: un composant "maître" génère une horloge vers un composant "esclave" de façon à lui envoyer des données de type série par l'intermédiaire de sa sortie de transmission, ou à récupérer des données en provenance de l'esclave au niveau de son entrée de réception. Un maître peut gérer plusieurs esclaves: il doit donc sélectionner au préalable le composant qui doit partager le bus avec lui.

Bornes spécifiques:
MISO(17): Master In Slave Out, entrée de réception en mode maître
MOSI(18): Master Out Slave In, sortie de transmission en mode maître
SCK(19): Serial Clock, sortie horloge en mode maître
SS*(20): Slave Select, entrée de sélection en mode esclave.

Le 68HC11 peut être utilisé en mode maître ou en mode esclave. Dans le cas d'une configuration en mode maître, avec un seul esclave, il est préférable d'utiliser la borne SS*. Cette borne ne doit pas être utilisée dans le cas où plusieurs esclaves sont à commander : des ports "classiques" sont préférables , la borne SS* étant néanmoins programmée en sortie.

Registres:
DDRD($0009): Data Direction control Register port D
SPCR ($0028): Serial Peripheral Control Register
SPSR ($0029): Serial Peripheral Status Register
SPDR ($002A): Serial Peripheral Data

sspi

SPR1
SPR0
Fréquence avec E = 2 MHz
0
0
1 MHz
0
1
500 KHz
1
0
125 KHz
1
1
62,5 KHz

La mise en oeuvre au niveau logiciel est relativement complexe, souvent du fait que le "protocole" du circuit esclave est souvent "lourd": configurer les entrées-sorties, définir le mode maître, choisir la fréquence d'horloge, choisir le front actif d'horloge (CPOL,CPHA), sélectionner ou désélectionner l'esclave, tester la fin d'un transfert (SPIF)...

L'horloge n'est active que lors d'une écriture: lorsque le micro-contrôleur veut recevoir un octet en provenance de l'esclave, il doit effectuer une fausse écriture dans le SPDR (envoi d'un octet quelconque), attendre la fin du transfert (test de SPIF), récupérer l'octet transmis par l'esclave dans le SPDR.


 Premier exemple de programme de mise en oeuvre du S.S.P.I. 

 Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Essai du CNA MAX538(Convertisseur Numérique-analogique 12 bits) sur bus SPI.
* 68HC711D3 MAX538
* PD3(MOSI) - DIN
* PD4(SCK) - SCLK
* PD7 - CS
* PD2(MISO) et DOUT non connectés
*
* Le programme permet de générer une "dent de scie" 0-2,5v sur la sortie Vout du MAX538.
*
PORTD EQU $0008
DDRD EQU $0009
SPCR EQU $0028 Control
SPSR EQU $0029 Status
SPDR EQU $002A Data
SPIF EQU $80 Transfer Complete Flaf
*
ORG $F000
*
RESET LDAA #%10011000 Préparer état des sorties
STAA <PORTD PD6(EEPROM)=0,PD7=1,SCK=1, MOSI=1
LDAA #%11111000 PD6(EEPROM),PD7,SCK et MOSI en sortie
STAA <DDRD
LDAA #%01010000 Interruptions inhibées, système SPI on,
STAA <SPCR Master, CPOL=0,CPHA=0, E -:- 2 (1MHz)
RAZ LDD #$0000
DEBUT BCLR PORTD $80 Sélection du CNA : PD7=0
STAA <SPDR Envoi premier octet
BRCLR SPSR SPIF * Transfert terminé?
STAB <SPDR Envoi second octet
BRCLR SPSR SPIF * Transfert terminé?
BSET PORTD $80 Désélection du CNA : PD7=1
ADDA #1 Rampe sur 4 bits forts
* Remplacer ADDA par ADDD pour rampe sur 12 bits
CPD #$1000 Maximum CNA +1
BNE DEBUT
BRA RAZ
*
ORG $FFFE
FDB RESET
*
END Fin du Listing
***********************************************
 
 Deuxième exemple de programme de mise en oeuvre du S.S.P.I. 

Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Gestion d'une EEPROM sur bus SPI
*
* Eeprom: NMC93C56
* 1 - CS - PD6 du microcontrôleur
* 2 - SK - SCK
* 3 - DI - MOSI
* 4 - DO - MISO
* 5 - GND
* 6 - NC
* 7 - NC
* 8 - VCC
*
* Ce programme permet l'essai d'une Eeprom:
* - écriture dans l'Eeprom à l'adresse définie dans ADRESS($0080) des 16 bits contenus dans *DATA1($0081) et DATA2($0082)
* - temporisation pour permettre la programmation (10ms)
* - lecture de l'Eeprom et sauvegarde des 16 bits dans RAM1($0083) et RAM2($0084).
* On vérifiera que RAM1 et RAM2 ont les mêmes contenus que
* DATA1 et DATA2.
*
PORTD EQU $0008
DDRD EQU $0009
SPCR EQU $0028
CONFIG EQU $003F
SPDR EQU $002A
SPSR EQU $0029
ADRESS EQU $0080
DATA1 EQU $0081
DATA2 EQU $0082
RAM1 EQU $0083
RAM2 EQU $0084
*
ORG $F000
RESET LDAA #$06 NOCOP+EPON
STAA <CONFIG
LDS #$00FF Initialisation Pile
CLR RAM1 RAZ RAM1
CLR RAM2 RAZ RAM2
LDX #$ABCD Données Eeprom (valeur quelconque)
STX <DATA1 16 bits stockés dans DATA1 et DATA2
LDAA #$05 Adresse Eeprom (valeur quelconque)
STAA <ADRESS
LDAA #%10001000 Préparer état des sorties
STAA <PORTD PD6=0, SCK=0, MOSI=1
LDAA #%11111000 PD6,SCK et MOSI en sortie
STAA <DDRD
* Sortie PD7=1 pour inhiber le CNA . PD5 ,bien qu'inutilisée, doit être programmée en sortie
JSR WRITE
JSR READ
SWI Interruption programmée
WRITE LDAA #%01010000 Interruptions inhibées,système SPIon,
STAA <SPCR Master,CPOL=0,CPHA=0,E -:- 2
BSET PORTD $40 Sélection Eeprom : PD6=1
LDAA #$04 Code EWEN = $04FF (Autorisation d'écriture)
STAA <SPDR
BRCLR SPSR $80 * Transfert terminé?
LDAA #$FF Suite code EWEN
STAA <SPDR
BRCLR SPSR $80 * Transfert terminé?
BCLR PORTD $40 Désélection Eeprom : PD6=0
BSET PORTD $40 Sélection Eeprom : PD6=1
LDAA #$05 Code écriture = $05
STAA <SPDR Envoi octet code écriture
BRCLR SPSR $80 * Transfert terminé?
LDAA <ADRESS Charge adresse Eeprom
STAA <SPDR Envoi octet adresse
BRCLR SPSR $80 * Transfert terminé?
LDAA <DATA1 Charge donnée DATA1
STAA <SPDR Envoi octet donnée
BRCLR SPSR $80 * Transfert terminé?
LDAA <DATA2 Charge donnée DATA2
STAA <SPDR Envoi octet donnée
BRCLR SPSR $80 * Transfert terminé?
BCLR PORTD $40 Désélection Eeprom : PD6=0
LDX #5000 Temporisation 10ms pour programmation
TEMPO DEX (DEX+BNE=6 cycles à 0,5us soit 3us)
BNE TEMPO
BSET PORTD $40 Sélection Eeprom : PD6=1
LDAA #$04 Code EWDS = $0400 (Interdiction d'écriture)
STAA <SPDR
BRCLR SPSR $80 * Transfert terminé?
LDAA #$00 Suite code EWDS
STAA <SPDR
BRCLR SPSR $80 * Transfert terminé?
BCLR PORTD $40 Désélection Eeprom : PD6=0
RTS
READ LDAA #%01010000 CPOL=0,CPHA=0
STAA <SPCR
BSET PORTD $40 Sélection Eeprom : PD6=1
LDAA #$06 Code lecture = $06
STAA <SPDR Envoi octet code lecture
BRCLR SPSR $80 * Transfert terminé?
LDAB <ADRESS Charge adresse Eeprom
STAB <SPDR Envoi octet adresse
BRCLR SPSR $80 * Transfert terminé?
LDAA #%01010100 CPOL=0,CPHA=1
STAA <SPCR
STAA <SPDR Fausse écriture pour réponse
BRCLR SPSR $80 * Transfert terminé?
LDAA <SPDR Réception premier octet donnée
STAB <SPDR Fausse écriture pour réponse
BRCLR SPSR $80 * Transfert terminé?
LDAB <SPDR Réception second octet donnée
STAA <RAM1 Sauvegarde dans RAM1 et RAM2
STAB <RAM2
BCLR PORTD $40 Désélection Eeprom : PD6=0
RTS
*
ORG $FFFE
FDB RESET
END Fin du Listing
***********************************************

 
 ACCUMULATEUR D'IMPULSIONS (PULSE ACCUMULATOR) 

C'est un compteur 8 bits, qui peut être utilisé pour comptabiliser des impulsions externes (event counting mode) ou mesurer la durée d'un signal (gated time accumulation mode) à partir de l'horloge E:64.

pulse

Borne spécifique: PAI(22)

Registres:
TMSK2 ($0024): Masquage des interruptions (PAOVI, PAII)
TFLG2 ($0025): Indicateurs (PAOVF,PAIF)
PACTL ($0026): Contrôle (autorisation, mode, front actif)
PACNT ($0027): Compteur 8 bits à lecture et écriture

registres

 L'accumulateur d'impulsions peut générer 2 interruptions:
- front sur l'entrée PAI (vecteur $FFDA-$FFDB)
- dépassement de capacité (vecteur $FFDC-$FFDD)

 Dans le cas d'une utilisation en décompteur (avoir une information au bout de n impulsions), la technique de programmation est la suivante:
- charger le PACNT avec $FF-n
- tester l'indicateur de dépassement de capacité PAOVF ou utiliser l'interruption de dépassement de capacité.

La borne PAI peut aussi être utilisée:
- en tant qu'entrée fonctionnant sur front montant ou descendant ( par test de l'indicateur PAIF mis à 1 sur le front actif),
- en tant qu'entrée d'interruption externe, de la même façon que la borne IRQ*, mais avec l'avantage de fonctionner au choix sur front montant ou descendant ( IRQ* ne peut être configurée que sur front descendant).

L'effacement des indicateurs PAOVF et PAIF se fait par écriture d'un 1 logique au niveau de leur emplacement dans le TFLG2.


 EXEMPLE DE PROGRAMME DE MISE EN OEUVRE DU P.A. 

Avec Emulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Essai du TIMER (pulse accumulator). A.P. octobre 1994.
* Fronts à comptabiliser sur borne PA7(22). L'afficheur s'incrémente toute les 10 impulsions
* sur PA7.
* Equivalences globales:
PACTL EQU $0026 Registre de contrôle du pulse accumulator
TFLG2 EQU $0025 Registre d'indicateur d'interruption
TMSK2 EQU $0024 Registre de masquage des interruptions
PACTN EQU $0027 Compteur du pulse accumulator
PORTC EQU $0003
DDRC EQU $0007
INDEX EQU $0040 Mémoire temporaire
ORG $F000
* Initialisation
Reset SEI Masquer les interruptions
LDAA #%01000000 Pulse accumulator autorisé PAEN=1
* PA7 en entrée DDRA7=0 (PAI). Incrémentation sur front descendant PADMOD=0 et PEDGE=0
STAA <PACTL
LDAA #%00100000 Interruption autorisées (PAOVI=1)
STAA <TMSK2
LDAA #10 Dix fronts descendants à détecter
NEGA Complément à 2
STAA <PACTN
LDAA #$FF
STAA <DDRC Port PC0 en sortie
* Programme principal
CLR PORTC
LDX #TABLE Valeur première donnée (chiffre"0").
STX <INDEX
CLI Lever le masque d'interruptions
BRA * Boucle sans fin
* Le compteur est donc chargé avec $F6 (complément à 2 de 10). Lorsqu'il reçoit la dixième
* impulsion, il passe de $FF à $0 et une interruption par overflow est générée.
* Programme d'interruption
Inter LDAA #$F0 Raz de l'indicateur PAOVF par mise
STAA <TFLG2 à 1 du bit correspondant
LDAA #10 Nouveau chargement du compteur
NEGA
STAA <PACTN
LDX <INDEX
LDAB <0,X
STAB <PORTC Donnée sur Port C.
INX Donnée suivante.
STX <INDEX
CPX #TABLE+10 Fin de table de données?
BNE Fin
LDX #TABLE Valeur première donnée (chiffre"0").
STX INDEX
Fin RTI
* Table de conversion Port C - Afficheur ("0"=$7E,"1"=$30...).
TABLE FCB $7E $30 $6D $79 $33 $5B $5F $70 $7F $7B
*Vecteurs ORG $FFDC Vecteur d'interruption
FDB Inter Pulse Accumulator Overflow
ORG $FFFE Vecteur de démarrage
FDB Reset
* Mode opératoire : [V],[D],^I,[O],[I],[C],[U],[O],[R],[H]
END Fin du listing.
***********************************************

 
 TIMER PRINCIPAL 

Le système de Timer est basé sur un compteur perpétuel 16 bits associé à un pré-diviseur 4 étages (division de l'horloge E par 1,4,8 ou 64).

 
 Concept "sortie comparaison" 

3 sorties spécifiques (output-compare): OC1(22), OC3(23), OC5(24).

Registres:
- TOC1 ($0016-$0017): Timer output compare 1
- TOC2 ($0018-$0019): " 2
- TOC3 ($001A-$001B): " 3
- TOC4 ($001C-$001D): " 4
- TI4O5 ($001E-$001F): " 5
- TCNT ($000E-$000F): Compteur (à lecture seulement)
- TMSK1 ($0022) : Masquage des interruptions
- TFLG1 ($0023) : Indicateurs d'interruptions
- CFORC ($000B) : Forçage des sorties
- OC1M ($000C) : Masquage sortie (autorisation)
- OC1D ($000D) :
- TCTL1 ($0020) : Contrôle sortie (mise à 1, basculement...) 

Lorsque la valeur du compteur TCNT est égale à celle du registre de comparaison (TOC3...), la sortie correspondante prend l'état programmé dans le TCTL1. L'indicateur d'interruption passe à 1 et une interruption peut être générée.

interruption

Algorithme de programmation:
- lire le contenu du compteur TCNT,
- ajouter le nombre de cycles correspondants à la temporisation,
- sauver dans le registre de comparaison,
- attendre l'interruption ou tester l'indicateur,
- effacer l'indicateur (par écriture d'un 1 sur le bit correspondant).


 Exemple de programme d'utilisation de la sortie comparaison du Timer 

Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Astable sur sortie PA5(23)-OC3.Comptage sur afficheur toutes les secondes.
TCNT EQU $E Compteur (fonctionnement permanent)
TMSK1 EQU $22 Bit 5: masquage OC3
TMSK2 EQU $24 Prescaler
TFLG1 EQU $23 Bit 5: indicateur OC3
TOC3 EQU $1A Valeur à comparer à celle du Compteur
TCTL1 EQU $20 Bits 5 et 4 : Mode de fonctionnement de OC3
CONFIG EQU $3F Watchdog et Eprom
PORTC EQU $3
DDRC EQU $7
INDEX EQU $40 Mémoire temporaire
TEMPO EQU $42 Mémoire valeur de demi-période
ORG $F000 Début du programme
RESET LDS #$00FF Initialisation Pile
LDAA #$06
STAA <CONFIG Nocop+Epon
LDAA #$03
STAA <TMSK2 PR0=0 et PR1=0 (horloge 8us)
LDAA #$10
STAA <TCTL1 OM3=0 et OL3=1:Toggle Output
LDAA #$20
STAA <TMSK1 Interruptions autorisées sur OC3
LDD #62500 62500x8us=0,5s
STD <TEMPO
LDD <TEMPO Valeur Période
ADDD <TCNT Ajoute contenu compteur
STD <TOC3 Résultat dans TOC3
LDAA #$FF
STAA <DDRC Port C en sortie.
CLI Démasquer les interruptions
TIME CLR PORTC
LDX #TABLE Valeur première donnée (chiffre"0").
STX <INDEX
CLI Lever le masque d'interruptions
BRA * Boucle sans fin.
TIMER BSET TFLG1 $20 Raz indicateur d'interruption OC3
LDD <TEMPO Valeur Période
ADDD <TCNT Ajoute contenu compteur
STD <TOC3 Résultat dans TOC3
LDX <INDEX
LDAB <0,X
STAB <PORTC Donnée sur Port C.
INX Donnée suivante.
STX <INDEX
CPX #TABLE+20 Fin de table de données?
BNE FIN
LDX #TABLE Valeur première donnée (chiffre"0").
STX INDEX
FIN RTI
TABLE FCB $7E $7E $30 $30 $6D $6D $79 $79 $33 $33
FCB $5B $5B $5F $5F $70 $70 $7F $7F $7B $7B
ORG $FFE4
FDB TIMER Interruption Timer TOC3
ORG $FFFE
FDB RESET Reset
* Pour lancer le programmme avec l'émulateur: [V] appuyer sur Reset, basculer en Run Only,
* relâcher Reset. La modification du Prescaler doit être effectuée avant 64 cycles d'horloge
* suivant le Reset.
END Fin du listing
***********************************************

 
 Concept "entrée de capture" 

4 entrées spécifiques (input-capture) : IC1(25), IC2(26), IC3(27), IC4(24).

Registres:
- TIC1 ($0010-$0011) : Timer input capture 1
- TIC2 ($0012-$0013) : " 2
- TIC3 ($0014-$0015) : " 3
- TI4O5 ($001E-$001F): " 4
- TCNT ($000E-$000F): Compteur (à lecture seulement)
- TCTL2 ($0021) : Registre contrôle 2 (autorisation, fronts actifs)
- TMSK1 ($0022) : Masquage des interruptions
- TFLG1 ($0023) : Indicateurs d'interruptions.

 Lorsqu'un front prédéfini est présent sur une entrée, le contenu du compteur TCNT est mémorisé dans le registre de capture. Il est donc possible de mesurer la période d'un signal (entre deux fronts de même polarité) ou de mesurer la durée d'un signal (entre deux fronts de polarité différente), par différence de deux enregistrements successifs dans le registre de capture. L'indicateur d'interruption est mis à 1 lorsqu'un front actif est détecté sur l'entrée de capture. Il doit être remis à 0 ( par écriture d'un 1 au niveau du bit correspondant) afin d'être utilisable sur le front actif suivant. 

interruption

L'algorithme de programmation se résume dans ce cas à :
- attendre un front actif (interruption ou lecture de l'indicateur dans TFLG1),
- mémoriser la valeur T1 présente dans le registre de capture,
- effacer l'indicateur dans TFLG1 (par écriture d'un 1), en utilisant LDAA/STAA plutôt que BSET qui peut causer quelques problèmes,
- attendre le deuxième front actif,
- mémoriser la valeur T2 présente dans le registre de capture,
- calculer la durée ou la période par : T2-T1.


 Exemple de programme d'utilisation de l'entréede capture du Timer 

Avec Emulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
sortie PA5(23)-OC3. L'entrée PA0(27)-IC3 reçoit une fréquence
* (supérieure à 30Hz). Le TIC3 génère une interruption à chaque front descendant. Le nombre
* d'impulsions entre chaque front est calculé par soustraction. TOC3 est chargé avec cette
* valeur divisée par quatre (sortie toggle).* Lorsque la valeur contenue dans TCNT devient
* égale à celle contenue dans TOC3, une interruption est générée ,tandis que la sortie PA5-OC3
* change d'état. TOC3 est alors chargé avec une nouvelle valeur.
TCNT EQU $E Compteur (fonctionnement permanent).
TMSK1 EQU $22 Bit 5 et 0: masquage OC3 et IC3.
TMSK2 EQU $24 Prescaler.
TFLG1 EQU $23 Bit 5 et 0: indicateur OC3 et IC3.
TOC3 EQU $1A Valeur à comparer à celle du Compteur.
TIC3 EQU $14 Registre de capture.
TCTL1 EQU $20 Bits 5 et 4 : Mode de fonctionnement de OC3.
TCTL2 EQU $21 Bits 0 et 1 : Mode de fonctionnement de IC3.
CONFIG EQU $3F Watchdog et Eprom.
FIRST EQU $42
SEC EQU $44
TOCC3 EQU $46
ORG $F000 Début du programme.
RESET LDS #$00FF Initialisation Pile.
LDAA #$06
STAA <CONFIG Nocop+Epon.
LDAA #$00
STAA <TMSK2 PR0=0 et PR1=0 (horloge 0,5us).
LDAA #$02
STAA <TCTL2 Fronts descendant sur IC3.
LDAA #$10
STAA <TCTL1 OM3=0 et OL3=1:Toggle Output.
LDAA #$21
STAA <TMSK1 Interruptions autorisées sur IC3 et OC3.
STAA <TFLG1 Raz indicateur d'interruption précédents.
CLI Démasquer les interruptions.
BRA * Boucle sans fin.
COMP LDAA #$20 ( l'instruction BSET est à éviter)
STAA <TFLG1 Raz indicateur d'interruption OC3.
LDD <TOCC3 Valeur demi-période.
ADDD <TCNT Ajoute compteur.
STD <TOC3 Résultat dans TOC3.
RTI Retour au programme principal.
CAPT LDAA #$01 ( l'instruction BSET est à éviter)
STAA <TFLG1 Raz indicateur d'interruption IC3.
LDD <SEC
STD <FIRST Mémoriser premier front.
LDD <TIC3
STD <SEC Mémoriser deuxième front.
SUBD <FIRST
LSRD Diviser par 2.
LSRD Diviser par 2.
STD <TOCC3
RTI Retour au programme principal.
ORG $FFE4
FDB COMP Interruption Timer TOC3.
ORG $FFEA
FDB CAPT Interruption Timer TIC3.
ORG $FFFE
FDB RESET Reset.
* Pour lancer le programmme avec l'émulateur: [V] [D] ^I [O] [I] [C] [U] [O] [R] [H]
* La modification du Prescaler doit être effectuée avant 64 cycles d'horloge suivant le Reset
END
***********************************************

 
 INTERRUPTION PERIODIQUE (Real - Time Interrupt) 

 Cette fonction est utilisée pour générer une interruption à des instants précis. Elle utilise le fait qu'un compteur perpétuel passe de $FFFF à $0000, de façon répétitive et au bout d'un temps dépendant de son horloge.

Par exemple, avec un quartz de 8MHz , RTR0=1 et RTR1=1, la période de l'interruption périodique est de 32,768ms.

Registres spécifiques:
TMSK2 ($0024): le bit RTII autorise ou interdit les interruptions
TFLG2 ($0025): le bit RTIF est mis à un à chaque interruption périodique et mis à zéro par écriture d'un 1 à son emplacement.
PACTL ($0026): bits RTR0 et RTR1: rapport de division de l'horloge.

registres

  
RTR1 RTR0 Quartz 4MHz 8MHz 12MHz
    E 1MHz 2MHz 3MHz
0 0   8,192ms 4,096ms 2,731ms
0 1   16,384 8,192ms 5,461ms
1 0   32,768 16,384ms 10,923ms
1 1   65,536ms 32,768ms 21,845ms

Vecteur d'interruption: $FFF0-$FFF1


 Exemple de programme d'utilisation de l'interruption périodique 

Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* ESSAI D' UNE INTERRUPTION PÉRIODIQUE.
* On peut vérifier à l'oscilloscope que les sorties du port C changent d'état toutes les #33ms.
*
DDRC EQU $0007 Registre de direction de données
PORTC EQU $0002 Registre de sortie
TMSK2 EQU $0024 Masquage interruptions
TFLG2 EQU $0025 Flags interruptions
PACTL EQU $0026 Division horloge
CONFIG EQU $003F Configuration Watchdog et Eprom
*
ORG $F00C Debut du programme
*
RESET LDS #$00FF Initialisation pointeur de pile
LDAA #$06 NOCOP+EPON
STAA <CONFIG
LDAA #%01100011 Sorties Afficheur
STAA <DDRC
LDAA #$03 0 0 0 0 0 0 RTR1 RTR0 32.768ms
STAA PACTL
BSET TMSK2 $40 Autoriser les interruptions du RT
CLR PORTC
CLI Démasquer les interruptions
BRA * Boucle sans fin.
*
INT LDAB <PORTC
COMB Complémenter ACCB
STAB <PORTC
LDAA #$40 Raz flag interruption du RT
STAA <TFLG2
RTI Retour au programme principal.
*
ORG $FFF0
FDB INT Interruption périodique
ORG $FFFE
FDB RESET Reset
*
* Pour lancer le programme avec l'émulateur: [V] [D] ^I [O] [I] [C] [U] [O] [R] [H]
*
END Fin du listing
***********************************************

 
 Chien de garde (COP Watchdog) 

Il permet de déceler des erreurs de programme et d'éviter des boucles sans fin. Si une partie de programme (séquence) ne s'est pas déroulée dans un temps prédéfini, un Reset du système (par vecteur $FFFA-$FFFB) est demandé par le COP (Computer Operating Properly).

Registres spécifiques:
- OPTION ($0039) : Sélection de l'horloge par CR1 et CR0
- CONFIG ($003F) : Autorisation du Chien de garde (bit NOCOP)
- COPRST ($003A) : Armement et Raz du Chien de garde.

option

Les bits CR1 et CR0 ne peuvent être programmés que pendant les 64 premiers cycles suivant un Reset.

CR1 CR0 Quartz 4MHz 8MHz
    E 1MHz 2MHz
0 0   32,768ms 16,384ms
0 1   131,07ms 65,536ms
1 0   524,29ms 262,14ms
1 1   2,097s 1,049s

 La programmation du Chien de garde se fait de la façon suivante:
1- choisir une durée pour le fonctionnement du COP (bits CR1 et CR0),
2- autoriser le COP (bit NOCOP=0),
3- écrire $55 dans le registre COPRST pour armer le COP, juste avant le début de la séquence de programme à contrôler,
4- écrire $AA dans COPRST pour remettre à zéro le COP, à la sortie de la séquence à contrôler,
5- recommencer les étapes 3 et 4 pour la séquence suivante.

 
 Exemple de programme d'utilisation du Chien de garde 

Avec Émulateur du MC68HC711D3 de MECALOGIC Concept.
***********************************************
* Essai du Watchdog.
*
OPTION EQU $39
COPRST EQU $3A
CONFIG EQU $3F
PORTC EQU $3
DDRC EQU $7
*
ORG $F000 Adresse de début du programme
Reset LDS #$FF Initialisation Pile
LDAA #$1
STAA <OPTION Time out 65,536ms
LDAA #$02
STAA <CONFIG NOCOP=0 et EPON=1
LDAA #$FF
STAA <DDRC Port C en sortie
CLR PORTC
Arm LDAA #$55
STAA <COPRST Armer le COP
*
LDX #25000 * boucle de programme dont la durée
Tempo DEX * ne doit pas excéder le Time out
BNE Tempo * t=(3+(3+3)n)*0,5us
* * n=25000,t=75ms > Time out
* * n=20000,t=60ms < Time out
*
LDAA #$AA
STAA <COPRST Raz COP
BSET PORTC $02
BRA Arm
Rstcop LDS #$FF Nouvelle initialisation
LDAA #$6
STAA <CONFIG
LDAA #$FF
STAA <DDRC
CLR PORTC
BSET PORTC $01
BRA *
* Vecteurs
ORG $FFFA
FDB Rstcop COP
ORG $FFFE
FDB Reset Reset
*
* Tester le programme en mode Run Only. Essayer pour les deux valeurs de n (20000 et 25000)
* Si n < Time out, PC1=1. Si n > Time out, PC0=1
*
END Fin du listing
***********************************************

 

  W3C W3C W3C