Travaux pratiques 4H
DATE:24 /05/2017
Pré-requis
Outils logiciel naken_asm et naken_util , mspdebug, lauchpad TI avec un
msp430g2553.
Pc sous linux avec la suite pour msp430
Support de cours :
MSP 430 / Assembleur / Cross compilation
Accés à Workboot ,et le launchpad MSP430 de TI ainsi que CCS sous windows
But
Maîtrise de l'environnement de travaille sous linux.
Édition et modification de code avec vi ou nano ... etc
compilation avec les outils naken .
Simulation avec naken_util
Désassemblage avec naken_util
prise en main de mspdebug en simulation et en réel ..
Pas à pas et débogage
Injection de code dans la puce avec mspdebug.
Utiliser les I/O sur le MSP430G2553
Écriture de code et résolution de problème micro programmé
appel a des sous programmes.
Comprendre la notion d'interruptions et l'usage. Vecteur d'interruption.
Utilisation du DAC (CAN) sur 10 bits du MSP430
Vos tp seront rédigés au format pdf envoyés sur l' émail :
polytech1 @ workboot.fr ! y a des espaces anti bot !
La qualité de la rédaction conditionne votre note , et les initiatives apportent beaucoup de points dans la notation.
Découverte des sous programmes en assembleur avec les mnémoniques call et ret et push et
pop .. et SP ..
Utilisation de l'assembleur et programmation et débogage, a partir de la partie 2.
Les mnémoniques call et ret
Écrire un programme utilisant ces 2 mnémoniques , refaire le programme de clignotement
alterné (blink) en y insérant 2 fonctions.
debut main
initialiser()
etiquette
// sous programme d'init
vert1rouge0() // sous programme qui allume le vert
delay(N) // sous programme qui réalise un delay f(N)
vert0rouge1() // sous programme qui allume le rouge
delay(N) // N est un paramètre qui peut etre passé par un registre
// ou une zone mémoire RAM
allez à etiquette
fin
les sous programmes:
debut initialiser()
placer SP en RAM
mettre P1,6 et P1,0 en sortie.
Mettre P1,6 et P1,0 a zero
retour de S/P
debut vert1rouge()
..
...
..
retour de S/P
debut vert0rouge1()
...
retour de S/P
debut delay(N)
attendre N temps
retour de S/P
exemple d'un code utilisant un sous programme pour aider avec les sous programmes en asm:
;Exemple d'utilisation de sous programmes en ASM MSP430
.org 0xF800
start:
mov.w 0x270,SP ; ne pas oublier de bien placer SP dans de la RAM
; alller a la fonction init
call #init
; passage de parametre avec R9 a la fonction SP1
mov #60000,R9
call #SP1
fin:
jmp fin
init:
nop
nop ; je ne fais rien
ret ; mais je reviens de mon sous programme
SP1:
push R9
dec R9
pop R9
ret
;vecteur reset
org 0xFFFE
dw start
.end
Estimer la valeur de T
c = 1us. (si vous n'avez pas modifié la fréquence de fonctionnement du msp 430)
Raconter comment se comporte SP et son contenu avant le call et après ..
Ensuite avant et après le ret.(return en asm)
Finir par déterminer une bonne valeur de SP , ou doit il etre placé ?
Pour la fonction delay , utiliser Push et Pop sur le registre qui
servira de compteur N .. et provoquer un retour de la fonction avec
le registre qui contiendra la même valeur qu'au départ.
Si N = 6000 alors au retour N vaudra toujours 6000 ...
Contrairement au TP2 ou nous avons fait une scrutation du bouton P1.3 pour détecter les changement sur le bouton.
L’inconvénient de cette méthode est que le temps machine du msp430 est concentré pour surveiller un bouton ! Quand on y pense cela n'est pas des plus passionnant pour un début d'intelligence.. car il peut faire beaucoup plus , comme du calcul ou des tests sur d'autres événements.
C'est la qu'intervient la notion d'interruption matérielle.
Ici donc nous allons nous intéresser à la broche P1.3 encore (c'est déjà câblé sur le launchpad voir le schéma )
Pour ce faire testons ce code:
.include "msp430g2553.inc"
base_rom equ 0xc000
base_vector equ 0xffe0
greenLED equ BIT6
redLED equ BIT0
BP equ BIT3
org base_rom
start:
;on désactive le watchdog
mov.w #WDTPW|WDTHOLD, &WDTCTL
mov.w #0x3FF,SP
;initialisation des des ports ..
mov.b #greenLED|redLED, &P1DIR ; P1.0 et P1.6 sont en sortie donc P1.3 est en entrée
bic.b #greenLED,&P1OUT ;eteindre la led verte
;Le bouton poussoir
bis.b #BP,&P1OUT ; Resistance de Rappel a 1
bic.b #BP,&P1SEL
bic.b #BP,&P1DIR ; deja fait .. mais pourquoi pas refaire !
bis.b #BP,&P1REN ; mettre la resistance de rappel
bic.b #BP,&P1IES ; front montant
bis.b #BP,&P1IE ; Port 1 Enable interrupt
bic.b #BP,&P1IFG ; clear interrupt flag
;on demasque les Int
bis.w #GIE,SR
;
; on est dans la boucle infinie ..
loop:
jmp loop
inter:
bic.b #BP,&P1IFG ; remise a zero du flag
xor.b #greenLED,P1OUT ; toogle led verte
reti
;seul l'int peut se faire...
; interruption .. pour le PORT1
org base_vector+PORT1_VECTOR
dw inter
org base_vector+RESET_VECTOR
dw start
.end
les lignes importantes pour ca :
;Le bouton poussoir
bis.b #BP,&P1OUT ; Resistance de Rappel a 1
bic.b #BP,&P1SEL
bic.b #BP,&P1DIR ; deja fait .. mais pourquoi pas refaire !
bis.b #BP,&P1REN ; mettre la resistance de rappel
bic.b #BP,&P1IES ; front montant
bis.b #BP,&P1IE ; Port 1 Enable interrupt
bic.b #BP,&P1IFG ; clear interrupt flag
;----------- ET
inter:
bic.b #BP,&P1IFG ; remise a zero du flag
xor.b #greenLED,P1OUT ; toogle led verte
reti
;seul l'int peut se faire...
; ----------- Mais aussi !
; interruption .. pour le PORT1
org base_vector+PORT1_VECTOR
dw inter
indice
L’interruption est vue comme un sous programme ... qui se déclenche par un phénomène externe non synchrone.
Qu'apporte l'interruption par rapport à la solution scrutation vu au TP2?
Convertisseur Analogique/Digital sur 10 bits.
Combien de valeurs sont possibles sur ce convertisseur?
Présentation du schéma que nous allons utiliser:
Le point A est a la masse (Gnd)
Le point B à 3,3V (Vcc)
Et C sur P1.7
Utilisation d'un potentiomètre
;software demo of analog to digital conversion to support a sample circuit
;using a potentiometer 0V and 3,3V and the MSP430 Launchpad. P1.7 In.
;Detect 3,3V/2. When the light hitting P.1.7 > 0x1FF (3,3V / 2)
;no interrupt mode
;Built with vi and naken_asm
;------------------------------------------------------------------------------
.include "msp430g2553.inc"
;------------------------------------------------------------------------------
;Initialize MSP430
;------------------------------------------------------------------------------
org 0xC000
_main:
mov.w #0280h,SP
mov.w #WDTPW+WDTHOLD,&WDTCTL
; initialize stack pointer
; stop watchdog timer
;------------------------------------------------------------------------------
;Configure the ADC10 Control Registers ADC10CTL0 and ADC10CTL1
;ADC10ON = enable ADC10
;ADC10SHT_2 = select clock speed of 16x
;ADC10IE = interrupt enable
;------------------------------------------------------------------------------
mov.w #ADC10SHT_2+ADC10ON+ADC10IE,&ADC10CTL0
mov.w #INCH_7,&ADC10CTL1
; input channel 7
;------------------------------------------------------------------------------
;Select and configure inputs and outputs
;------------------------------------------------------------------------------
bis.b #BIT7,&ADC10AE0
bis.b #BIT0,&P1DIR
; P1.7 as analog input A7
; P1.0 output
;------------------------------------------------------------------------------
;Read the tension in P1.7
;Compare the result to a threshold value
;Set the LaunchPad LED on or off
;Repeat forever
;------------------------------------------------------------------------------
Mainloop:
bis.w #ENC+ADC10SC,&ADC10CTL0 ; initiate conversion
; bis.w #CPUOFF+GIE,SR ; turn off CPU (enter low power mode 0)
; and enable interrupts - wait in low
; power mode until ADC sampleis complete
; Tant que le convertisseur travail on attend .
fcv:
bit.w #ADC10BUSY,&ADC10CTL1 ; tant que ADC10 occupé on attend
jnz fcv
cmp.w #512,&ADC10MEM ;(1024/2)
; start with LED off (P1.0 = 0)
; test ADC result stored in ADC10MEM
; against a threshold value than threshold
jnc lessbc
; if the result is less
; loop back with LED still off than threshold
bic.b #BIT0,&P1OUT
jmp Mainloop
lessbc:
bis.b #BIT0,&P1OUT
; if result is greater 7/8
; then turn LED on process again
jmp Mainloop
; start the sample
;---------------------------------------------------------------------
; The interrupt service routine for the ADC10 interrupt
;---------------------------------------------------------------------
ADC10_ISR:
bic.w #CPUOFF,0(SP)
; when the ADC conversion is complete resume
reti
; exit low power mode and
; processing
;---------------------------------------------------------------------
;Interrupt Vectors
;---------------------------------------------------------------------
;Vecteur Reset
org 0xFFFE
dw _main
;Vecteur ADC10
org 0xFFEA
dw ADC10_ISR
.end
Explorer les registres utilisés dans les lignes suivantes
mov.w #ADC10SHT_2+ADC10ON+ADC10IE,&ADC10CTL0
mov.w #INCH_7,&ADC10CTL1
bis.w #ENC+ADC10SC,&ADC10CTL0 ; initiate conversion
bit.w #ADC10BUSY,&ADC10CTL1 ; tant que ADC10 occupé on attend
On utilisera le DAC pour connaitre la position du potentiomètre et en fonction du résultat faire clignoter les leds.
La temporisation sera fonction de la position du potentiomètre.
Ecrire un programme avec la led rouge et verte qui s'allument très vite , notre œil ne voit pas que le clignotement (persistence rétinienne).
Et un front montant de BP arrêtera sur rouge ou vert .. selon le moment ou on appuie .. (pile ou face )
2 Solutions à fournir :
- une par scrutation
- une par interruption.