Sunteți pe pagina 1din 9

************************************************************************

***************
TEMPERATURE + HEURE
***********************
************************************************************************
=
=
=
=
=
=
=
=
=
=

1600
160A
160B
160C
160D
01EF
1A00
1800
1900
1B00

Adr_rtc
reg_a
reg_b
reg_c
reg_d
vec_irq
Adr_seg4
Adr_seg3
Adr_seg2
Adr_seg1

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

$1600
$160A
$160B
$160C
$160D

; adresse du RTC
; adresse du registre A
; adresse du registre B
; adresse du registre C
; adresse du registre D
$01EF
; vecteur dinterruption
$1A00
; adresse du segment 4
$1800
; adresse du segment 3
$1900
; adresse du segment 2
$1B00
; adresse du segment 1

9100:

ORG

9100: CE 91 5C
9103: FF 01 EF
9106: CE 16 00

LDX #inter
; vecteur dinterruption
STX
vec_irq
LDX #Adr_rtc
; dfinir ladresse de
; lhorloge temps rel
BSR
test
; vrifie que le rtc est
; oprationnel
BEQ
eror
; tant quil y a une erreur on
; boucle
NOP
BRA wait
; attente dinterruption
SWI

9109: 8D 34
910B: 27 03
910D: 01
910E: 20 FD
9110: 3F

wait
eror

$9100

******************************** init_rtc *****************************


9111
9111: 86 82
LDA #$82 ; bloque le rtc
; la mise jour, format dheure
9113: B7 16 0B
STA
reg_b
; 24h, donnes codes en BCD
9116: 86 00
LDA #$00
; initialise le registre de secondes
9118: B7 16 00
STA
Adr_rtc+0
911B: 86 00
LDA #$00
; initialise le registre de minutes
911D: B7 16 02
STA
Adr_rtc+2
9120: 86 18
LDA #$18
; initialise le registre de heures
9122: B7 16 04
STA
Adr_rtc+4
9125: 86 03
LDA #$03
; initialise le registre de jour de
; la semaine
9127: B7 16 06
STA
Adr_rtc+6
912A: 86 30
LDA #$30
; initialise le registre de jour du
; mois
912C: B7 16 07
STA
Adr_rtc+7
912F: 86 05
LDA #$05
; initialise le registre de mois

9131: B7 16 08
9134: 86 06
9136: B7 16 09

STA
LDA #$06
STA

Adr_rtc+8
; initialise le registre danne
Adr_rtc+9

9139: 86 02
913B: B7 16 0B
913E: 39

LDA #$02
STA
RTS

reg_b

; autorise les interruptions xrq

********************** Test **************************


913F
913F: CE 16 00
LDX #Adr_rtc
; pointe ladresse RTC
9142: B6 16 0C
LDA reg_c
; lire le registre C pour
; initialiser linterruption
9145: B6 16 0D
LDA reg_d
; lire le registre D
9148: 81 80
CMPA
#$80
; comparer si le bit 7 est 1
914A: 26 0E
BNE
err
; si cest diffrent un problme
; matriel est envisager
914C: 86 A0
LDA #$A0
; commande dclencher
; loscillateur interne
914E: B7 16 0A
STA
reg_a
9151: 86 1B
LDA #$1B
9153: B7 16 0B
STA
reg_b
9156: 86 FF
LDA #$FF
9158: 20 01
BRA tst
915A: 4F
err CLRA
915B: 39
tst
RTS
********************* sous programme dinterruption *****************
915C
915C: BD 92 0D
JSR
temperature ; on appel le sous programme
; daffichage de temprature
915F: 4F
CLRA
9160: B7 1B 00
STA
Adr_seg1
; teint lafficheur 7segments n1
9163: B6 16 04
LDA Adr_rtc+4
; lire la valeur de lheure
9166: B7 91 F8
STA
heure
; stocker dans la variable heure
9169: B6 16 02
LDA Adr_rtc+2
; lire la valeur de minute
916C: B7 91 F9
STA
minutes
; stocker dans la variable minutes
916F: BD 91 7C
JSR
traitement
; sauter au sous programme
; traitement
9172: BD 91 A5
JSR
affichage
; affiche les donnes
9175: B6 16 0C
LDA reg_c
; lire C pour initialiser linterruption
9178: BD 92 01
JSR
tempo_long
917B: 3B
RTI
***

Traitement

***

917C
917C: B6 91 F8
917F: 84 0F
9181: B7 91 FB
9184: B6 91 F8
9187: 84 F0
9189: 46
918A: 46
918B: 46
918C: 46
918D: B7 91 FA
9190: B6 91 F9
9193: 84 0F
9195: B7 91 FD
9198: B6 91 F9
919B: 84 F0
919D: 46
919E: 46
919F: 46
91A0: 46
91A1: B7 91 FC
91A4: 39

LDA heure
; charge A avec heure
ANDA
#$0F
; masque le LSB pour obtenir les
; units
STA
unit_h
; stocke le LSB dans unit_h
LDA heure
; lit heure
ANDA
#$F0
; masque le MSB pour obtenir les
; dizaines
RORA
; dcale de 4 bits vers la droite
RORA
; transforme le MSB en LSB
RORA
RORA
STA
diz_h
; stocke le MSB dans diz_h
LDA minutes
; lire la valeur de minute
ANDA
#$0F
; prendre le LSB de la valeur
STA
unit_m
; stocke dans unit_m
LDA minutes
; relire les minutes
ANDA
#$F0
; masque le MSB de la valeur
RORA
; dcale de 4 bits doite
RORA
RORA
RORA
STA
diz_m
; stocke le MSB dans diz_m
RTS

***** Affichage ******


91A5
91A5: 5F
91A6: F1 91 FA bcl1
91A9: 27 03
91AB: 5C
boucle
91AC: 20 F8
91AE: CE 91 EE aff1
91B1: 3A
91B2: A6 00
91B4: B7 19 00
91B7: 5F
91B8: F1 91 FB bcl2
91BB: 27 03
91BD: 5C
91BE: 20 F8
91C0: CE 91 EE aff2
91C3: 3A
91C4: A6 00

CLRB
CMPB
BEQ
INCB

diz_h
aff1

; on efface B
; on compare B avec diz_h
; si B = diz_h alors on affiche
; sinon on incrmente et on

BRA bcl1
LDX #tab_seg
ABX
LDA 0,x

; on pointe tab_seg
; ajoute B X (B= dplacement)
; charger A par le contenu de la
; case pointe
Adr_seg2
; on affiche
; on efface B
unit_h
; on compare B avec unit_h
aff2
; si B = unit_h alors on affiche
; sinon incrmente et puis boucle

STA
CLRB
CMPB
BEQ
INCB
BRA bcl2
LDX #tab_seg
ABX
LDA 0,x

; pointe le tableau tab_seg


; ajoute B X (B= dplacement)
; charger A par le contenu de la

91C6: B7 1A 00
91C9: 5F
91CA: F1 91 FC bcl3
91CD: 27 03
91CF: 5C
91D0: 20 F8
91D2: CE 91 EE aff3
91D5: 3A
91D6: A6 00
91D8: B7 1B 00
91DB: 5F
91DC: F1 91 FD bcl4
91DF: 27 03
91E1: 5C
91E2: 20 F8
91E4: CE 91 EE aff4
91E7: 3A
91E8: A6 00

; case pointe
STA
Adr_seg4
; affiche sur le 7segment N4
CLRB
; efface le registre B
CMPB
diz_m
; compare B avec diz_m
BEQ
aff3
; si B = diz_m alors on affiche
INCB
; sinon incrmente et puis boucle
BRA bcl3
LDX #tab_seg
; pointe le tableau tab_seg
ABX
; ajoute B X (B= dplacement)
LDA 0,x
; charger A par le contenu de la
; case pointe
STA
Adr_seg1
; affiche sur le 7segments N1
CLRB
; on efface B
CMPB
unit_m
; on compare B avec unit_m
BEQ
aff4
; si B = unit_m alors on affiche
INCB
; sinon incrmente et puis boucle
BRA bcl4
LDX #tab_seg
; pointe le tableau tab_seg
ABX
; ajoute B X (B= dplacement)
LDA 0,x
; charger A par le contenu de la
; case pointe
STA
Adr_seg3
; affiche sur le segment N3
RTS
FCB $7E, $0C, $B6, $9E, $CC

91EA: B7 18 00
91ED: 39
91EE: 7E 0C B6 tab_seg
9E CC
91F3: DA FA 0E
FCB $DA, $FA, $0E, $FE, $DE
FE DE
91F8:
91F9:
91FA:
91FB:
91FC:
91FD:
91FE:
91FF:

[] * 0001
[] * 0001
[] * 0001
[] * 0001
[] * 0001
[] * 0001
[] * 0001
[] * 0002

heure
minutes
diz_h
unit_h
diz_m
unit_m
dpl
cpt

RMB
RMB
RMB
RMB
RMB
RMB
RMB
RMB

1
1
1
1
1
1
1
2

********************* tempo_long ********************


9201:
9201: 86 0F
LDA #$0F
; on fait une boucle de 15 x 65535 tours
9203: CE FF FF
bo1
LDX #$FFFF
9206: 09
bo2
DECX
; on dcrmente X
9207: 26 FD
BNE
bo2
; tant que X diffrent de 0 on
boucle
9209: 4A
DECA
; on dcrmente A
920A: 26 F7
BNE bo1
; tant que A diffrent de 0
; boucle bol

920C: 39

RTS

****************************************************************
***************
TEMPERATURE
**********************
****************************************************************
= 0090
= 0050

adr_1621
slav

EQU $90
EQU $50

; adresse du capteur de temprature


; adresse du composant esclave

************** temperature **************


920D
920D:
Debut
920D: 4F
temperature
CLRA
920E: B7 93 28
STA
Affiche; initialise le variable de laffiche
9211: B7 91 FF
STA
cpt
9214: 86 01
LDAA
#$01
9216: B7 93 2A
STA
Init
9219: C6 50
921B: BD 92 AD
921E: BD 93 19

LDB
JSR
JSR

9221: 86 90
boucle
9223: BD 92 BD
JSR

LDA #adr_1621+0 ; fixe le capteur en criture


start_i2c
; demande l'i2c qu'on va
; commencer envoyer
LDX #tab_octets+0 ; envoi la commande EE start
; conversion
LDB
#$01
; un octet transmettre
envoyer
; utilise sous programme envoie
JSR
stop_i2c
; libre l'i2c
LDA #adr_1621+0 ; fixe le capteur en criture
start_i2c
; demande l'i2c qu'on va
; commencer envoyer
LDX #tab_octets+1 ; envoi la commande AA (accs
; config)
LDB
#$01
; un octet transmettre
envoyer
; utilise sous programme envoie
JSR
stop_i2c
; libre l'i2c
LDA #adr_1621+1 ; fixe le capteur en criture
start_i2c
; demande l'i2c qu'on va
; commencer envoyer
LDX #$9500
; slectionne un autre segment
; mmoire
LDAB
#$02
; 2 octets transmettre
JSR
recevoir
; utilise sous programme reoit
JSR
stop_i2c
; libre l'i2c
JSR
aff_tmp
; passer au sous programme

9226: CE 93 20
9229: C6 01
922B: BD 92 CF
JSR
922E: BD 93 19
9231: 86 90
lec_temp
9233: BD 92 BD
JSR
9236: CE 93 21
9239: C6 01
923B: BD 92 CF
923E: BD 93 19
9241: 86 91
9243: BD 92 BD
9246: CE 95 00
9249: C6 02
924B: BD 92 E0
924E: BD 93 19
9251: BD 92 6D

JSR
JSR

#slav
Init_i2c
stop_i2c

; initialisation de l'i2c
; on libre l'i2c

; d'affichage
; on affiche le '' (degr)
Adr_seg1
; on affiche le 'C' (celsius)
Adr_seg3

9254: 86 C6
9256: B7 1B 00
9259: 86 72
925B: B7 18 00
925E: B6 91 FF
9261: 4C
9262: B7 91 FF
9265: 81 FF
9267: 26 B8
9269: BD 92 01
926C: 39
*****Aff_tmp ******
926D:
926D: CE 95 00

LDA #$C6
STA
LDA #$72
STA
LDA cpt
INCA
STA
CMPA
BNE
JSR
RTS

9270: E6 00
9272: 4F
9273: CE 00 0A
9276: 02
9277: F7 93 24
927A: FF 93 26
927D: F6 93 27
9280: F7 93 26
9283: 18 CE 91 loop1
EE
9287: 18 3A
9289: 18 A6 00
928C: F1 93 24
928F: 27 0

LDB 0,x
CLRA
LDX #10
; on divise le Msb par 10
IDIV
STB
unite
; stocke le reste dans unite
STX
dizaine
; stocke le quotient dans dizaine
LDB
dizaine+1
STB
dizaine
LDY #tab_seg

LDX #$9500

ABY
LDA 0,y
CMPB
BEQ ok1

cpt
#$FF
boucle
tempo_long

; slectionne une autre zone


; mmoire

; additionne b y
; charge A avec ce que pointe Y
unite
; on compare b unite
; si c'est gale on affiche A
; (qui contient la valeur de
; la case mmoire pointe par Y)
9291: 5C
INCB
; on incrmente B
9292: 20 EF
BRA loop1
; on boucle
9294: B7 1A 00 ok1
STA
Adr_seg4
; envoie A l'afficheur
9297: 5F
CLRB
9298: 18 CE 91 EE loop2
LDY #tab_seg
929C: 18 3A
ABY
; additionne b y
929E: 18 A6 00
LDA 0,y
; charge A avec ce que pointe Y
92A1: F1 93 26
CMPB
dizaine
; compare b dizaine
92A4: 27 03
BEQ
ok2
; si c'est gale on affiche A
92A6: 5C
INCB
; incrmente B
92A7: 20 EF
BRA loop2
; boucle loop2
92A9: B7 19 00 ok2
STA
Adr_seg2
; envoie la valeur A l'afficheur
92AC: 39
RTS
******************************************
********** INITIALISATION I2C *********

******************************************
= 1400
= 00C5
= 00C3

bus_i2c
EQU $1400
start
EQU $C5
stop EQU $C3

******************** Init _i2c **********************


92AD:
92AD: 86 00
92AF: 8D 60
92B1: 17
92B2: 8D 59
92B4: 86 20
92B6: 8D 59
92B8: 86 1D
92BA: 8D 51
92BC: 39

LDA #$00
BSR
TBA
BSR
LDA #$20
BSR
LDA #$1D
BSR
RTS

ecriture_reg_s1
ecriture
ecriture_reg_s1
ecriture

***** Start _i2c *****


92BD:
92BD: 36
92BE: 8D 41
92C0: 32
92C1: 8D 4A
92C3: 86 C5
92C5: 8D 4A
92C7: 8D 30

start_i2c
PSHA
BSR test_busy
PULA
BSR ecriture
LDA #start
BSR ecriture_reg_s1
BSR attente_ack

92C9: 8D 4A
92CB: 16
92CC: C4 18
92CE: 39

BSR lecture_reg_s1
TAB
ANDB #$18
RTS

****** Envoyer *****


92CF
92CF: 3C
92D0: 37
92D1: 8D 26 Boucle

PSHX
PSHB
BSR attente_ack

92D3: 5A

DECB

92D4: 2B 07
92D6: A6 00

BMI
LDA ,X

; prend la main sur li2c


; test le busy
; envoi la commande start i2c
; attend la rponse du botier
; esclave
; lire le registre s1

; attend que le botier esclave soit


; prt
; et puis dcrmente le nombre
; doctets envoyer
Arret
; si B devient ngatif on sort
; charge A avec la valeur
; envoyer

92D8: 08
92D9: 8D 32

INCX
BSR

92DB: 20 F4
92DD: 33
Arret
92DE: 38
92DF: 39

BRA
PULB
PULX
RTS

ecriture
Boucle

; incrmente X
; envoi la valeur de la registre A
; sur le bus i2c
; reboucle

******************* recevoir **********************


92E0
92E0: 3C
PSHX
92E1: 37
PSHB
92E2: 8D 25
BSR
lecture
; lecture bidon pour lancer la
lecture
92E4: C1 01 Boucle1
CMPB
#1
; reste 1 octet recevoir ?
92E6: 26 04
BNE
SuiteA
92E8: 86 40
LDA #$40
; ne renvoi pas dacknowledge
92EA: 8D 25
BSR
ecriture_reg_s1
92EC: 8D 0B SuiteA
BSR
attente_ack ; attend avant denvoyer ack
92EE: 8D 19
BSR
lecture
; lit la donne prsente sur li2c
92F0: A7 00
STA
0,X
; stocke la donne dans le tableau
92F2: 08
INCX
; incrmente X
92F3: 5A
DECB
; dcrmente le nombre doctets
; recevoir
92F4: 2E EE
BGT
Boucle1
; reboucle
92F6: 33
PULB
92F7: 38
PULX
92F8: 39
RTS
********************* attente_ack *********************
92F9
92F9: BD 93 15
JSR
lecture_reg_s1; lit le registre s1
92FC: 84 80
ANDA
#$80
; si le bit 7 est 0 le composant
; nest pas encore prt recevoir
92FE: 26 F9
BNE attente_ack
9300: 39
RTS
************************ test_busy ********************
9301
9301: BD 93 15
JSR
lecture_reg_s1 ; on lit le registre s1
9304: 84 01
ANDA
#$01
; si le bit 7 est 1 li2c est
occup
9306: 27 F9
BEQ
test_busy
9308: 39
RTS

********************* lecture ********************

9309
9309: B6 14 00

LDA bus_i2c

930C: 39

RTS

; lire la donne prsent sur


; li2c

********************* criture ********************


930D
930D: B7 14 00

STA

9310: 39

RTS

bus_i2c

; crit les donnes sur ladresse de


; li2c

********************* ecriture_reg_s1 ***************


9311:
9311: B7 14 01
9314: 39

STA
RTS

bus_i2c+1

; crit dans le registre S1

******************** lecture_reg_s1 ****************


9315 _s1
9315: B6 14 01

LDA bus_i2c+1

9318: 39

RTS

; charge A avec le contenu du


; registre s1

******************* stop_i2c ********************


9319:
9319: 36
PSHA
931A: 86 C3
LDA #stop
; on envoie la commande pour
; stoper li2c
931C: 8D F3
BSR
ecriture_reg_s1
931E: 32
PULA
931F: 39
RTS
9320: EE AA AC tab_octets FCB $EE,$AA,$AC,$09
9324:
9326:
9328:
932A:
932C:

[] * 0002
[] * 0002
[] * 0002
[] * 0002

unite
dizaine
Affiche
Init

RMB
RMB
RMB
RMB
END

2
2
2
2

; tableau contenant les


;commandes 09

S-ar putea să vă placă și