Vous êtes sur la page 1sur 15

Annexe

Annexe

Quartz

DB9.f
Pic 16F877A

MAX232
Figure 1 : la carte lectronique ralis

51

Annexe

Cble de
communication entre
Carte

la carte

programmateur

programmateur et
PC

Figure 2 : la carte programmateur JDM PIC-PROG 02

Figure 3 : la mini serre de notre travaille

52

Annexe

LM35

Figure 4 : Emplacement de capteur tloprateur

Mini serre
Carte
Dacquisition

Alimentation
5V

Figure 4 : emplacement de carte dacquisition

53

Annexe

Programme assembleur de notre application :

list p=16F877A
#include <p16F877A.inc>
;***************************************************************************
;-slectionn les page de mmoire: par les 2 bits(6,5): RP0, RP1 dans le registre STATUS.
;***************************************************************************
;

*RP0=0, RP1=0 ==>la page 0(BANK0).

*RP0=1, RP1=0 ==>la page 1(BANK1).

*RP0=0, RP1=1 ==>la page 2(BANK2).

*RP0=1, RP1=1 ==>la page 3(BANK3).

BANK0

macro
bcf

STATUS,RP0

bcf

STATUS,RP1

endm
BANK1

macro
bsf

STATUS,RP0

bcf

STATUS,RP1

endm
BANK2

macro
bcf

STATUS,RP0

bsf

STATUS,RP1

endm
BANK3

macro
bsf

STATUS,RP0

bsf

STATUS,RP1

endm
;*************************************************************************
; rserver une case mmoire pour les compteur:
;************************************************************************
cblock 0xA0
CPT:1
CPT_tempo1s:1
54

Annexe
CPT_tempo1m:1
endc
;**********************************************************************
;****************programme principale :***********************************
;**********************************************************************
org

0x00

goto

start

org

0x20

start
;**********************************************************************
;-initialisation des ports A, B, C, D et E:
;***********************************************************************
BANK0
clrf

PORTA

clrf

PORTB

clrf

PORTE

clrf

PORTC

;***********************************************************************
;I-configuration le CAN , la liaison srie USART et les PORTE:A,B et C:
;************************************************************************
; 1-LES PORTES :
;

-PORTE B en sortie "TRISB"='00000000'

-PORTE A :RA0 ET RA1 en entree "TRISA"='00000011'

-PORTE c:RC7 en entree et RC6 en sortie TRISC='10000000'


BANK1
Movlw

B'00000011'

movwf

TRISA

movlw

B'11000000'

movwf

TRISC

movlw

B'00000110'

movwf

TRISB

;*********************************************************************
; 2_ la liaison srie USART:
;***************************************************************************
55

Annexe
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

2.1_ configuration de registre d'tat Emission "TXSTA":


*Autorisation d'mission sur 8 bits:
TX9=0 (bit 6)
*Autorisation d'mission:
TXEN=1 (bit 1)
*Slection mode Synchrone / Asynchrone:
SYNC=0 (bite 4) ==> Mode asynchrone
*Slection vitesse rapide en mode asynchrone :
BRGH=1 (bite 2)==>Vitesse haute slectionne
==>TXTA=B'00100100'=H'24'
2.2_configuration de registre du choix de la vitesse "SPBRG"
*SPBRG=D'25'==>vitesse=9600 bite\S
2.3_ configuration de registre d'tat rception "RCSTA":
*PC7 et PC6 configurs pour le port srie:
SPEN=1 (bite 7) ==>Port srie en service
*Autorisation de rception sur 8 bits:

RX9=0 (bite 6)

==>RSTA=B'11000000'
BANK1
movlw

D'36'

movwf

TXSTA

movlw

D'25'

movwf

SPBRG

BANK0
bsf

RCSTA,SPEN

bcf

RCSTA,RX9

;**************************************************************************
; 3_ LE CAN:
;**************************************************************************
;
;
;
;
;

3.1_configuration de registre de contrle n0 du convertisseur ADCON0":


*choisir la vitesse de conversion:
ADSC1=0 et ADSC0=1 (bites 7et6)==>Fosc/8.
==>ADCON0=H'41'=B'01000001'.
3.2_configuration de registre de contrle n1 du convertisseur "ADCON1":
56

Annexe
;

* slectionn la forme du rsultat:

;
;

ADFM=1 (bite 7) ==>Justifi droite


*contrle de la configuration des Ports:

PCFG3=0, PCFG2=1, PCFG1=0 et PCFG0=0 (bites 3,2,1et0)==>RA0 et RA1 en

entre analogique
;

==>ADCON1=B'10000100'=H'84'
BANK1
movlw

0x84

movwf

ADCON1

;***************************************************************************
; --tester la rception "RCREG":
;**************************************************************************
;

*"RCREG" est plein: le flag 'RCIF' (bit 5 de "PIR1") mise '1'.

*DATA reue=? H'60':

- OUI:

continue l'execution de programme.

- NON:

attendre une autre rception.

*mise '0' le flag 'RCIF'.

wait_start
BANK0
Btfss PIR1,RCIF
goto

wait_start

bcf

PIR1,RCIF

movf RCREG,0
sublw 0x60
btfss

STATUS,Z

goto

wait_start

restart

movlw B'00000110';alumer les deux LED(R_J)


MOVWF

PORTB

;***************************************************************************
; dmarr la conversion T1
;***************************************************************************
;

*choisir l'entre qui va tre convertie:


57

Annexe
;
;

CHS2=0 ,CHS1=0 et CHS0=0 (bites 5,4et3)==>RA0 en entree.


*Convertisseur A/D en service:

ADON=1 (bite 0)
BANK0
movlw

0x41

movwf

ADCON0

BANK1
movlw

D'40'

movwf

CPT

;***************************************************************************
;

--slectionn la case mmoire :

;***************************************************************************
;

*charger les 8 bits d'adresse de la case mmoire dans le registre "FSR".

*slectionner le 9'eme' bit d'adresse de la case mmoire:

IRP=0 (bit7 de register "STATUS")


BANKO

movlw

0x20

movwf

FSR

bcf

STATUS, IRP

--Dmarrer la conversion A

/D de temprature du capteur '1':


;

GO=1 (bite 2 de registre "ADCON0")

convT1
BANK0
bsf

ADCON0,GO

; --tester le bite GO (bite 2 de register "ADCON0")


;

GO=0 ==>La conversion A/D est termine

WAIT_CANT1
btfsc

ADCON0,GO

goto

WAIT_CANT1

;***************************************************************************
; --sauvegarder la rsultat du CAN dans la mmoire RAM 'page0'
;**************************************************************************
;

*call de sous programme 'save'.


58

Annexe
;

*dcrmenter le compteur 'CPt'.

*test CPT=?0:

-OUI: contenu l'excution de programme.

-NON: recommencer la conversion.


call

SAVE

BANK1
decfsz

CPT,1

call

TOMPO_50microS

goto

convT1

;***************************************************************************
;

--transmission les octets travers L'USART:

;***************************************************************************
;

*call de sous programme 'EMISSION'


call

EMISSION

;***************************************************************************
Dmarre la conversion T2
;***************************************************************************
;
;
;
;

*choisir l'entre qui va tre convertie:


CHS2=0, CHS1=0 et CHS0=1 (bites 5,4et3)==>RA1 en entre.
*Convertisseur A/D en service:
ADON=1 (bite 0)
BANK0
movlw

0x49

movwf

ADCON0

BANK1
movlw

D'40'

movwf

CPT

;**************************************************************************
;

--slectionn la case mmoire :

;***************************************************************************
;

*charger les 8 bits d'ardasse de la case mmoire dans le rigester "FSR".


BANK0
Movlw

0x20

Movwf

FSR
59

Annexe
bcf

STATUS,IRP

; --Dmarrer la conversion A/D de temprature de capteur '2':


;

GO=1 (bite 2 de rigester "ADCON0")

convT2
BANKO
bsf

ADCON0,GO

; --tester le bite GO (bite 2 de registre ( "ADCON0")


;

GO=0 ==>La conversion A/D est termine

WAIT_CANT2
btfsc

ADCON0,GO

goto

WAIT_CANT2

;*************************************************************************
; --sauvegarder la rsultat du CAN dans la mmoire RAM 'page0'
;**************************************************************************
;

*call de sous programme 'save'.

*dcrmenter le compteur 'CPt'.

*test CPT=? 0:

-OUI: contenue l'excution de programme.

-NON: recommencer la conversion.


call

SAVE

BANK1
decfsz

CPT

call

TOMPO_50microS

goto

convT2

;**************************************************************************
;

--transmition les octets traver L'USART:

;**************************************************************************
;

*call de sous programme 'EMISSION'.


call

EMISSION

BANK0
Movlw

B'0000O1OO' ; attendre LED_R

movwf

PORTB

call

TEMPO_1M

60

Annexe
; --tester la rception "RCREG": EST-CE-QUE ARRET CONVERSION
;

*"RCREG" est plein: le flag 'RCIF' (bit 5 de "PIR1") mise '1'.

*DATA reue=?H'64':

- OUI: contenue attende une rception de Start.

- NON: redmarre l'excution de programme.

wait_stope
BANK0
btfss

PIR1,RCIF

goto

restart

movf

RCREG,0

bcf

PIR1,RCIF

sublw

0x64

btfss

STATUS,Z

goto

restart

BANK0
clrf

PORTB

goto

wait_start

;Attender LED_J

;***************************************************************************
;**********************sous programme*******************************
;*********************************************************************
;

I-sous programme SAVE':

;***************************************************************************
SAVE
;

1-sauvegarder la contenu des registres "ADRESL" et "ADRESH" dans la mmoire RAM:

1.1-charger la contenu du registre "ADRESL" dans la case mmoire.

1.2-incrmenter le pointeur "INDF" (incrmenter le registre "FSR")

1.3-charger la contenu du registre "ADRESH" dans la case mmoire.

1.4-incrmenter le pointeur "INDF" (incrmenter le registre "FSR")


BANK1
movf

ADRESL,0

BANK0
movwf

INDF

incf

FSR,1

BANK0
61

Annexe
movf

ADRESH,0

movwf

INDF

incf

FSR,1

return
;************************************************************************
;

II- sous programme EMISSION':

;***********************************************************************
EMISSION
BANK1

movlw

D'80'

movwf

CPT

movlw

0x20

movwf

FSR

2-teste les flags: TXIF (bite 4 de rigester"PIR1")et TRMT (bite 1 de registre "TXTA"):

TXIF=1 Le buffer de transmission de l'USART est vide

TRMT=1 registre dcalage Emission est vide

wait1
BANK0
btfss

PIR1,TXIF

goto

wait1

wait2
BANK1

btfss

TXSTA,TRMT

goto

wait2

3-dmarr l'mission:

3.1-dplace la contenu de case mmoire vers "W"(INDF--->W)

3.2-dplace la contenu de "W" vers le registre "TXREG"

3.3-incrmenter le registre "FSR"==>pointer le pointeur "INDF" sur la prochaine

;case de memoire.
BANK0

movf

INDF,0

movwf

TXREG

incf

FSR,1

6-decrementer le compteur "CPT" et tester "CPT"=0 ou NON.


62

Annexe
BANK1
decfsz

CPT

goto

wait1

return
;**************************************************************************
;

III-sous programme'TEMPO_1S':

;***************************************************************************
;

1-configuration de TIMER0

1.1-configurer les pr diviseurs du TIMER0 reg "OPETION":

PSA=0 (bite 3)==>Le pr diviseur est affect au Timer TMR0

PS2=1 PS1=1 PS0=1 (bites 2,1et0)==>pr diviseur=255.

TEMPO_1S
BANK1

Movlw

0x87

movwf

OPTION_REG

2-charger le compteur "CPT_tempo1s"=D'16'.


movlw

D'16'

movwf

CPT_tempo1s

3-mise '0' le registre "TMRO".

WAIT_1S
BANK2
clrf
;

4-tester le flag 'TOIF' (bit 2 de "INTCON"):

;
;

TMR0

TOIF=1==>Le Timer0 est dbord


5-mise '0' le flag 'TOIF' (bit 2 de "INTCON")

TesT
BANK0

btfss

INTCON,T0IF

goto

TesT

bcf

INTCON,2

6-dcrmenter le compteur CPT_tempo1s" et tester "CPT_tempo1s"=0 ou NON.


BANK1
decfsz

CPT_tempo1s,1

goto

WAIT_1S
63

Annexe
return
;

7-tempt=256*256*16=1,048 S

;**************************************************************************
; IV-sous programme'TEMPO_1M':
;***************************************************************************
TEMPO_1M
;

1-configuration de TIMER0:

1.1-configurer les pr diviseurs du TIMER0 reg" OPETION":

PSA=0 (bite 3) ==>Le pr diviseur est affect au Timer TMR0

PS2=1 PS1=1 PS0=1 (bites 2,1et0)==>pr diviseur=255.


BANK1
movlw

0x87

movwf

OPTION_REG

BANK1
;

2-charger le compteur "CPT_tempo1s"=D'16'.

3-charger le compteur "CPT_tempo1m"=D'58'.


movlw

D'60'

movwf

CPT_tempo1m

movlw

D'16'

movwf

CPT_tempo1s

WAIT_1M

4-mise '0' le registre "TMRO".

wait
BANK2
clrf
;

5-tester le flag 'TOIF' (bit 2 de "INTCON"):

;
;

TMR0

TOIF=1==>Le Timer0 est dbord


6-mise '0' le flag 'TOIF' (bit 2 de "INTCON")

TEST
BANK0
btfss

INTCON,T0IF

goto

TEST

bcf

INTCON,2

BANK1
64

Annexe
;

6-dcrmenter le compteur CPT_tempo1s" et tester "CPT_tempo1s"=0 ou NON.

7-dcrmenter le compteur CPT_tempo1m" et tester "CPT_tempo1m"=0 ou NON.


decfsz

CPT_tempo1s,1

goto

wait

BANK1
Decfsz

CPT_tempo1m,1

goto

WAIT_1M

return
;

7- tempt=256*256*16*58=60,8 S

;;**************************************************************************
; IV-sous programme'TEMPO_50microS':
;***************************************************************************
;

1-configuration de TIMER0:

1.1-configurer les pr diviseurs du TIMER0 reg OPETION":

PSA=0 (bite 3)==>Le pr diviseur est affect au Timer TMR0

PS2=1 PS1=1 PS0=1 (bites 2,1et0)==>pr diviseur=255.

TEMPO_50microS
BANK1
movlw

0x87

movwf

OPTION_REG

BANK2

;
;
;

movlw

D'206'

movwf

TMR0

5-tester le flag 'TOIF' (bit 2 de "INTCON"):


TOIF=1==>Le Timer0 est dbord
6-mise '0' le flag 'TOIF' (bit 2 de "INTCON")

TEST_microS
BANK0
btfss

INTCON,T0IF

goto

TEST_microS

bcf

INTCON,2

return

end
65