Ce TD va permettre de comprendre comment fonctionne un microcontrôleur vu par un électronicien
Nous avons déjà vu cela en cours , mais nous allons valider le cours ici.
Vous avez ci-dessus le schéma de la maquette de prise en main de TI du msp430G2553
repérer les leds
La Led Rouge est branchée sur quel port:
La Led Verte est branchée sur quel port:
S1 sert à quoi ? branché sur ?
Justifier la présence de C14/R27
S2 est branché sur quel port :
Schéma interne des ports P1.0 / P1.2 page 1/16
P1.0 est la broche Bit 0 du port 1
P1.2 est la broche Bit 2 du port 1
Le parallélépipède à droite représente la broche externe du micro contrôleur, P1.0 ou P1.2 ici
En fouillant la DATASHEET du msp430G25553
on va retrouver les adresses des registres matériels interne du msp430
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;è;;;;;;;;;;;;;;;;;;;;;
;; Port P1
P1REN equ 0x0027 ; Port P1 resistor enable
P1SEL equ 0x0026 ; Port P1 selection
P1IE equ 0x0025 ; Port P1 interrupt enable
P1IES equ 0x0024 ; Port P1 interrupt edge select
P1IFG equ 0x0023 ; Port P1 interrupt flag
P1DIR equ 0x0022 ; Port P1 direction
P1OUT equ 0x0021 ; Port P1 output
P1IN equ 0x0020 ; Port P1 input
P1SEL2 equ 0x0041 ; Port P1 selection 2
extrait du fichier msp430g2553.inc que l'on peut retrouver sur ce lien
P1SEL et P1SEL2 sont à zéro après un reset.
Ces 2 registres permettent de sélectionner la fonction des broches du PORT1
en consultant la DATASHEET on verra que si ces registres si il sont à zéro
P1SEL.0=0
P1SEL2.0=0
concernant le P1.0
P1SEL.6=0
P1SEL2.6=0
concernant le P1.6
Ainsi ces 2 broches sont utilisées en simple Entrée/Sortie.
on va s'occuper de P1.0
Pour mettre à Zero le bit P1SEL.0 il y a plusieurs méthodes en assembleur msp430
(sachant qu'il est déjà à zéro après la mise sous tension du msp430)
Mais si on veut en être certain à un autre moment on peut écrire dans le registre P1SEL = 0x00
ce qui mettre tout les bits de se registre de 8bits à zero
en assembleur cela donne :
mov.b #0x00,P1SEL
ici nous utilisons l’étiquette P1SEL ce qui rend le code plus lisible
ou , mais non conseillé
mov.b #0x00,0x0026
autre méthode bit par bit , car le msp430 dispose de la mnémonique bic
bit clear
bic.b #0x01,P1SEL
0x01 , est la valeur validant le bit0
en binaire : 0000 0001
bic.b #0x40,P1SEL
0x40 est la valeur activant le bit6
en binaire : 0100 0000
bic.b 0x41,P1SEL
va nous mettre un zéro sur le bit 0 et le bit 6 d'un coup et laisser les autres bits inchangés
en utilisant
la mnémonique mov
puis avec la mnémonique bic
Voila la solution
fichier msp430g2553.inc
ceci est un fichier d'inclusion de texte (correspond aux adresses des registres internes du msp430 ici le G2553
Répertoire de travail ledrougeon
recopier ces 3 fichiers dans un répertoire ledrougeon
pour assembler le projet
comme d'habitude la commande:
naken_asm ledrougeon.asm -o ledrougeon.hex -l
mspdebug rf2500
prog ledrougeon.hex
run
.. step .. etc vu en cours déjà
msp430
.include "msp430g2553.inc"
.org 0xC000
DEBPRG: bic.b #0x01,P1SEL
bic.b #0x01,P1SEL2 ; on positionne bien P1.0 sur la broche
bis.b #0x01,P1DIR ; on met P1.0 en sortie DIR DIRECTION
bis.b #0x01,P1OUT ; on met P1.0 a 1 la led s'allume !
FIN: jmp FIN ; on bloucle a l'infini ici
.org 0xFFFE
dw DEBPRG
.end
Ce programme est très clair grâce aux commentaires.
1 : dans P1DIR met en sortie.
0: dans P1DIR met en entrée.
Tester ce code , avec mspdebug pour programmer la puce puis exécuter le code, voir manipulations précédentes.
ici nous avons vu l'inclusion du fichier msp430g2553.inc
ça nous permet de ne pas saisir dans le source nous même ces étiquettes.
On retrouve cette philosophie en C avec la commande préprocesseur #include .
a vous de jouer
faire un répertoire
ledverteon
Et faire un projet qui réalise ce que l'on veut.
Envoyer cela à votre professeur , pour validation.
nous nous sommes emballé sur les Entrées Sorties , et nous avons toujours le chien de garde qui est la !
.msp430
.include "msp430x2xx.inc"
.org 0xC000
DEBPRG: mov.w #WDTPW|WDTHOLD, &WDTCTL
bic.b #0x01,P1SEL
bic.b #0x01,P1SEL2 ; on positionne bien P1.0 sur la broche
bis.b #0x01,P1DIR ; on met P1.0 en sortie DIR DIRECTION
bis.b #0x01,P1OUT ; on met P1.0 a 1 la led s'allume !
FIN: jmp FIN ; on bloucle a l'infini ici
.org 0xFFFE
dw DEBPRG
.end
on va inclure encore plus d'étiquettes, car WDTCTL et WDTPW et WDTHOLD sont nécessaires.
pour stopper le WatchDog! qui s'exprime ici sans qu'on s'en rende compte car le programme est court..
Relance régulièrement le code .
msp430x2xx.inc est plus complet que le précèdent.
le micro contrôleur msp430 va très vite, ça fréquence de travail est de 1Mhz
1x10⁶ cycle par seconde !
1 000 000 ou un million de cycles par seconde !
dans un repertoire led50pourcent
Ecrire un code qui va allumer la led de P1.0 puis l'eteindre, et cela en boucle infinie.
Comment la led vous semble t'elle lumineuse?
Il faut savoir que la LED est un composant rapide contrairement à votre oeil...
on appel cette technique de la PWM
Pulse Width Modulation
à l'aide de la mnémonique NOP (non opération mais prend un 2 cycles machines)
augmenter le temps passé à l’état bas .. de sorte que la led paraisse peu lumineuse.
envoyer vos codes sur l'email du professeur. (polytech1@workboot.fr)
Avec le fichier LST (option -l) de naken
il y a le détail des cycles d'horloges que prend chaque instruction.
Estimer les temps de la led sur P1.0
l'état haut :
l'état bas :
Nous allons faire un code si on appuie sur S2 la led rouge va s'allumer si on le relâche la led rouge s'éteint.
il est connecté sur la broche P1.3 , si on appuie sur S2 une masse ('0') est sur P1.3
D'après le schéma , si on laisse ouvert S2 P1.3 à un potentiel non défini .
Une résistance de rappel de niveau est nécessaire.
Cette dernière est intégré dans le MSP430
Ici pour lire l'état de S2 il faut que
P1.3 soit en entrée , donc P1DIR.3=0
et nous pourrons lire son état avec P1IN.3
Il reste à placer correctement la R (résistance interne)
P1REN = 1 (activation de la résistance)
P1OUT = 1 (rappel à l'état haut)
.msp430
.include "msp430x2xx.inc"
.org 0xC000
DEBPRG: mov.w #WDTPW|WDTHOLD, &WDTCTL
bis.b #0x01,P1DIR ; on met P1.0 en sortie DIR DIRECTION
bis.b #0x01,P1OUT ; on met P1.0 a 1 la led s'allume !
bic.b #0x08,P1DIR ; P1.3 en entrée (S2)
bis.b #0x08,P1OUT ; niveau de rappel
bis.b #0x08,P1REN ; resistance R interne enable
SCRUT: bit.b #0x08,P1IN ; test de P1.3 , scrutation
jz allume_led ; on test Z
eteint_led: bic.b #0x01,P1OUT ; eteint la led rouge
jmp SCRUT
allume_led: bis.b #0x01,P1OUT ; allume la led rouge
jmp SCRUT
.org 0xFFFE
dw DEBPRG
.end
Armé de vos connaissances
Ecrire un code que quand on appuie le rouge et le vert alternes , mais tellement vite que quand vous allez lâcher l'interrupteur S2 Seul rouge ou vert sera allumé..
Ecrire cet application
Envoyé moi vos propositions.