rapport de tp n°1 - Free.fr
La séance de TD consacrée à la programmation du timer nous a permis ...
Chaque compteur peut décompter à la cadence de l'horloge du microprocesseur
ou à celle du .... que l'interruption, qui est auto-vectorisée se fait au niveau 4 du
68000. .... Cette erreur a été corrigée en remplaçant la commande BSET par
MOVE qui ...
part of the document
RAPPORT DE TP N°1
Programmation du Timer PTM 6840
En cours nous avons été introduits au Timer PTM 6840, membre de la famille des microprocesseurs MC 68000. La séance de TD consacrée à la programmation du timer nous a permis approfondir notre acquis. Nous avons pu mieux comprendre la fonction du PTM et sa programmation. Le TP nous a permis de mettre en application ce que nous avions appris sur le 6840 et les interruptions.
Trois timers au sein du timer PTM 6840 :
Les trois compteurs ont un fonctionnement relativement similaire.
Ils ont tous les trois des registres contenant la valeur à partir de laquelle le compteur décompte. Les valeurs, stockées dans les registres de stockage de 8 bits : LSB et MSB, peuvent être codées sur 8 (registre LSB) ou 16 bits (registres MSB et LSB). Au timer 1 correspondent les registres LSB1 et MSB1, au timer 2 correspondent les registres LSB2 et MSB2
Ces registres sont accessibles en lecture et en écriture.
Cette valeur stockée est envoyée vers le Timer à chaque fin de décomptage de façon à effectuer un nouveau décompte. Cet envoi est contrôlé par le registre CR10 (mis à 1).
Chaque compteur peut décompter à la cadence de lhorloge du microprocesseur ou à celle du compteur. Lhorloge utilisée est contrôlée par le registre C1.
Les compteurs 1 et 2 décomptent sur une base de temps T. Le compteur 3 peut pré-diviser sa base de temps par 8 (registre CR30 mis à 1).
Le registre GX est la commande de démarrage du décomptage.
Les registres du PTM :
Les registres du PTM peuvent être en lecture/écriture ou en lecture et écriture seule. Ces différents accès impliquent que certaines commandes ne peuvent être appliquées à certains registres en lecture ou en écriture seule. Par exemple il nest pas possible deffectuer un BSET ou une fonction logique sur un registre en écriture seule.
Ces compteurs sont commandés par le registre CRx qui est en écriture seule. Chaque bit de ce registre commande une opération particulière.
CR10 est le bit de RAZ interne.
CR20 permet laccès aux registres CR3 (0) et CR1 (1).
CR30 commande la base de temps du compteur 3.
CRX1 commande quelle horloge va être utilisée pour le décomptage.
CRX2 commande la taille de la valeur à partir de laquelle le compteur va décompter (1 8bits, 0 16 bits).
CRX3 CRX4 CRX5 commandent le mode de compteur et les interruptions
CRX6 commande le mode de validation des interruptions
CRX7 valide la sortie des compteurs
Le registre détat est le registre SR (4bits) qui est en lecture seule. SRO, SR1 et SR2 sont mis à 1 si les interruptions des compteurs correspondant sont autorisées. Le bit dinterruption général est SR7 (SR7=SR0+ SR1+SR2) par défaut ce bit est toujours à 0.
Les adresses de base du PTM 6840 sont comptées en mémoire du kit 68040 à partir de 0F0004390h. Or les adresses du PTM sont impaires. Nous avons donc la correspondance suivante des adresses :
0F0004391h : Adresse de CR1 et CR3
0F0004393h : Adresse de CR2 et SR (Statut Register)
0F0004395h : Adresse de LSB1
0F0004397h : Adresse de MSB1
0F0004399h : Adresse de LSB2
0F000439Bh : Adresse de MSB2
0F000439Dh : Adresse de LSB3
0F000439Fh : Adresse de MSB3
Remarques :
CR1 et CR3 sont à la même adresse car ce sont des registres de 8 bits (BYTE). Le contrôle de lun ou lautre est fait par le bit 0 de CR2.
CR2 et SR sont à la même adresse mais elles sont différenciées par le fait que CR2 (comme tous les registres de contrôle) ne sont quà écriture seule et SR nest quà lecture seule. Le microprocesseur fait seul la différence en fonction de ce qui est désiré (écriture ou lecture).
Premières mises en uvre
Nous avons du ensuite réfléchir au fonctionnement du PTM au niveau de la programmation. Par exemple, il nous a été demandé les diverses informations nécessaires pour obtenir impulsion de largeur 16 secondes avec le Timer 3 (Question 6 du TD1). Les données sont une fréquence externe de 10KHz et une division par 8 de cette dernière.
La division par 8 étant activée, la fréquence de décomptage est de 10 / 8 = 1,25kHz. Pour 16 secondes, nous avons donc besoin davoir un décomptage en mode cyclique à partir de 20 000. Cette donnée est à insérer dans le latch du Timer 3. Pour ceci, il nous fallut convertir ce nombre en hexadécimal : (20 000)10 = (4E20)16. Il fallait donc entrer dans le registre MSB3 la valeur 4E et dans LSB3 la valeur 1F sachant quil faut retirer 1 à la valeur car le décompteur compte une fois de plus que la valeur entrée. Comme lhorloge est de type externe, cest lhorloge provenant de C3 qui est traitée. Toutes ces caractéristiques sont contrôlées par CR1, CR2 et CR3.
Létat de CR3 est : 1 0 0 0 0 0 0 0 1
CR30 = 1 pour activer la division par 8
CR31 = 0 pour utiliser lhorloge externe
CR32 = 0 pour un mode de comptage sur 16 bits (MSB+LSB)
CR33 = 0
CR34 = 0 pour activer le mode comptage cyclique
CR35 = 0
CR36 = 0 pour invaliser linterruption IRQ (inutile ici)
CR37 = 1 pour valider la sortie O3 (le signal que lon veut obtenir)
Le but du TP
Le but du TP était dappliquer la question 7 du TD1. Générer une interruption toutes les 10ms à laide de lhorloge interne du 68000 qui est automatiquement divisée par 10 par le générateur dhorloges du PTM. La fréquence E est donc égale à 1MHz. Lénoncé indique également que linterruption, qui est auto-vectorisée se fait au niveau 4 du 68000.
Lorganisation de notre travail
Comme nous voulions une impulsion toutes les 10ms, il nous fallait avoir une valeur initiale de compteur égale à 10000. Ce qui correspond en hexadécimal à 2710-1 = 270F.
Le cahier des charges nous demandait implicitement de connaître le fonctionnement des registres du PTM (CRx, SR, MSBx, LSBx). Pour ne pas avoir à configurer CR3 nous avons choisi, arbitrairement, le Timer 1.Nous devions alors entrer, successivement des données dans les registres afin dentrer la valeur dans le latch du compteur 1, initialiser le vecteur dinterruption, charger la valeur dans le compteur et lancer le comptage. Une deuxième phase consistait à
Les étapes de programmation
Linitialisation du vecteur consistait à entrer dans un registre dadresse (par exemple A4) la valeur de ladresse du programme dinterruption dans le tableau des vecteurs dexception. Pour une interruption de niveau 4, ladresse est vbr + 70h.
Il fallait ensuite donner le nom du programme à exécuter lors de linterruption, Pgrint dans notre cas. Il sagit en fait dentrer ladresse de ce programme à ladresse vbr+70h.
Nous avons, par sécurité, entré les valeurs de la valeur initiale du compteur (27h et 0Fh) à insérer dans MSB et LSB dans les registres D0 et D1. Et ensuite nous avons respectivement transféré les valeurs contenues dans D0 et D1 dans MSB1 et LSB1.
Il fallait ensuite paramétrer les compteurs, donc accéder à CR1 pour permettre son fonctionnement tel quil est décrit ci-dessus. Il fallait :
- Masquer la sortie O1 (inutile ici)
Valider linterruption de IRQ
Mettre le Timer 1 en mode cyclique
Activer le mode de comptage normal (16 bits)
Activer lutilisation de lhorloge interne
Transférer les valeurs des latches dans les compteurs.
Lensemble de ces paramètres correspondent à la valeur #01000011b à mettre dans CR1 mais pour pouvoir avoir accès à CR1, il faut mettre le bit 0 de CR2 à 1, ce que nous avons effectué.
Il ne reste alors, pour le programme principal, quà écrire linstruction pour lancer les compteurs : CR10 = 0, à créer la boucle infinie et à inscrire les pseudos instructions de retour moniteur (TRAP
)
Le second objectif était ensuite de développer le programme dinterruption. Les instructions daffichage (PEA) nous étaient fournies et nous devions déclarer les constantes debmess et finmess correspondants aux chaînes de caractères permettant dafficher « interruption » et darrêter laffichage (0) immédiatement après. Laffichage se faisant grâce à la commande TRAP #15 DC.W OUTSTR. Cette dernière instruction contient ladresse de « lécran » du kit et est définie en début de programme.
Après laffichage du message désiré, il ne fallait pas oublier de réactiver linterruption au niveau du CR16, de recharger la valeur initiale du compteur et enfin, de relancer les compteurs avant de quitter le programme dinterruption avec linstruction RTE.
Problèmes rencontrés :
Notre première erreur a été de chercher à stocker la valeur initiale directement dans le LSB1 alors que celui-ci est de 8 bits et que la valeur 270Fh doit être codé sur 16 bits. Nous pensions que lors dun envoi de données pour linitialisation du latch sur le LSB avec une valeur codée sur 16 bits était automatiquement tronquée en deux mots de 8 bits dans MSB et LSB. Nous avons donc placé les 8 bits de poids fort dans le registre D0 et loctet de poids faible dans D1 puis nous avons copié ces registres respectivement dans MSB1 et LSB1.
Notre deuxième problème est intervenu lors de la modification des registres de contrôles CR1, CR2 et CR3. Nous avons voulu utiliser la commande BSET car nous ne savions pas que celle-ci requérait un accès en lecture au registre. Cette erreur a été corrigée en remplaçant la commande BSET par MOVE qui elle ne demande pas de lecture.
Enfin, lorsque nous lancions notre programme, celui naffichait quune seule fois le message voulu. Nous nous sommes rendus compte que lerreur venait du fait que nous navions pas réactivé linterruption dans le sous-programme daffichage.
Code Source:
PTM EQU $F0004391
CR1 EQU PTM
CR2 EQU PTM+2
STATUS EQU PTM+2
LSB1 EQU PTM+4
MSB1 EQU PTM+6
OUTSTR EQU $0021
MOVEC.L vbr,A4 ;initialisation du vecteur
ADD.L #70h,A4
MOVE.L #Pgrint,(A4)
MOVE.W #2300h,SR ;autorise interruption niv 4
MOVE.b #027h,D0
MOVE.b #00Fh,D1
Move.b D0,MSB1 ;initialisation du latch 1
Move.b D1,LSB1 ;
Move.b #1,CR2 ;accès à CR1 ecriture
MOVE.B #01000011b,CR1 ;paramètre les compteurs & envoie dans le ;compteur la valeur du latch
MOVE.B #01000010b,CR1 ;lance les compteurs
BOUCLE BRA BOUCLE
TRAP #15
DC.W $63
Pgrint PEA finmess
PEA debmess
TRAP #15
DC.W OUTSTR
MOVE.B #01000011b,CR1
MOVE.B #01000010b,CR1 ;réactive l'interruption
RTE
debmess DC.B 'interruption '
finmess DC.B 0
IN201 Dauzat Lilian, Deloison Bastien, Peyre Charlotte
TP n°1
Rapport de TP n°1
}