0% ont trouvé ce document utile (0 vote)
26 vues5 pages

Correction TD

Transféré par

amerbellil18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
26 vues5 pages

Correction TD

Transféré par

amerbellil18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

ENISO : IA2 TD MICROCONTROLEURS

I/ Interpréter le programme assembleur et indiquer la valeur finale des variables qui ont subi des modifications

ETAT INITIAL DE LA MEMOIRES PROGRAMME Etat après l’exécution du programme


adresse Bank0 Bank1 adresse org 0 adresse Bank0 Bank1 adresse
INDF :0x00 0xFF 0xFF 0x80 :INDF BSF STATUS,R INDF :0x00 0x80 :INDF

TMR0 :0x01 0xFF 0xFF 0x81 :OPTION CLRF TRISB TMR0 :0x01 0x81 :OPTION
MOVLW 0x0F
PCL :0x02 0xFF 0xFF 0x82 :PCL MOVWF TRISC PCL :0x02 0x82 :PCL

STATUS :0x03 0x18 0x18 0x83 :STATUS BCF STATUS,5 STATUS :0x03 0x38/0x18 0x38 0x83 :STATUS
CLRF PORTB
FSR :0x04 0xFF 0xFF 0x84 :FSR CLRF 0x20 FSR :0x04 0x84 :FSR

PORTA :0x05 0xFF 0xFF 0x85 :TRISA CLRF 0x21 PORTA :0x05 0x85 :TRISA
CLRF 0x22
PORTB :0x06 0xFF 0xFF 0x86 :TRISB Retour: PORTB :0x06 0 0 0x86 :TRISB

0xFF 0xFF INCF 0x20 PORTC :0x07 0X0F 0x87 :TRISC


PORTC :0x07 0x87 :TRISC
BTFSS 0x20,7
PORTD :0x08 0xFF 0xFF 0x88 :TRISD GOTO Retour PORTD :0x08 0x88 :TRISD

INCF 0x21
BTFSS 0x21,7
0x20 0xFF 0xFF 0xA0 GOTO Retour 0x20 0X80/0XFF 0xA0
INCF 0x22 0x21 0X80/0XFF 0xA1
0x21 0xFF 0xFF 0xA1 BTFSS 0x22,7
0xFF GOTO Retour 0x22 0X80 0xA2
0x22 0xFF 0xA2
Fin : goto Fin W=0X0F
end

3) on donne l’algorigramme d’un exemple d’application sur le microcontrôleur 16F877, réaliser la traduction
assembleur et PICC
#include <[Link]> PICC
DEBUT
Org 0 #BYTE PORTA=5
BSF STATUS,RP0 #BYTE PORTB=6
Configurer BCF STATUS,RP1 #BYTE PORTC=7
PORTB en sortie CLRF TRISB #BYTE PORTD=8
PORTC en entrée MOVLW 0XFF ; W=0XFF #BYTE TRISA=0x85
PORTD en entrée MOVWF TRISC ; TRISC=W .
PORTA en entrée
MOVWF TRISD #BYTE TRISD=0x88
MOVWF TRISA #BIT RA0=PORTA.0
BCF STATUS,RP0 # BIT RA1=PORTA.1
BCF STATUS,RP1 MAIN()
(RA0=1) {
DEBUT TRISB=0;
oui TRISC=TRISD=TRISA=0xff ;
BTFSS PORTA,0
PORTB = PORTC+PORTD Goto suivant ;(non) //While(true)
Movfw PORTC {
Addwf PORTD,w debut:
Movwf PORTB If(PORTA==0b00000001)
suivant //If(RA0==1)
{ PORTB=PORTC+PORTD ;}
(RA1=1)
BTFSS PORTA,1 IF(PORTA==0b00000010)
oui GOTO DEBUT ;NON //IF(RA1==1)
MOVFW PORTD PORTB=PORTC-PORTD;
PORTB = PORTC-PORTD SUBWF PORTC,w ; W=PORTC-W Goto debut;
MOVWF PORTB }
GOTO DEBUT
}
FIN END
II/ Développement d’un additionneur / soustracteur
Le schéma en annexe comprend 8 diodes LED sur le PORTB ; 2 commutateurs rotatifs à 9 positions sur le PORTC et le
PORTD et finalement 2 interrupteurs branchés sur RA0 et RA1.
La rotation du commutateur permet la liaison du curseur (5v) avec une ligne du PORT correspondant.

L’application permet de réaliser une opération (addition ou soustraction) entre la position du commutateur SW1 et celle du
commutateur SW2, le résultat sera afficher en binaire sur les diodes LED.

Le choix de l’opération dépend de l’état des interrupteurs ADDITION et SOUSTRACTION : si RA0=1 on affiche sur les
LED la somme (position SW1 + position SW2) ; si RA1=1 : on affiche le résultat de (position SW1 - position SW2).
Par exemple dans le schéma; SW1=8 et SW2=8
-Si on ferme l’interrupteur ADDITION, on écrit la somme 8+8 =16=0x10=0b0001000 dans le PORTB LED5=ON
-Si l’interrupteur SOUSTRACTION est fermé, on écrit 0 dans le PORTB  les 8 LED OFF
1) Donner la valeur (en binaire et hex) des POTRC et PORTD qui correspond aux positions des commutateurs
Position SW1 Valeur du PORTC Position SW2 Valeur du PORTD
0 0b00000000 0x00 0 0b00000000 0x00
1 0b00000001 0x01 1 0b00000001 0x01
2 0b00000010 0x02 2 0b00000010 0x02
3 0b00000100 0x04 3 0b00000100 0x04
4 0b00001000 0x08 4 0b00001000 0x08
5 0b00010000 0x10 5 0b00010000 0x10
6 0b00100000 0x20 6 0b00100000 0x20
7 0b01000000 0x40 7 0b01000000 0x40
8 0b10000000 0x80 8 0b10000000 0x80
2)On souhaite exploiter le tableau ci-dessus pour réaliser une fonction,nommée conv,qui permet de traduire la valeur du port
(PORTD ou PORTC) en numéro du position de SW.
-La configuration des ports E/S et la déclaration des variables sont supposées faites dans le programme principale (page4)
. a)Completer l’algorigramme de la fonctionconv b) traduire cette
c) fonction en PICC
-la fonction reçoit la valeur du port dans var1 et fonction en //return de la position
écrit la position dans W assembleur int8 conv( int8 port)
;var1 contient la {
DEBUT valeur du port Switch(port)
; W récupère la {
position Case 0: return 0; break;
W=0 conv : Case 1: return 1; break;
Var1=0 movlw 0 test8 Case 2: return 2; break;
subwf var1,w Case 4: return 3; break;
movlw 8
BTFSS STATUS,Z
VAR1=1 W=1 MOVLW 0 subwf var1,w Case 8: return 4; break;
RETURN BTFSS STATUS,Z Case 0x10: return 5; break;
GOTO test0x10 Case 0x20: return 6; break;
VAR1=2 W=2 test1 MOVLW 4 Case 0x40: return 7; break;
movlw 1 RETURN Case 0x80: return 8; break;
subwf var1,w DEFAULT: RETURN 0;
VAR1=4 W=3 BTFSS STATUS,Z Test0x10 BREAK;
GOTO test2 Test0x20
MOVLW 1 Test0x40 }
VAR1=8 W=4 RETURN
Test0x80 }
test2
W=5 movlw 2 movlw 0x8
VAR1=0x10
subwf var1,w subwf var1,w
BTFSS STATUS,Z BTFSS STATUS,Z }
W=6 GOTO test4 GOTO fin
VAR1=0x20
MOVLW 2 MOVLW 8
RETURN RETURN
VAR1=0x40
W=7 test4 Fin
movlw 4
MOVLW 0
subwf var1,w
VAR1=0x80 BTFSS STATUS,Z RETURN
W=8 GOTO test8
MOVLW 3
RETURN
FIN
2) Donner le programme principal en C et Assmebleur
3)
#include <[Link]> PICC
Org 0 #BYTE PORTA=5
DEBUT BSF STATUS,RP0 #BYTE PORTB=6
BCF STATUS,RP1 #BYTE PORTC=7
Configurer CLRF TRISB #BYTE PORTD=8
PORTB en sortie MOVLW 0XFF ; W=0XFF #BYTE TRISA=0x85
PORTC en entrée MOVWF TRISC ; TRISC=W .
PORTD en entrée MOVWF TRISD #BYTE TRISD=0x88
PORTA en entrée MOVWF TRISA #BIT RA0=PORTA.0
BCF STATUS,RP0 # BIT RA1=PORTA.1
BCF STATUS,RP1 MAIN()
{
(RA0=1) DEBUT TRISB=0;
TRISC=TRISD=TRISA=0xff ;
oui BTFSS PORTA,0
Goto suivant ;(non) //While(true)
PORTB = Movfw PORTC {
conv(PORTC)+conv(PORTD) Movwf var1 debut:
CALL conv ; => positionSW1 dans If(PORTA==0b00000001)
W //If(RA0==1)
MOVWF var2 ; {
Movfw PORTD PORTB=conv(PORTC)+conv(PORTD) ;
(RA1=1) Movwf var1 }
CALL conv ; => positionSW2 dans
oui W
PORTB = Addwf var2,w ; W= W+var2
conv(PORTC)-conv(PORTD) MOVWF PORTB
suivant
BTFSS PORTA,1 IF(PORTA==0b00000010)
Movfw PORTC //IF(RA1==1)
FIN Movwf var1 {
CALL conv ; => positionSW1 dans W PORTB=conv(PORTC)-conv(PORTD) ;
MOVWF var2 ; }
Movfw PORTD //Goto debut;
Movwf var1 }
CALL conv ; => positionSW2 dans W
SUBWF var2,w ; W= var2-W }
MOVWF PORTB
GOTO DEBUT

END

III/ TRADUIRE EN LANGAGE ASM ET PICC l’algorigramme ci-dessous


Asm PICC
Configurer var1 EQU 0X20 INT VAR1,VAR2;
[RB7..RB4](in) et [RB3…RB0](out) var2 EQU 0X21 MAIN()
PORTA (out) Org 0 {
BSF STATUS,RP0 TRISB=0b11110000;
BCF STATUS,RP1 TRISA=0;
MOVLW 0XF0
MOVWF TRISB
CLRF TRISA
BCF STATUS,RP0
PORTA = 0 CLRF PORTA PORTA=0 ;
1 var1=1 (var1 est une variable ) MOVLW 1 Var1=1 ;
MOVWF var1
2 PORTB=var1 Movfw var1 PORTB=var1 ;
Movwf PORTB
var2 = PORTB (var2 est une variable ) Movfw PORTB Var2=PORTB;
-Mettre le MSB du PORTB dans le LSB movwf var2
du W Swapf PORTB,w swap var2;
-masquer le poids fort de W var2= var2&0x0F;
W= [0000 RB7…RB4] andlw 0x0F
-STOCKER W dans var2 (var2=W) movwf var2
SUBLW 0 If(var2!=0)
NON
Goto saut3 BTFSS STATUS,Z Goto saut3
W=0
GOTO saut3
Oui

-mettre le bit Carry à zéro BSF STATUS,C


-rotate left de var1 RLF var1 VAR1 = (VAR1 <<1);
BTFSS var1,4 If( (var1&0b00010000)!=0)
non
(var1,4)=0 Saut1 GOTO saut1 Goto saut1

Oui
MOVLW 0 While(PORTB==0);
3 retour
PORTB=0
Subwf PORTB,w
Oui
BTFSS STATUS,Z
GOTO retour
MOVLW 0x11 switch(PORTB)
Oui SUBWF PORTB,w {
PORTB =0x11 BTFSS STATUS,Z Case 0x11: PORTA=1;break;
PORTA=1 GOTO test12
non goto saut2
Movlw 1
Movwf PORTA
GOTO saut2
test12 Case 0x12: PORTA=2;break;
Oui
PORTB =0x12 MOVLW 0x12
PORTA=2 SUBWF PORTB,w
goto saut2 BTFSS STATUS,Z
GOTO test14
Movlw 2
Movwf PORTA
GOTO saut2

test14 Case 0x14: PORTA=3;break;


PORTB =0x14
MOVLW 0x14
SUBWF PORTB,w
BTFSS STATUS,Z
GOTO test18
Movlw 3
Movwf PORTA
GOTO saut2
test18 Case 0x18: PORTA=4;break;
PORTB =0x18 MOVLW 0x21
PORTA=4 SUBWF PORTB,w
goto 2 BTFSS STATUS,Z
GOTO test22
Movlw 4
Movwf PORTA
GOTO saut2
La suite des tests : 0x21,0x22,0x24,0x28 Case 0x21: PORTA=5;break;
0x41,0x42,0x44,0x48 Case 0x22: PORTA=6;break;
0x81,0x82,0x84,0x88 Case 0x24: PORTA=7;break;
Case 0x28: PORTA=8;break;
Case 0x31: PORTA=9;break;
Case 0x32: PORTA=10;break;
GOTO saut2 Case 0x34: PORTA=11;break;
Case 0x38: PORTA=12;break;
END Case 0x41: PORTA=13;break;
Case 0x42: PORTA=14;break;
Case 0x44: PORTA=15;break;
Case 0x48: PORTA=16;break;
DAFAULT:PORTA=0;
}

Vous aimerez peut-être aussi