Vous êtes sur la page 1sur 6

;

*****************************************************************
************
; Ce fichier est la base de départ pour une programmation avec
*
; le PIC 16F876. Il contient les informations de base pour
*
; démarrer.
*
;
*
;
*****************************************************************
************
;
*
; NOM:
*
; Date:
*
; Version:
*
; Circuit:
*
; Auteur:
*
;
*
;
*****************************************************************
************
;
*
; Fichier requis: P16F876.inc
*
;
*
;
*
;
*
;
*****************************************************************
************
;
*
; Notes:
*
;
*
;
*
;
*
;
*
;
*****************************************************************
************

LIST p=16F876 ; Définition de processeur


#include <p16F876.inc> ; fichier include

__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF &


_CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

;
*****************************************************************
************
; ASSIGNATIONS SYSTEME
*
;
*****************************************************************
************

; REGISTRE OPTION_REG (configuration)


; -----------------------------------
OPTIONVAL EQU B'10000000'

; DIRECTION DES PORTS I/O


; -----------------------

DIRPORTB EQU B'00000000' ; Direction PORTB


DIRPORTC EQU B'11111111' ; Direction PORTC

;
*****************************************************************
************
; MACRO
*
;
*****************************************************************
************

; Changement de banques
; ----------------------

BANK0 macro ; passer en banque0


bcf STATUS,RP0
bcf STATUS,RP1
endm

BANK1 macro ; passer en banque1


bsf STATUS,RP0
bcf STATUS,RP1
endm

BANK2 macro ; passer en banque2


bcf STATUS,RP0
bsf STATUS,RP1
endm

BANK3 macro ; passer en banque3


bsf STATUS,RP0
bsf STATUS,RP1
endm

;
*****************************************************************
************
; VARIABLES ZONE COMMUNE
*
;
*****************************************************************
************

; Zone de 16 bytes
; ----------------

CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)


w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; sauvegarde registre STATUS
FSR_temp : 1 ; sauvegarde FSR (si indirect en
interrupt)
octet:1
ENDC

;
*****************************************************************
************
; DEMARRAGE SUR RESET
*
;
*****************************************************************
************
org 0x000 ; Adresse de départ après reset
goto init ; Initialiser

; ///////////////////////////////////////////////////////////////
/////////////

; I N T E R R U P T I O N S

; ///////////////////////////////////////////////////////////////
/////////////

;
*****************************************************************
************
; ROUTINE INTERRUPTION
*
;
*****************************************************************
************

;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
movf FSR , w ; charger FSR
movwf FSR_temp ; sauvegarder FSR

; Interruption réception USART


; ----------------------------

BANK0 ; passer en banque0


movf RCREG,w ; charger octet reçu
movwf octet ; le sauver
bcf RCSTA,CREN
goto restorereg ; et fin d'interrupt

;restaurer registres
;-------------------
restorereg

movf FSR_temp , w ; charger FSR sauvé


movwf FSR ; restaurer FSR
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier
status
retfie ; return from interrupt

; ///////////////////////////////////////////////////////////////
/////////////

; P R O G R A M M E

; ///////////////////////////////////////////////////////////////
/////////////

;
*****************************************************************
************
; INITIALISATIONS
*
;
*****************************************************************
************
init

; initialisation PORTS (banque 0 et 1)


; ------------------------------------
BANK0 ; sélectionner banque0
clrf PORTB ; sorties PORTB à 0
clrf PORTC ; sorties PORTC à 0
bsf STATUS,RP0 ; passer en banque1
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; direction en sortie
movlw DIRPORTC ; Direction PORTC
movwf TRISC ; direction en entree

; Registre d'options (banque 1)


; -----------------------------
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option

; initialiser USART
; -----------------
movlw B'00010000' ; mode esclave synchrone, émission 8
bits
movwf TXSTA ; dans registre TXSTA
bcf STATUS,RP0 ; repasser banque 0
movlw B'10000000' ; module en service, réception 8 bits
movwf RCSTA ; dans registre RCSTA

; lancer interruption USART


; -------------------------
bsf INTCON,PEIE ; interruptions périphériques en
service
bsf STATUS,RP0 ; passer banque 1
bsf PIE1,RCIE ; autoriser interrupts RX USART
bcf STATUS,RP0 ; repasser banque 0
bsf INTCON,GIE ; lancer les interruptions
goto start ; démarrer programme principal

;
*****************************************************************
************
; PROGRAMME PRINCIPAL
*
;
*****************************************************************
************

start
; lecture sur port série
; ----------------------
bsf RCSTA,CREN ; lancer la réception
sleep
movf octet,w
movwf PORTB
goto $-2
END ; directive fin de programme