Compare commits
2 commits
2d6f3613b2
...
902ec65f1a
Author | SHA1 | Date | |
---|---|---|---|
Geoffrey Frogeye | 902ec65f1a | ||
Geoffrey Frogeye | c7695e6e75 |
|
@ -1,5 +1,5 @@
|
|||
# Compte-rendu TP1
|
||||
## DJERABA Taky PREUD'HOMME Geoffrey
|
||||
# Compte-rendu TP1 Microprocesseurs
|
||||
## DJERABA Taky PREUD'HOMME Geoffrey (IMA3 TP2)
|
||||
|
||||
Ce TP est une introduction à la programmation de l'ATMEGA 2560 et à la simulation du microcontrôleur tout en rappelant les bases de la programmation en assembleur AVR8.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Compte-rendu TP1
|
||||
## DJERABA Taky PREUD'HOMME Geoffrey
|
||||
# Compte-rendu TP2 Microprocesseurs
|
||||
## DJERABA Taky PREUD'HOMME Geoffrey (IMA3 TP2)
|
||||
|
||||
Ce TP a pour but de nous familiariser avec la gestion des interruptions et du watchdog sur l'Atmega 2560.
|
||||
|
||||
|
|
26
TP2/TP22.asm
26
TP2/TP22.asm
|
@ -1,4 +1,4 @@
|
|||
.equ PINA = 0x00
|
||||
.equ PINA = 0x00
|
||||
.equ DDRA = 0x01
|
||||
.equ PORTA = 0x02
|
||||
.equ PINC = 0x06
|
||||
|
@ -49,8 +49,8 @@ debut:
|
|||
LDI R16,0
|
||||
STS d0,R16
|
||||
|
||||
; select <- 0x01
|
||||
LDI R16,0x01
|
||||
; select <- 0b00100000
|
||||
LDI R16,0b00100000
|
||||
STS select,R16
|
||||
|
||||
|
||||
|
@ -179,10 +179,10 @@ tm:
|
|||
LDS R16,select
|
||||
OUT PortC,R16
|
||||
|
||||
; si select = 0x80 alors PortA@IO <- afficheur@ROM[d0]
|
||||
; si select = 0b10000000 alors PortA@IO <- afficheur@ROM[d2]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0x80
|
||||
LDI R16,0b10000000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti9
|
||||
|
@ -193,7 +193,7 @@ eti9:
|
|||
eti10:
|
||||
TST R16
|
||||
BREQ eti11
|
||||
LDS R16,d0
|
||||
LDS R16,d2
|
||||
LDI R30,low(afficheur<<1)
|
||||
LDI R31,high(afficheur<<1)
|
||||
CLR R17
|
||||
|
@ -203,10 +203,10 @@ eti10:
|
|||
OUT PortA,R16
|
||||
eti11:
|
||||
|
||||
; si select = 0x40 alors PortA@IO <- afficheur@ROM[d1]
|
||||
; si select = 0b01000000 alors PortA@IO <- afficheur@ROM[d1]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0x40
|
||||
LDI R16,0b01000000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti12
|
||||
|
@ -227,10 +227,10 @@ eti13:
|
|||
OUT PortA,R16
|
||||
eti14:
|
||||
|
||||
; si select = 0x20 alors PortA@IO <- afficheur@ROM[d2]
|
||||
; si select = 0b00100000 alors PortA@IO <- afficheur@ROM[d0]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0x20
|
||||
LDI R16,0b00100000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti15
|
||||
|
@ -241,7 +241,7 @@ eti15:
|
|||
eti16:
|
||||
TST R16
|
||||
BREQ eti17
|
||||
LDS R16,d2
|
||||
LDS R16,d0
|
||||
LDI R30,low(afficheur<<1)
|
||||
LDI R31,high(afficheur<<1)
|
||||
CLR R17
|
||||
|
@ -252,7 +252,7 @@ eti16:
|
|||
eti17:
|
||||
|
||||
lsl select
|
||||
; si select = 0 alors select <- 0x20
|
||||
; si select = 0 alors select <- 0b00100000
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0
|
||||
|
@ -266,7 +266,7 @@ eti18:
|
|||
eti19:
|
||||
TST R16
|
||||
BREQ eti20
|
||||
LDI R16,0x20
|
||||
LDI R16,0b00100000
|
||||
STS select,R16
|
||||
eti20:
|
||||
|
||||
|
|
12
TP2/TP22.txt
12
TP2/TP22.txt
|
@ -1,4 +1,4 @@
|
|||
.equ PINA = 0x00
|
||||
.equ PINA = 0x00
|
||||
.equ DDRA = 0x01
|
||||
.equ PORTA = 0x02
|
||||
.equ PINC = 0x06
|
||||
|
@ -40,7 +40,7 @@ debut:
|
|||
d2 <- 0
|
||||
d1 <- 0
|
||||
d0 <- 0
|
||||
select <- 0x01
|
||||
select <- 0b00100000
|
||||
|
||||
cli
|
||||
; Configuration des ports
|
||||
|
@ -81,9 +81,9 @@ affichage:
|
|||
|
||||
tm:
|
||||
PortC@IO <- select
|
||||
si select = 0x80 alors PortA@IO <- afficheur@ROM[d0]
|
||||
si select = 0x40 alors PortA@IO <- afficheur@ROM[d1]
|
||||
si select = 0x20 alors PortA@IO <- afficheur@ROM[d2]
|
||||
si select = 0b10000000 alors PortA@IO <- afficheur@ROM[d2]
|
||||
si select = 0b01000000 alors PortA@IO <- afficheur@ROM[d1]
|
||||
si select = 0b00100000 alors PortA@IO <- afficheur@ROM[d0]
|
||||
lsl select
|
||||
si select = 0 alors select <- 0x20
|
||||
si select = 0 alors select <- 0b00100000
|
||||
reti
|
||||
|
|
274
TP2/TP22b.asm
274
TP2/TP22b.asm
|
@ -1,274 +0,0 @@
|
|||
.equ PINA = 0x00
|
||||
.equ DDRA = 0x01
|
||||
.equ PORTA = 0x02
|
||||
.equ PINC = 0x06
|
||||
.equ DDRC = 0x07
|
||||
.equ PORTC = 0x08
|
||||
|
||||
.equ WDTCSR = 0x60
|
||||
.equ TCCR0A = 0x24
|
||||
.equ TCCR0B = 0x25
|
||||
.equ TIMSK0 = 0x6E
|
||||
.equ TIFR0 = 0x35
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.def d2 = r19
|
||||
.def d1 = r20
|
||||
.def d0 = r21
|
||||
.def select = r22
|
||||
|
||||
.org 0x000
|
||||
; Vecteur RESET
|
||||
jmp debut
|
||||
|
||||
.org 0x0018 ; Interruption du watchdog
|
||||
jmp wd
|
||||
|
||||
.org 0x002E ; Interruption du timer
|
||||
jmp tm
|
||||
|
||||
.org 0x0080
|
||||
|
||||
afficheur:
|
||||
.DB 0x7E, 0x0C, 0x37, 0x9F, 0x4D, 0xDB, 0xFB, 0x0E, 0xFF, 0xDF
|
||||
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
debut:
|
||||
; d2 <- 0
|
||||
LDI R16,0
|
||||
STS d2,R16
|
||||
|
||||
; d1 <- 0
|
||||
LDI R16,0
|
||||
STS d1,R16
|
||||
|
||||
; d0 <- 0
|
||||
LDI R16,0
|
||||
STS d0,R16
|
||||
|
||||
; select <- 0b00100000
|
||||
LDI R16,0b00100000
|
||||
STS select,R16
|
||||
|
||||
|
||||
cli
|
||||
; Configuration des ports
|
||||
; DDRA@IO <- 0xFF
|
||||
LDI R16,0xFF
|
||||
OUT DDRA,R16
|
||||
|
||||
; DDRC@IO <- 0xFF
|
||||
LDI R16,0xFF
|
||||
OUT DDRC,R16
|
||||
|
||||
|
||||
; Watchdog toutes les secondes
|
||||
; WDTCSR <- 0x10
|
||||
LDI R16,0x10
|
||||
STS WDTCSR,R16
|
||||
|
||||
; WDTCSR <- 0b01000110
|
||||
LDI R16,0b01000110
|
||||
STS WDTCSR,R16
|
||||
|
||||
|
||||
; Timer toutes les 2 ms
|
||||
; TCCR0A@IO <- 0x00
|
||||
LDI R16,0x00
|
||||
OUT TCCR0A,R16
|
||||
|
||||
; TCCR0B@IO <- 0x04
|
||||
LDI R16,0x04
|
||||
OUT TCCR0B,R16
|
||||
|
||||
; TIMSK0 <- 0x01
|
||||
LDI R16,0x01
|
||||
STS TIMSK0,R16
|
||||
|
||||
; TIFR0 <- 0x01
|
||||
LDI R16,0x01
|
||||
STS TIFR0,R16
|
||||
|
||||
sei
|
||||
|
||||
boucle:
|
||||
sleep
|
||||
; jump boucle
|
||||
JMP boucle
|
||||
|
||||
|
||||
wd:
|
||||
inc d0
|
||||
; si d0 < 10 saut affichage
|
||||
LDS R16,d0
|
||||
PUSH R16
|
||||
LDI R16,10
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BRLO eti0
|
||||
CLR R16
|
||||
RJMP eti1
|
||||
eti0:
|
||||
LDI R16,0x01
|
||||
eti1:
|
||||
TST R16
|
||||
BREQ eti2
|
||||
JMP affichage
|
||||
eti2:
|
||||
|
||||
; d0 <- 0
|
||||
LDI R16,0
|
||||
STS d0,R16
|
||||
|
||||
inc d1
|
||||
; si d1 < 10 saut affichage
|
||||
LDS R16,d1
|
||||
PUSH R16
|
||||
LDI R16,10
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BRLO eti3
|
||||
CLR R16
|
||||
RJMP eti4
|
||||
eti3:
|
||||
LDI R16,0x01
|
||||
eti4:
|
||||
TST R16
|
||||
BREQ eti5
|
||||
JMP affichage
|
||||
eti5:
|
||||
|
||||
; d1 <- 0
|
||||
LDI R16,0
|
||||
STS d1,R16
|
||||
|
||||
inc d2
|
||||
; si d2 < 10 saut affichage
|
||||
LDS R16,d2
|
||||
PUSH R16
|
||||
LDI R16,10
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BRLO eti6
|
||||
CLR R16
|
||||
RJMP eti7
|
||||
eti6:
|
||||
LDI R16,0x01
|
||||
eti7:
|
||||
TST R16
|
||||
BREQ eti8
|
||||
JMP affichage
|
||||
eti8:
|
||||
|
||||
; d2 <- 0
|
||||
LDI R16,0
|
||||
STS d2,R16
|
||||
|
||||
affichage:
|
||||
; Affichage Simulateur
|
||||
; PORTC@IO <- afficheur@ROM[d0]
|
||||
; PORTB@IO <- afficheur@ROM[d1]
|
||||
; PORTA@IO <- afficheur@ROM[d2]
|
||||
reti
|
||||
|
||||
tm:
|
||||
; PortC@IO <- select
|
||||
LDS R16,select
|
||||
OUT PortC,R16
|
||||
|
||||
; si select = 0b10000000 alors PortA@IO <- afficheur@ROM[d2]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0b10000000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti9
|
||||
CLR R16
|
||||
RJMP eti10
|
||||
eti9:
|
||||
LDI R16,0x01
|
||||
eti10:
|
||||
TST R16
|
||||
BREQ eti11
|
||||
LDS R16,d2
|
||||
LDI R30,low(afficheur<<1)
|
||||
LDI R31,high(afficheur<<1)
|
||||
CLR R17
|
||||
ADD R30,R16
|
||||
ADC R31,R17
|
||||
LPM R16,Z
|
||||
OUT PortA,R16
|
||||
eti11:
|
||||
|
||||
; si select = 0b01000000 alors PortA@IO <- afficheur@ROM[d1]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0b01000000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti12
|
||||
CLR R16
|
||||
RJMP eti13
|
||||
eti12:
|
||||
LDI R16,0x01
|
||||
eti13:
|
||||
TST R16
|
||||
BREQ eti14
|
||||
LDS R16,d1
|
||||
LDI R30,low(afficheur<<1)
|
||||
LDI R31,high(afficheur<<1)
|
||||
CLR R17
|
||||
ADD R30,R16
|
||||
ADC R31,R17
|
||||
LPM R16,Z
|
||||
OUT PortA,R16
|
||||
eti14:
|
||||
|
||||
; si select = 0b00100000 alors PortA@IO <- afficheur@ROM[d0]
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0b00100000
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti15
|
||||
CLR R16
|
||||
RJMP eti16
|
||||
eti15:
|
||||
LDI R16,0x01
|
||||
eti16:
|
||||
TST R16
|
||||
BREQ eti17
|
||||
LDS R16,d0
|
||||
LDI R30,low(afficheur<<1)
|
||||
LDI R31,high(afficheur<<1)
|
||||
CLR R17
|
||||
ADD R30,R16
|
||||
ADC R31,R17
|
||||
LPM R16,Z
|
||||
OUT PortA,R16
|
||||
eti17:
|
||||
|
||||
lsl select
|
||||
; si select = 0 alors select <- 0b00100000
|
||||
LDS R16,select
|
||||
PUSH R16
|
||||
LDI R16,0
|
||||
POP R17
|
||||
CP R17,R16
|
||||
BREQ eti18
|
||||
CLR R16
|
||||
RJMP eti19
|
||||
eti18:
|
||||
LDI R16,0x01
|
||||
eti19:
|
||||
TST R16
|
||||
BREQ eti20
|
||||
LDI R16,0b00100000
|
||||
STS select,R16
|
||||
eti20:
|
||||
|
||||
reti
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
.equ PINA = 0x00
|
||||
.equ DDRA = 0x01
|
||||
.equ PORTA = 0x02
|
||||
.equ PINC = 0x06
|
||||
.equ DDRC = 0x07
|
||||
.equ PORTC = 0x08
|
||||
|
||||
.equ WDTCSR = 0x60
|
||||
.equ TCCR0A = 0x24
|
||||
.equ TCCR0B = 0x25
|
||||
.equ TIMSK0 = 0x6E
|
||||
.equ TIFR0 = 0x35
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.def d2 = r19
|
||||
.def d1 = r20
|
||||
.def d0 = r21
|
||||
.def select = r22
|
||||
|
||||
.org 0x000
|
||||
; Vecteur RESET
|
||||
jmp debut
|
||||
|
||||
.org 0x0018 ; Interruption du watchdog
|
||||
jmp wd
|
||||
|
||||
.org 0x002E ; Interruption du timer
|
||||
jmp tm
|
||||
|
||||
.org 0x0080
|
||||
|
||||
afficheur:
|
||||
.DB 0x7E, 0x0C, 0x37, 0x9F, 0x4D, 0xDB, 0xFB, 0x0E, 0xFF, 0xDF
|
||||
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
debut:
|
||||
d2 <- 0
|
||||
d1 <- 0
|
||||
d0 <- 0
|
||||
select <- 0b00100000
|
||||
|
||||
cli
|
||||
; Configuration des ports
|
||||
DDRA@IO <- 0xFF
|
||||
DDRC@IO <- 0xFF
|
||||
|
||||
; Watchdog toutes les secondes
|
||||
WDTCSR <- 0x10
|
||||
WDTCSR <- 0b01000110
|
||||
|
||||
; Timer toutes les 2 ms
|
||||
TCCR0A@IO <- 0x00
|
||||
TCCR0B@IO <- 0x04
|
||||
TIMSK0 <- 0x01
|
||||
TIFR0 <- 0x01
|
||||
sei
|
||||
|
||||
boucle:
|
||||
sleep
|
||||
jump boucle
|
||||
|
||||
wd:
|
||||
inc d0
|
||||
si d0 < 10 saut affichage
|
||||
d0 <- 0
|
||||
inc d1
|
||||
si d1 < 10 saut affichage
|
||||
d1 <- 0
|
||||
inc d2
|
||||
si d2 < 10 saut affichage
|
||||
d2 <- 0
|
||||
affichage:
|
||||
; Affichage Simulateur
|
||||
; PORTC@IO <- afficheur@ROM[d0]
|
||||
; PORTB@IO <- afficheur@ROM[d1]
|
||||
; PORTA@IO <- afficheur@ROM[d2]
|
||||
reti
|
||||
|
||||
tm:
|
||||
PortC@IO <- select
|
||||
si select = 0b10000000 alors PortA@IO <- afficheur@ROM[d2]
|
||||
si select = 0b01000000 alors PortA@IO <- afficheur@ROM[d1]
|
||||
si select = 0b00100000 alors PortA@IO <- afficheur@ROM[d0]
|
||||
lsl select
|
||||
si select = 0 alors select <- 0b00100000
|
||||
reti
|
125
TP2/a
125
TP2/a
|
@ -1,125 +0,0 @@
|
|||
.equ PINA = 0x00 ; définition des adresses des ports
|
||||
.equ DDRA = 0x01
|
||||
.equ PORTA = 0x02
|
||||
.equ PIND = 0x09
|
||||
.equ DDRD = 0x0A
|
||||
.equ PORTD = 0x0B
|
||||
|
||||
.equ WDTCSR = 0x60
|
||||
|
||||
.equ EIMSK = 0x3D
|
||||
.equ EICRA = 0x69
|
||||
.equ EICRB = 0x6A
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.def d1 = r20
|
||||
.def d0 = r21
|
||||
.def route = r22
|
||||
|
||||
.org 0x000
|
||||
; Vecteur RESET
|
||||
jmp debut
|
||||
|
||||
.org 0x0002
|
||||
jmp b10s
|
||||
|
||||
.org 0x0004
|
||||
jmp b1s
|
||||
|
||||
.org 0x0006
|
||||
jmp marche
|
||||
|
||||
.org 0x0008
|
||||
jmp arret
|
||||
|
||||
.org 0x0018
|
||||
jmp wd
|
||||
|
||||
.org 0x0080
|
||||
|
||||
afficheur:
|
||||
.DB 0x7E, 0x0C, 0x37, 0x9F, 0x4D, 0xDB, 0xFB, 0x0E, 0xFF, 0xDF
|
||||
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
debut:
|
||||
d1 <- 0 ; Digit dizaines
|
||||
d0 <- 0 ; Digit unités
|
||||
route <- 0 ; 1 : Four en marche, 0 : Four à l'arrêt
|
||||
|
||||
cli
|
||||
|
||||
; Configuration des ports
|
||||
DDRA@IO <- 0xFF
|
||||
DDRB@IO <- 0xFF
|
||||
DDRD@IO <- 0x80
|
||||
|
||||
; Interruptions
|
||||
EIMSK <- 0b00001111 ; On active les interruptions PD[3:0] sur front descendant
|
||||
EICRA <- 0b10101010
|
||||
EICRB <- 0b00000000
|
||||
|
||||
; Watchdog toutes les secondes
|
||||
WDTCSR <- 0x10
|
||||
WDTCSR <- 0b01000110
|
||||
|
||||
sei
|
||||
|
||||
call affiche
|
||||
|
||||
boucle:
|
||||
sleep ; Le programme ne fonctionne que sur interruption
|
||||
jump boucle
|
||||
|
||||
b1s: ; Bouton +1 seconde
|
||||
inc d0 ; Incrémente le chiffre des unités
|
||||
si d0 < 10 saut finb1s ; Si il reste inférieur à 10, on affiche juste
|
||||
d0 <- 0 ; Sinon, on le remet à 0 et on fait comme si on avait appuyé sur le bouton +10 secondes
|
||||
jump b10s
|
||||
finb1s:
|
||||
call affiche
|
||||
reti
|
||||
|
||||
b10s: ; Bouton +10 secondes
|
||||
inc d1 ; On incrémente le chiffre des dizaines
|
||||
si d1 < 10 saut finb10s ; Si il reste inférieur à 10, on affiche juste
|
||||
d0 <- 9 ; Sinon, on bloque à 99
|
||||
d1 <- 9
|
||||
finb10s:
|
||||
call affiche
|
||||
reti
|
||||
|
||||
affiche:
|
||||
PORTA@IO <- afficheur@ROM[d1]
|
||||
PORTB@IO <- afficheur@ROM[d0]
|
||||
ret
|
||||
|
||||
marche: ; Bouton marche
|
||||
route <- 1 ; Met la minuterie en route
|
||||
PORTD@IO <- 0x80
|
||||
reti
|
||||
|
||||
arret: ; Bouton annuler
|
||||
route <- 0 ; Remet tout dans sa position d'origine
|
||||
d0 <- 0
|
||||
d1 <- 0
|
||||
call affiche
|
||||
reti
|
||||
|
||||
wd:
|
||||
si route = 0 saut finwd ; Si on est pas en route, ne rien faire
|
||||
dec d0 ; Si on est en route, décrémenter le compteur
|
||||
si d0 < 10 saut prefinwd ; Si le chiffre des unités était strictement supérieur à 0, juste actualiser l'affichage
|
||||
d0 <- 9 ; Si le chiffre des unités était à 0, il passe à 9 et on décrémente celui des dizaines
|
||||
dec d1
|
||||
si d1 < 10 saut prefinwd ; Si le chiffre des dizaines était strictement supérieur à 0, juste actualiser l'affichage
|
||||
route <- 0 ; Sinon, c'est qu'on était à 00, donc il faut éteindre le four
|
||||
PORTD@IO <- 0x00
|
||||
d0 <- 0 ; On remet à 00 (avant ces lignes d0 = 9 et d1 = 255)
|
||||
d1 <- 0
|
||||
prefinwd:
|
||||
call affiche
|
||||
finwd:
|
||||
reti
|
20
TP3/Makefile
Normal file
20
TP3/Makefile
Normal file
|
@ -0,0 +1,20 @@
|
|||
.PHONY: default cleantmp clean
|
||||
|
||||
default: $(subst md,pdf,$(wildcard *.md))
|
||||
|
||||
SOURCES=$(wildcard *.asm) $(wildcard *.txt)
|
||||
|
||||
%.pdf: %.html
|
||||
html2pdf -i "$<" -o "$@" -t "$* - REVIRON Athur PREUD'HOMME Geoffrey"
|
||||
|
||||
%.html: %.tmp ../template.html
|
||||
md2html -i "$<" -o "$@" -t ../template.html
|
||||
|
||||
%.tmp: %.md $(SOURCES)
|
||||
markedpp "$<" > "$@"
|
||||
|
||||
cleantmp:
|
||||
rm -rf $(subst md,html,$(wildcard *.md)) *.tmp
|
||||
|
||||
clean: cleantmp
|
||||
rm -rf $(subst md,pdf,$(wildcard *.md))
|
35
TP3/TP3.md
Normal file
35
TP3/TP3.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
# Compte-rendu TP3 Microprocesseurs
|
||||
## REVIRON Arthur PREUD'HOMME Geoffrey (IMA3 TP2)
|
||||
|
||||
Avec ce TP nous allons pouvoir nous familiariser avec le convertisseur analogique-numérique (ou ADC).
|
||||
|
||||
# Prise en main de l'interface ADC (TP30)
|
||||
|
||||
Les deux programmes permettent d'afficher en continu les valeurs entrées sur ADC0 sur l'afficheur 7-segments situé PortA. Les conversions sont déclenchées à la suite (free running mode). Le premier programme utilise cependant une scrutation et ne se préoccupe pas de savoir si la conversion est terminée. Le deuxième programme déclenche une interruption pour chaque conversion terminée, et l'afficheur n'est mis à jour qu'à ce moment là, ce qui évite de gaspiller des ressources inutilement et évite aussi de récupérer des valeurs fausses dûes à une conversion pas totalement terminée (ce qui dans ce cas ne change quelque chose que pour la première scrutation).
|
||||
|
||||
!include(TP30b.txt lang=avrasmplus)
|
||||
|
||||
# Capteur de température (TP31)
|
||||
|
||||
Il est ici question d'utiliser un convertisseur analogique-numérique pour récupérer les valeurs d'une sonde de température pour l'afficheur dans un résultat plus lisible.
|
||||
|
||||
On réutilisera la même configuration que pour le deuxième programme du TP30, cependant l'affichage va varier un peu. En effet, on veut transformer la valeur reçue de l'ADC sur [0, 255] en valeur sur [0, 32]. Pour cela, on divise d'abord la valeur par $\frac{255}{32}\approx 8$. Puis on affiche les dizaines sur le premier afficheur et les unités sur le deuxième.
|
||||
|
||||
!include(TP31.txt lang=avrasmplus)
|
||||
|
||||
# Capteur de distance (TP32)
|
||||
|
||||
Il est demandé d'afficher la tension fournie par le capteur infrarouge situé sur la maquette. Ne connaissant pas au préalable l'équivalence entre la tension fournie et la distance en cm, on affichera la valeur de la tension sur le plus grand intervalle possible qui est de [0, 255]. On aurait en réalité pu utiliser les 10 bits de précision que nous fournit l'ADC, mais en voyant qu'avec 8 on on obtient beaucoup de bruit nous n'avons pas jugé cela nécessaire.
|
||||
|
||||
On réutilise donc le code du TP22 nous permettant d'afficher un nombre différent sur les 3 afficheurs 7-segments disponible sur la carte. Pour rappel, cet afficheur utilise 4 registres, nommé `d2`, `d1`, `d0` et `select`. Les trois premiers correspondent au chiffre à afficher pour chacun des 3 afficheurs. `select` contient quant à lui l'état du port C nécessaire pour afficher un des trois digits. On configure le timer pour qu'il effectue une interruption toutes les 2 ms, dans laquelle il décale `select` afin de sélectionner un autre afficheur et envoie la représentation du digit correspondant sur le port A.
|
||||
|
||||
!include(TP32.txt lang=avrasmplus)
|
||||
|
||||
![Visualisation du capteur de distance](capteur_distance.svg)
|
||||
|
||||
Le capteur semble décroitre exponentiellement au fur et à mesure qu'on éloigne un obstacle de devant lui. Cependant, on remarque que si l'obstacle se rapproche trop, le capteur considère qu'il s'éloigne. Il a donc un intervalle de fonctionnement assez faible.
|
||||
|
||||
# Régulateur pour chauffage central (TP33)
|
||||
|
||||
Nous allons réaliser une application concrète de l'utilisation de l'ADC en construisant un régulateur pour chauffage central. La difficulté sera ici de lire deux entrées d'ADC en alternance : il n'est donc pas possible d'utiliser le free-running mode que nous avons utilisé jusqu'ici. Le micro-contrôleur nous propose nativement de pouvoir comparer électriquement deux entrées d'ADC pour n'avoir à traiter qu'un seul résultat, cependant nous ne pourrons pas l'utiliser dans ce cas là car les deux entrées analogiques ne sont pas sur la même échelle (la première est sur [10, 26]°C, la deuxième est sur [0, 32]°C).
|
||||
|
|
@ -3,45 +3,39 @@
|
|||
.equ PORTA = 0x02
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPH = 0x3E
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.equ SREG = 0x3F
|
||||
|
||||
.equ ADMUX = 0x7C
|
||||
|
||||
.equ ADCSRB = 0x7B
|
||||
.equ ADCSRA = 0x7A
|
||||
.equ ADCH = 0x79
|
||||
.equ ADCL = 0x78
|
||||
|
||||
.org 0x000
|
||||
; Vecteur RESET
|
||||
.org 0x000 ; Vecteur RESET
|
||||
jmp debut
|
||||
|
||||
.org 0x003A
|
||||
.org 0x003A ; Interruption conversion ADC terminée
|
||||
jmp irqadc
|
||||
|
||||
.org 0x0080
|
||||
|
||||
codeAff:
|
||||
|
||||
.db 0b1111110, 0b001100
|
||||
.db 0b0110111, 0b0011111
|
||||
.db 0b1001101, 0b1011011
|
||||
.db 0b1111011, 0b0001110
|
||||
.db 0b1111111, 0b1011111
|
||||
codeAff: ; Représentation des chiffres sur l'afficheur 7-segments
|
||||
.db 0b1111110, 0b001100, 0b0110111, 0b0011111, 0b1001101, 0b1011011, 0b1111011, 0b0001110, 0b1111111, 0b1011111
|
||||
|
||||
debut:
|
||||
; Intialisation de la pile
|
||||
ldi r28, low(RAMEND)
|
||||
ldi r29, high(RAMEND)
|
||||
|
||||
out SPL, r28
|
||||
out SPH, r29
|
||||
|
||||
DDRA@IO <- 0xFF
|
||||
ADMUX <- 0b01100000
|
||||
ADCSRB <- 0b00000000
|
||||
ADCSRA <- 0b11101111
|
||||
DDRA@IO <- 0xFF ; Port A (afficheur 7-segments) en sortie
|
||||
ADMUX <- 0b01100000 ; Sélection de l'ADC0
|
||||
ADCSRB <- 0b00000000 ; Free running mode
|
||||
ADCSRA <- 0b11101111 ; Activation des interruptions
|
||||
|
||||
sei
|
||||
|
||||
|
@ -49,11 +43,10 @@ boucle:
|
|||
sleep
|
||||
jmp boucle
|
||||
|
||||
irqadc:
|
||||
PORTA@IO <- codeAff@ROM[ADCH/27]
|
||||
irqadc: ; Dès qu'une lecture est terminée, l'afficher sur l'afficheur
|
||||
PORTA@IO <- codeAff@ROM[ADCH/51] ; On passe d'une valeur sur [0, 255] à [0, 5]
|
||||
reti
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
25
TP3/TP31.txt
25
TP3/TP31.txt
|
@ -6,12 +6,12 @@
|
|||
.equ PORTB = 0x05
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPH = 0x3E
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.equ SREG = 0x3F
|
||||
|
||||
.equ ADMUX = 0x7C
|
||||
|
||||
.equ ADCSRB = 0x7B
|
||||
.equ ADCSRA = 0x7A
|
||||
.equ ADCH = 0x79
|
||||
|
@ -28,13 +28,8 @@
|
|||
|
||||
.org 0x0080
|
||||
|
||||
codeAff:
|
||||
|
||||
.db 0b1111110, 0b001100
|
||||
.db 0b0110111, 0b0011111
|
||||
.db 0b1001101, 0b1011011
|
||||
.db 0b1111011, 0b0001110
|
||||
.db 0b1111111, 0b1011111
|
||||
codeAff: ; Représentation des chiffres sur l'afficheur 7-segments
|
||||
.db 0b1111110, 0b001100, 0b0110111, 0b0011111, 0b1001101, 0b1011011, 0b1111011, 0b0001110, 0b1111111, 0b1011111
|
||||
|
||||
debut:
|
||||
ldi r28, low(RAMEND)
|
||||
|
@ -43,11 +38,11 @@ debut:
|
|||
out SPL, r28
|
||||
out SPH, r29
|
||||
|
||||
DDRA@IO <- 0xFF
|
||||
DDRB@IO <- 0xFF
|
||||
ADMUX <- 0b01100000
|
||||
ADCSRB <- 0b00000000
|
||||
ADCSRA <- 0b11101111
|
||||
DDRA@IO <- 0xFF ; Port A (afficheur 7-segments) en sortie
|
||||
DDRB@IO <- 0xFF ; Port B (afficheur 7-segments) en sortie
|
||||
ADMUX <- 0b01100000 ; Sélection de l'ADC0
|
||||
ADCSRB <- 0b00000000 ; Free running mode
|
||||
ADCSRA <- 0b11101111 ; Activation des interruptions
|
||||
|
||||
sei
|
||||
|
||||
|
@ -58,7 +53,7 @@ boucle:
|
|||
irqadc:
|
||||
temp <- ADCH / 8
|
||||
PORTA@IO <- codeAff@ROM[temp/10]
|
||||
PORTB@IO <- codeAff@ROM[temp-(temp/10)*10]
|
||||
PORTB@IO <- codeAff@ROM[temp-(temp/10)*10] ; temp%10
|
||||
reti
|
||||
|
||||
|
||||
|
|
21
TP3/TP32.txt
21
TP3/TP32.txt
|
@ -6,8 +6,9 @@
|
|||
.equ PORTC = 0x08
|
||||
|
||||
.equ RAMEND = 0x21FF
|
||||
.equ SPH = 0x3E ; initialisation de la pile
|
||||
.equ SPH = 0x3E
|
||||
.equ SPL = 0x3D
|
||||
|
||||
.equ SREG = 0x3F
|
||||
|
||||
.equ TCCR0A = 0x24
|
||||
|
@ -34,22 +35,18 @@
|
|||
.org 0x002E ; Interruption du timer
|
||||
jmp tm
|
||||
|
||||
.org 0x003A
|
||||
.org 0x003A ; Interruption de l'ADC
|
||||
jmp irqadc
|
||||
|
||||
.org 0x0080
|
||||
|
||||
codeAff:
|
||||
.db 0b1111110, 0b001100
|
||||
.db 0b0110111, 0b0011111
|
||||
.db 0b1001101, 0b1011011
|
||||
.db 0b1111011, 0b0001110
|
||||
.db 0b1111111, 0b1011111
|
||||
codeAff: ; Représentation des chiffres sur l'afficheur 7-segments
|
||||
.db 0b1111110, 0b001100, 0b0110111, 0b0011111, 0b1001101, 0b1011011, 0b1111011, 0b0001110, 0b1111111, 0b1011111
|
||||
|
||||
debut:
|
||||
; Initialisation de la pile
|
||||
ldi r28, low(RAMEND)
|
||||
ldi r29, high(RAMEND)
|
||||
|
||||
out SPL, r28
|
||||
out SPH, r29
|
||||
|
||||
|
@ -57,9 +54,9 @@ debut:
|
|||
DDRA@IO <- 0xFF
|
||||
DDRC@IO <- 0xFF
|
||||
|
||||
ADMUX <- 0b01100001
|
||||
ADCSRB <- 0b00000000
|
||||
ADCSRA <- 0b11101111
|
||||
ADMUX <- 0b01100001 ; Sélection de l'ADC1
|
||||
ADCSRB <- 0b00000000 ; Free-running mode
|
||||
ADCSRA <- 0b11101111 ; Activation des interruptions
|
||||
|
||||
; Timer toutes les 2 ms
|
||||
TCCR0A@IO <- 0x00
|
||||
|
|
161
TP3/capteur_distance.svg
Normal file
161
TP3/capteur_distance.svg
Normal file
|
@ -0,0 +1,161 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="150.78093mm"
|
||||
height="84.340805mm"
|
||||
viewBox="0 0 150.78093 84.340805"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.1 r"
|
||||
sodipodi:docname="capteur_distance.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4490"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lstart"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path4487"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="269.36956"
|
||||
inkscape:cy="187.87975"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-left="5"
|
||||
fit-margin-top="5"
|
||||
fit-margin-right="5"
|
||||
fit-margin-bottom="5"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="882"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="1042"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(1.7479171,-50.830598)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
|
||||
d="M 143.25646,122.20573 H 18.174328 V 56.607143"
|
||||
id="path4485"
|
||||
inkscape:connector-curvature="0" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4801"
|
||||
style="font-style:normal;font-weight:normal;font-size:15px;line-height:25px;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,21.258142,1.1339286)"><flowRegion
|
||||
id="flowRegion4803"><rect
|
||||
id="rect4805"
|
||||
width="67.857132"
|
||||
height="22.857159"
|
||||
x="190"
|
||||
y="471.09113" /></flowRegion><flowPara
|
||||
id="flowPara4807">Distance</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4801-9"
|
||||
style="font-style:normal;font-weight:normal;font-size:15px;line-height:25px;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.51181102;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(0,-0.26458333,0.26458333,0,-122.71387,162.50969)"><flowRegion
|
||||
id="flowRegion4803-0"
|
||||
style="stroke-width:1.51181102;stroke-miterlimit:4;stroke-dasharray:none"><rect
|
||||
id="rect4805-8"
|
||||
width="172.85712"
|
||||
height="23.571432"
|
||||
x="190"
|
||||
y="471.09113"
|
||||
style="stroke-width:1.51181102;stroke-miterlimit:4;stroke-dasharray:none" /></flowRegion><flowPara
|
||||
id="flowPara4807-1">Tension du capteur (V)</flowPara></flowRoot> <path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#c52b00;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 18.142857,92.892855 c 0,0 11.116479,-3.123508 20.599702,-12.851191 34.454851,-35.34303 -25.89137,39.309516 100.541661,41.766376"
|
||||
id="path4845"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4919"
|
||||
style="font-style:normal;font-weight:normal;font-size:15px;line-height:25px;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,5.8511007,-0.68913503)"><flowRegion
|
||||
id="flowRegion4921"><rect
|
||||
id="rect4923"
|
||||
width="44.285713"
|
||||
height="26.428572"
|
||||
x="13.571428"
|
||||
y="341.09113" /></flowRegion><flowPara
|
||||
id="flowPara4925">1,4</flowPara></flowRoot> <path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.26499999, 0.26499999;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 18.142857,92.892855 140.04923,92.872898"
|
||||
id="path5071"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.26458332, 0.26458332;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 140.04923,70.555892 H 18.174328"
|
||||
id="path5073"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot4919-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:15px;line-height:25px;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,6.14065,-22.813536)"><flowRegion
|
||||
id="flowRegion4921-1"><rect
|
||||
id="rect4923-1"
|
||||
width="44.285713"
|
||||
height="26.428572"
|
||||
x="13.571428"
|
||||
y="341.09113" /></flowRegion><flowPara
|
||||
id="flowPara4925-0">3,0</flowPara></flowRoot> </g>
|
||||
</svg>
|
After Width: | Height: | Size: 7 KiB |
Reference in a new issue