Vous êtes sur la page 1sur 26

Gé nie Electronique – 2iè me année de formation Programmation Structurée

PROGRAMMATION STRUCTUREE DES PIC 16F877

Ce document contient les informations concernant la pratique d’une


programmation structuré e pour un PIC 16F877.par l’utilisation
des fonctions des librairies

Les points suivants successivement sont abordé s :

Ø Structure du fichier principal et du programme

Ø Dé finition des fonctions de test des modules pé riphé riques

Ø Dé finition des fonctions de librairie communes

Ø Dé finition des fonctions de librairie spé cifiques aux modules pé riphé riques

ProgStruct.doc JMT 1/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
STRUCTURE DU PROGRAMME

Toutes les fonctions appartiennent au projet 877ORG situés dans le répertoire D:\MPLAB\877org.

Le fichier principal est «877org.asm ». il contient les déclarations des fonctions utilisés par le projet.

Pour installer une fonction, il faut déclarer son fichier d’ en-tê te «xxx.h »(s’ il existe)
et son fichier de librairie «xxx.asm »

Fonctions communes : Certaines déclarations et fonctions sont communes à toutes les fonctions et sont
donc installées définitivement :
Fonctions communes Fichiers d’en-tê te Fichier assembleur
Définition des directives de compilation 877.h
Définition des constantes pour les pics pic.h
Définition des variables en RAM ram.h
Initialisation du microprocesseur init.asm
Programmes des interruptions it.asm
Tableaux de messages mess.asm
Fonctions de temporisations tempo.asm
Fonctions de conversions diverses math.h convert.asm
Fonctions mathématiques math.h math.asm
Définition des macros (simplification de l’ écriture) macros.h
Note : les fichiers «xxx.h »sont déclarés en haut du fichier principal, les fichiers «xxx.asm »en bas.

Fonctions spé cifiques : d’ autres fonctions sont spécifiques et sont donc installées selon le besoin.
Pour tester une fonction, plusieurs programmes de test sont disponibles pour la fonction XXX
et regroupés dans un fichier «XXXtst.asm »
Les fonctions spécifiques et leur fichier de test sont les suivantes :
Fonctions disponibles Fichier de tests Fichier utilisé s à dé clarer
interface convertisseur A/N cantst.asm can.asm
interface pour affichage sur LCD lcdtst.asm lcd.asm, lcd.h
voltmè tre utilisant A/N et LCD voltst.asm can.asm, lcd.asm, lcd.h
commande de moteur en mode PWM pwmtst.asm (1à5) pwm.asm, can.asm
asservissement de vitesse moteur (PWM) pwmtst.asm (6) asserv.asm, pwm.asm, can.asm
interface circuit horloge DS1306/DS1302 hortst.asm hor.asm, hor.h
interface circuit mémoire DS1306/DS1302 memtst.asm mem.asm, mem.h
interface clavier 12 ou 16 touches keytst.asm key.asm
interface pour 4 boutons poussoirs bptst.asm bp.asm
interface affichage multiplexé 4 x 7 segments afftst.asm aff.asm
interface EEPROM et PROM Flash promtst.asm prom.asm

Pour utiliser une fonction, il suffit de l’ invoquer dans le programme en insérant une ligne avec la
commande LIBcall :
Exemple : movlw ‘C’ ; affecte le code ASCII du caractè re ‘C’ dans W
LIBcall LCDcar ; appel du sous-programme ‘LCDcar’ qui affiche
; le caractè re contenu dans W sur le LCD.

Fonction : partie de logiciel (sous-programme ) qui exécute une ou plusieurs actions. Elle peut recevoir
une ou des informations et fournir une ou des informations en retour.
Déclaration : indication donnée au programme de compilation (MPLAB)afin d’ inclure un autre fichier
dans le projet.

ProgStruct.doc JMT 2/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
STRUCTURE DU FICHIER PRINCIPAL

;*******************************************************************************
; Fichier : 877org.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
;
; Programme de test des pé riphé riques du pic 16F877
;
;*******************************************************************************
; Avec l'utilisation de l'é mulateur, les adresses suivantes sont interdites:
;
; Mé moire Programme : 0x1F00 à 0x1FFF
; Mé moire RAM : 0x70, 0xF0, 0x170, 0x1F0, 0x1EB à 0x1EF
;*******************************************************************************

;-------------------------------------------------------------------------------
; Fichiers de Dé finitions
;-------------------------------------------------------------------------------
include "877.h" ; 1-Dé finition des directives de compilation
include "pic.h" ; 2-Dé finition des constantes pour les pics
include "ram.h" ; 3-Dé finition des variables en RAM
include "math.h" ; 4-Dé finition des variables des fonctions mathé matiques
include "macros.h" ; 5-Dé finition des macros (Affichage LCD, ...)

; include "lcd.h" ; Dé finition pour le LCD


include "aff.h" ; Dé finition pour l’affichage 7 SEGMENTS

;-------------------------------------------------------------------------------
; Dé finition des Vecteurs IT et RESET
;-------------------------------------------------------------------------------

ORG 0x0000 ; l'instruction qui suit est stocké e à l'adresse 0000H


goto Main

;-------------------------------------------------------------------------------
; Programme principal
;-------------------------------------------------------------------------------
Main ORG 00030h ; dé but du code en $0030

call init ; appel sous-prog initialisation gé né rale

Boucle

; LIBgoto tstXXXX ; test de pé riphé riques

goto Programme ; appel du programme de l‘objet technique (sans retour)

ProgStruct.doc JMT 3/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;-------------------------------------------------------------------------------
; Inclusions des Fichiers : pour dé clarer un fichier, enlever le point-virgule
;
; >>> LES FICHIERS MARQUES D'UNE ETOILE (*) NE DOIVENT PAS ETRE MASQUES <<<
;-------------------------------------------------------------------------------
; Nom du Fichier ; Page mé moire Contenu
;
SETPAGE 0 ; origine du code en page 0 (macro) = 0x00xx
include "init.asm" ; 0 * initialisation de base du microprocesseur
include "it.asm" ; 0 * programmes des interruptions
;
;
include "MonProg.asm" ; 0 Fichier Programme de l'objet technique
;
;
SETPAGE 1 ; origine du code en page 1 (macro) = 0x08xx
;
;
;***************** FONCTIONS DE TEST DES LIBRAIRIES ********************
SETPAGE 2 ; origine du code en page 2 (macro)
; include "asserv.asm" ; 2 fonctions pour un asservissement de moteur
; include "cantst.asm" ; 2 test du Convertisseur AN
; include "lcdtst.asm" ; 2 test de l'afficheur LCD
; include "afftst.asm" ; 2 fonctions d'affichage multiplexé à 7 segments
; include "voltst.asm" ; 2 voltmè tre : exemple CAN et LCD
; include "pwmtst.asm" ; 2 test du gé né rateur de PWM (MLI)
; include "hortst.asm" ; 2 test de l'horloge DS1302/06
; include "memtst.asm" ; 2 test de la mé moire DS1302/06
; include "keytst.asm" ; 2 test du clavier 12/16 touches
include "bptst.asm" ; 2 test des boutons poussoirs
; include "afftst.asm" ; 2 test affichage multiplexé à 7 segments
; include "promtst.asm" ; 2 test de l'EEPROM et de la PROM Flash
;
;
;********************** FONCTIONS DES LIBRAIRIES ***********************
SETPAGE 3 ; origine du code en page 3 (macro) = 0x18xx
include "mess.asm" ; 3 * tableaux de messages
include "tempo.asm" ; 3 * fonctions de temporisations
include "convert.asm" ; 3 * fonctions de conversions diverses
include "math.asm" ; 3 * fonctions mathé matiques
include "can.asm" ; 3 * fonctions de conversion Analogique-Numé rique
;
; include "lcd.asm" ; 3 fonctions d'affichage sur le LCD (+ LCD.H !)
include "aff.asm" ; 3 fonctions d'affichage 4 x 7 segments (+ AFF.H !)
; include "pwm.asm" ; 3 fonctions de gestion de la PWM
include "hor.asm" ; 3 fonctions de gestion de l'horloge DS1302/06
; include "mem.asm" ; 3 fonctions de gestion de la mé moire DS1302/06
;
; include "key.asm" ; 3 fonctions de gestion du clavier 12/16 Touches
include "bp.asm" ; 3 fonctions pour 4 boutons poussoirs
; include "prom.asm" ; 3 fonctions de gestion de l'EEPROM et de la PROM Flash
;
;
SETPAGE -1 ; fin du code, termine la pagination

;-------------------------------------------------------------------------------
; Directive de fin de programme
;-------------------------------------------------------------------------------
end

ProgStruct.doc JMT 4/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
LISTE DES FICHIERS DE TEST

; cantst.asm interface convertisseur A/N


; lcdtst.asm interface pour LCD
; afftst.asm interface affichage multiplexé à 7 segments
; voltst.asm voltmè tre utilisant A/N et LCD
; pwmtst.asm systè me de commande PWM
hortst.asm interface circuit horloge DS1306/DS1302
; memtst.asm interface circuit mé moire DS1306/DS1302
; keytst.asm interface clavier 12 touches
; bptst.asm interface pour 4 boutons poussoirs
; promtst.asm interface EEPROM et PROM Flash

DEFINITION DES FONCTIONS DE TEST

;*******************************************************************************
; Fichier : lcdtst.asm
; Date : 27.03.02
; Version : V2.01
;
; né cessite : lcd.asm + lcd.h
;*******************************************************************************
; Programme de test des fonctions de l'afficheur LCD

; tstLCD1 : affiche un message contenu dans une table en ROM


; tstLCD2 : affiche le contenu du port D (en entré e !)
; tstLCD3 : affiche des lines de '*', '-', '+' et '.'
; tstLCD4 : affiche la valeur du convertisseur sur le LCD + le port D
; La conversion est sous IT - né cessite "CAN.ASM"
; L'affichage utilise le Buffer d'é cran et affiche sous IT
;*******************************************************************************

;*******************************************************************************
; Fichier : afftst.asm
; Date : 27.04.02
; Version : V2.01
;
; né cessite le fichier AFF.ASM
;*******************************************************************************
; Programme de test des fonctions d'un affichage multiplexé 7 segments
;
; tstAFF1 : test des sorties BCD
; tstAFF2 : test des sorties de commande des afficheurs
; tstAFF3 : Affiche 12h34 au rythme de une seconde par chiffre
; tstAFF4 : Affiche 17h35 à la vitesse standard : 2 ms par chiffre
;*******************************************************************************

ProgStruct.doc JMT 5/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : cantst.asm
; Date : 27.03.02
; Version : V2.01
;
; né cessite le fichier CAN.ASM
;*******************************************************************************
; Programme de test des fonctions du convertisseur AN
;
; tstCAN1 : appels des fonctions de base.
; tstCAN2 : appel de la fonction de conversion immé diate
; tstCAN3 : utilise la conversion sous IT avec moyenne glissante.
;
; Ces fonctions affichent le ré sultat de conversion sur 8 leds du port D.
; Selon l'é tat de l'entré e RB4, une led parmi 6 est allumé e
; ou la valeur binaire est affiché e.
;
; ==> Voir le fichier volt.asm qui utilise la conversion sur 10 bits.
;*******************************************************************************

;*******************************************************************************
; Fichier : voltst.asm
; Date : 27.03.02
; Version : V2.01
;
; né cessite : can.asm + lcd.asm + lcd.h
;*******************************************************************************
; Programme de test des fonctions Conversion et Affichage LCD
;
; tstVolt1 : affiche la valeur du convertisseur sur le LCD + le port D
; La conversion est sous IT.
; L'affichage utilise le Buffer d'é cran et affiche sous IT
;
; tstVolt2 : mesure la tension broche RA0 et affiche sur le LCD
; la conversion fonctionne sous IT (2ms) et fournit
; une valeur moyenne du ré sultat en mode 8 bits et 10 bits
;
; volt8b : val 8 bits (val1) en val de ddp 3 digits --> 0.00 à 5.00
; volt10b : val 10 bits (val1H + valL) en val de ddp 3 digits --> 0.00 à 5.00
; volt3dig : val 16 bits (val1H + valL) en dé cimal 3 digits (X.YY) --> 0.00 à 5.00
;*******************************************************************************

;*******************************************************************************
; Fichier : pwmtst.asm
; Date : 15.04.02
; Version : V2.01
;
; né cessite le fichier PWM.ASM + CAN.ASM + ASSERV.ASM POUR test 6
;*******************************************************************************
; Programmes de test des fonctions PWM
;
; tstPWM1 : Lance la PWM à f=20kHz et Rapport Cyclique=50 %
; tstPWM2 : fait varier le rapport cyclique de 50 à 100 % - f=20 kHz
; tstPWM3 : permet de ré gler la fré quence et le rapport cyclique.
; La tension sur l'entré e RA0 rè gle
; si RB4=1: la fré quence si RB5=1: le rapport cyclique
;
; * tstPWM4 : Lance la PWM à f= 20kHz et RapCyc ré glable par U(RA0)
; * tstPWM5 : Sé quence de commande du sens de rotation de moteur
; * tstPWM6 : Lance la PWM à f= 20kHz - RapCyc ASSERVI pour 2 volts sur RA0
;*******************************************************************************

ProgStruct.doc JMT 6/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : hortst.asm
; Date : 16.04.02
; Version : V2.01
; né cessite : hortst.asm + hor.asm
; pour les tests 6 et 7 : né cessite en plus : lcd.asm et lcd.h
; pour les tests 8 et 9 : né cessite en plus : aff.asm et aff.h
;*******************************************************************************
; Programme de test des fonctions pour l'horloge DS1302/1306
; tstHOR1 : permet de visualiser une lecture de l'horloge (oscilloscope)
; tstHOR2 : permet de visualiser une é criture vers l'horloge (oscilloscope)
; tstHOR3 : lit et affiche les secondes sur PORTD + sur LCD si connecté !
; tstHOR4 : lit et affiche les secondes sur PORTD + sur LCD si connecté !
; é crit 12s dans l'horloge si RB5=0 (bouton poussoir!)
; active la sortie 1Hz selon les dizaines de secondes (DS1306)
; tstHOR5 : lit et affiche les secondes sur PORTD + sur LCD si connecté !
; ajoute 15 aux secondes si RB5=0 (bouton poussoir!)
; attends RB5=1 pour é crire dans l'horloge
; enlè ve 10 aux secondes si RB4=0 (bouton poussoir!)
; attends RB4=1 pour é crire dans l'horloge
; tstHOR6 : lit et affiche la date complè te sur le LCD (INDISPENSABLE!)
; tstHOR7 : utilise le tableau de donné es pour le transfert des informations
; permet d'effectuer une mise à l'heure de l'horloge (voir hor.asm)
; tstHOR8 : lit et affiche heures et minutes sur le 7 SEGMENTS
; tstHOR9 : utilise le tableau de donné es pour le transfert des informations
;*******************************************************************************

;*******************************************************************************
; Fichier : memtst.asm
; Date : 16.04.02
; Version : V2.01
; né cessite : mem.asm
;*******************************************************************************
; Programme de test des fonctions pour la mé moire DS1302/1306
; tstMEM1 : permet de visualiser une lecture de la mé moire (oscilloscope)
; tstMEM2 : permet de visualiser une é criture dans la mé moire (oscilloscope)
; tstMEM3 : pour visualiser une lecture/é criture de la mé moire à l'oscilloscope
; tstMEM4 : Test de lecture - é criture par Boutons Poussoirs sur RB4 et RB5
; tstMEM5 : é criture et lecture en rafale (burst) - LCD indispensable
; tstMEM6 : idem tstMEM5 MAIS: remplissage de toute la mé moire
;*******************************************************************************

;*******************************************************************************
; Fichier : keytst.asm
; Date : 28.04.02
; Version : V2.01
; né cessite le fichier KEY.ASM + LCD.ASM + LCD.H
;*******************************************************************************
; Programme de test des fonctions de lecture du clavier 12 touches
; tstKEY1 : lit le clavier et affiche la touche appuyé e
; tstKEY2 : attends une touche et affiche la touche appuyé e
;*******************************************************************************

;*******************************************************************************
; Fichier : bptst.asm
; Date : 28.04.02
; Version : V2.01
; né cessite les fichiers : BP.ASM + AFF.ASM + AFF.H
;*******************************************************************************
; Programme de test des fonctions de lecture des boutons poussoirs
; tstBP1 : lit les boutons et affiche le numé ro
; tstBP2 : attends un bouton et affiche le numé ro
; tstBP3 : incré mente les heures ou les minutes si BPplus et BPhrs ou BPmin
;*******************************************************************************
ProgStruct.doc JMT 7/26
Gé nie Electronique – 2iè me année de formation Programmation Structurée
LISTE DES FICHIERS DES LIBRAIRIES

;************************ FICHIERS DE DEFINITION *************************


include "877.h" ; Dé finition des directives de compilation
include "ram.h" ; Dé finition des variables en RAM
include "macros.h" ; Dé finition des macros (Affichage LCD, ...)

;********************* FICHIERS DES LIBRAIRIES COMMUNES *********************


include "init.asm" ; 0 * initialisation de base du microprocesseur
include "it.asm" ; 0 * programmes des interruptions

;********************** FICHIERS DES LIBRAIRIES SPECIFIQUES ******************


include "mess.asm" ; 3 * tableaux de messages
include "tempo.asm" ; 3 * fonctions de temporisations
include "convert.asm" ; 3 * fonctions de conversions diverses
include "math.asm" ; 3 * fonctions mathé matiques
include "can.asm" ; 3 * fonctions de conversion Analogique - Numé rique
include "math.h" ; Dé finition des variables des fonctions mathé matiques
;
; include "lcd.asm" ; 3 fonctions d'affichage sur le LCD
; include "lcd.h" ; Dé finition pour le LCD
include "aff.asm" ; 3 fonctions d'affichage 4 x 7 segments
include "aff.h" ; Dé finition pour le 7 SEGMENTS
; include "pwm.asm" ; 3 fonctions de gestion de la PWM
; include "asserv.asm" ; 2 fonctions pour un asservissement de moteur

include "hor.asm" ; 3 fonctions de gestion de l'horloge DS1302/06


; include "hor.h" ; Dé finition pour l’horloge

; include "mem.asm" ; 3 fonctions de gestion de la mé moire DS1302/06


; include "mem.h" ; Dé finition pour la mé moire
;
; include "key.asm" ; 3 fonctions de gestion du clavier 12/16 Touches
include "bp.asm" ; 3 fonctions pour 4 boutons poussoirs

LES FONCTIONS CONTENUES DANS CES FICHIERS

SONT DEFINIES DANS LES PAGES SUIVANTES

ProgStruct.doc JMT 8/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
FICHIERS DE DEFINITION

;*******************************************************************************
; Fichier : 877.h
; Date : 27.03.02
; Version : V1.01
;*******************************************************************************
; Dé finition des directives de compilation

LIST P=16F877,F=INHX8M,X=OFF ; list directive to define processor

; ERRORLEVEL -301 ; supprime messages de changement de pages


ERRORLEVEL -302 ; supprime messages de vé rification de bank
; ERRORLEVEL -306 ; supprime messages de vé rification de pages
ERRORLEVEL -307 ; supprime messages d'affectation de pages

PROCESSOR 16F877 ; type de microprocesseur

RADIX HEX ; valeurs en hexadé cimal par dé faut !


; RADIX DEC ; valeurs en dé cimal par dé faut !

#include <P16F877.INC> ; Fichier pour les dé finitions spé cifiques

__BADRAM 0x70,0xF0,0x170,0x1F0,0x1EB-0x1EF ; ré servé au programmateur

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC


; __CONFIG H'3F31' ; ----- PIC 16F877 -----
; B13-12: code protection, 11=off
; B11: mode debug, 1=off
; B10: = 1
; B9: Ecriture en Flash par EECON, 1=validé e
; B8: EEPROM protection code, 0=validé e
; B7: Programmation basse tension (RB3), 1=validé e
; B6: Reset enable bit, 1=validé
; B5-4: Code protection, 11=off
; B3: Power Up timer, 0=validé
; B2: Watchdog, 1=validé
; B1-0: OSC SELECT, 01=XT, 11=RC, 10=HS, 00=LP
;
; 13 12 - 11 10 9 8 - 7 6 5 4 - 3 2 1 0
; 11 1 1 1 1-0 0 1 1-0 0 0 1
; 3 F 3 1

__IDLOCS H'1234' ; Octet d'identification

ProgStruct.doc JMT 9/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : ram.h
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Dé finitions des variables par blocs

; Avec l'utilisation de l'é mulateur, les adresses suivantes sont interdites:


; 0x70, 0xF0, 0x170, 0x1F0, 0x1EB à 0x1EF
;*******************************************************************************

;-------------------------------------------------------------------------------
; Zone de 15 octets communes à TOUTES les BANQUES :
; bank 0 : 0x071 à 0x07F |
; bank 1 : 0x0F1 à 0x0FF | au total,
; bank 2 : 0x171 à 0x17F | 15 adresses
; bank 3 : 0x1F1 à 0x1FF |
;-------------------------------------------------------------------------------
CBLOCK 0x071 ; 15 variables : 0x071 à 0x07F
; Variables temporaires pour manipulation d'adresses --- 4
MemAdr:2 ; adresse (pour l'eeprom et la flash)
MemDat:2 ; donné e (pour l'eeprom et la flash)
; pour les interruptions ----------------- 7
Svg_WR ; Sauvegarde W lors d'une interruption
Svg_ST ; Sauvegarde Status lors d'une interruption
Svg_PC ; Sauvegarde PCLATH lors d'une interruption
CptrIt ; compteur des IT du timer 1
SVGintcon ; sauvegarde la configuration des IT
IT1per:2 ; pé riode des IT timer 1 (16 bits)
ENDC
CBLOCK 0x071
MemAdrH,MemAdrL ; | Redé finition pour utilisation
MemDatH,MemDatL ; | un seul octet à la fois !
ENDC
CBLOCK 0x071
MemAdrH,MemAdrL ; | Redé finition pour utilisation
indcar,indtxt ; | avec l'affichage de textes sur LCD !
ENDC

;-------------------------------------------------------------------------------
; RAM BANK0 : 0x020 à 0x07F
; 0x020 à 0x06F : 80 octets
; 0x070 : 1 octet ré servé programmateur
; 0x071 à 0x07F : 15 octets zone commune
;-------------------------------------------------------------------------------
CBLOCK 0x020 ; 80 variables : 0x020 à 0x06F
; pour les programmes de test ------------ 4
TmpVal,TmpAff ; pour les tests
TmpBP,SvgBP ; pour les tests
; pour MON PROGRAMME --------------------- 15
Commande ; Commande du superviseur
Oldcmde ; mé moire ancienne commande
Cmdvit,Sens ; commandes pour le moteur
Oldsens ; mé moire ancienne commande moteur
Courmax ; Valeur du courant maximal
Courtmp ; Variable de calcul
Cour1, Cour2 ; Valeurs de courant max selon la commande
Cour3, Cour4 ; Valeurs de courant max selon la commande
Tempocour ; tempo pour le test courant
Errcour ; drapeau Erreur courant moteur
K7deb, K7fin ; drapeaux dé but et fin de K7
ENDC

ProgStruct.doc JMT 10/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;-------------------------------------------------------------------------------
; RAM BANK1 : 0xA0 à 0x0FF
; 0x0A0 à 0x0EF : 80 octets
; 0x0F0 : 1 octet ré servé programmateur
; 0x0F1 à 0x0FF : 15 octets zone commune
;-------------------------------------------------------------------------------
CBLOCK 0x0A0 ; 80 variables : 0x0A0 à 0x0EF (25)
; pour les fonctions de conversions------- 16
CnvVar:16 ; lcdsup.asm + math.asm + convert.asm
; pour les Temporisations ---------------- 4
Tempo1,Tempo2 ; compteurs et
Tempo3,Tempo4 ; variables temporaires
; pour le Clavier ------------------------ 3
KEYbcd ; valeur de la touche en BCD
KEYascii ; valeur de la touche en Ascii
KEYtmp ; variable temporaire (sauvegarde)
; pour les Boutons ----------------------- 2
BPval ; valeur du port des boutons (1 si appuyé )
BPbusy ; drapeau pour attendre bp relaché
BPtmp ; variable temporaire (sauvegarde)
ENDC

;-------------------------------------------------------------------------------
; RAM BANK02 : 0x110 à 0x17F
; 0x110 à 0x16F : 96 octets
; 0x170 : 1 octet ré servé programmateur
; 0x171 à 0x17F : 15 octets zone commune
;-------------------------------------------------------------------------------
CBLOCK 0x110 ; 96 variables : 0x110 à 0x16F
ENDC

;-------------------------------------------------------------------------------
; RAM BANK3 : 0x190 à 0x1FF
; 0x190 à 0x1EC : 80 octets
; 0x1EB-0x1EF : 5 octets ré servé s programmateur
; 0x1F0 : 1 octet ré servé programmateur
; 0x1F1 à 0x1FF : 15 octets zone commune
;-------------------------------------------------------------------------------
CBLOCK 0x190 ; 92 variables : 0x190 à 0x1EC (90)
; pour l'afficheur LCD sous IT ----------- 33
LCDbuf:0x20 ; buffer de 32 octets
LCDbufptr ; pointeur sur le buffer
; pour l'afficheur LCD ------------------- 5
LCDtmp,LCDcpt ; variables temporaires
LCDind,LCDbus ; index pour les textes, Test busy
LCDvalit ; validation de l'affichage sous IT
; pour l'affichage 7 segments ------------ 6
AFFmin ; nombre de minutes à afficher (00-59)
AFFhrs ; nombre d'heures à afficher (00-23)
AFFnumdig ; mé moire du digit à afficher
AFFtmp ; variable temporaire (calculs)
CptritAff ; Compteur d'it pour l'affichage 7 segments
TempoitAff ; Valeur de Temporisation pour l'affichage
; pour le convertisseur AN --------------- 5
CANtmp ; tempo pour la CAN
CANmoy8 ; valeur moyenne de la conversion sous IT ( 8 bits)
CANmoy16:2 ; valeur moyenne de la conversion sous IT (16 bits)
CANvalit ; validation de la conversion sous IT
; pour la PWM ---------------------------- 6
PWMfre ; valeur de la fré quence en 1/10° kHz
PWMrap ; valeur du Rapport Cyclique
PWMpr2 ; valeur du registre PR2 (fré quence)
PWMcc1 ; valeur du registre CCPR1L (rapport cyclique)
PWMdiv ; sauvegarde du pré diviseur (TMR2div)
PWMtmp ; variable temporaire
ProgStruct.doc JMT 11/26
Gé nie Electronique – 2iè me année de formation Programmation Structurée
; pour l'Asservissement ------------------ 5
ASScon ; Consigne de l'asservissement
ASStmp ; variable temporaire
ASSval ; variable temporaire (valeurs)
CptritAss ; Compteur d'it pour l'asservissement
TempoitAss ; Valeur de Temporisation pour l'asservissement (ms)
; pour l'Horloge ------------------------- 3
HORdata ; donné e à é crire ou lue dans l'horloge
HORtmp ; variable temporaire
HORcpt ; compteur de bits
; pour l'Horloge : Tableau de donné es ---- 15
HORsec ; secondes (00-59)
HORmin ; minutes (00-59)
HORhrs ; heures (00-23)
HORjour ; jours de semaine (01-07)
HORdate ; dates (01-31)
HORmois ; mois (01-12)
HORanne ; anné es (00-99)
HORsecAL0 ; alarme 0 : secondes
HORminAL0 ; alarme 0 : minutes
HORhrsAL0 ; alarme 0 : heures
HORjourAL0 ; alarme 0 : jour de la semaine
HORsecAL1 ; alarme 1 : secondes
HORminAL1 ; alarme 1 : minutes
HORhrsAL1 ; alarme 1 : heures
HORjourAL1 ; alarme 1 : jour de la semaine
; pour la Mé moire ------------------------ 12
MEMdata ; donné e à é crire ou lue dans la mé moire
MEMtmp ; variable temporaire
MEMcpt ; compteur de bits
MEMsize ; taille du transfert en rafale (burst)
MEMtab:8 ; Tableau de donné es pour le burst
ENDC

;*******************************************************************************
; Fichier : macros.h
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Macros de programmation pour la simplification de l'é criture des programmes :
;
; LCDtxt NomMessage : Affichage d'une chaine de caractè res
; LIBcall NomFonction : Appel d'une fonction de la librairie (au lieu de call)
; LIBgoto NomFonction : Appel d'une fonction de la librairie (au lieu de goto)
; Getval <Variable> : Charge dans W la valeur d'une variable
; Setval <Variable> : Charge le contenu de W dans une variable
;
; Macros de pagination :
;
; SETPAGE NumPage : Change la page programme courante
; et vé rifie les dé passements de page !
;
;*******************************************************************************

ProgStruct.doc JMT 12/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
FICHIERS DES LIBRAIRIES COMMUNES

;*******************************************************************************
; Fichier : init.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Routines d'initialisation du microprocesseur
;
; Init : initialisation des ports et des registres
; RazRam : initialisation des zones RAM (mise à zé ro)
; InitPorts : initialisation des ports et registres
;*******************************************************************************

;*******************************************************************************
; Fichier : it.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Programmes des interruptions à placer en page 0 !

; InitItT : initialisation des IT


; Les autres fonctions sont appelé es de maniè re interne :
; ProgIT : programme principal d'interruption
; it_TIMER0 : Programme de l'interruption Timer 0
; it_TIMER1 : Programme de l'interruption Timer 1
; RunItTim1 : relance une pé riode du timer 1
; IT1percal : calcule la pé riode des IT du timer 1
;
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal "dans le bloc commun" :
;
; Svg_WR ; Sauvegarde Registre W lors d'une interruption
; Svg_ST ; Sauvegarde STATUS lors d'une interruption
; Svg_PC ; Sauvegarde PCLATH lors d'une interruption
; CptrIt ; compteur des IT du timer 1
; SVGintcon ; sauve INTCON pour arrê t momentané des IT
; IT1per:2 ; pé riode des IT timer 1 (16 bits)
;*******************************************************************************

;*******************************************************************************
; Fichier : mess.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
;
; Tableaux de messages texte ou de constantes en mé moire ROM
,
; Bienvenue : affiche un message de pré sentation au dé marrage
; Mess0 : Message de bienvenue ligne 1
; Mess1 : Message de bienvenue ligne 2
; Mess2 : Message de bienvenue ligne 1
; Mess3 : Message de bienvenue ligne 2
; Mess4 : Texte de premiè re ligne du voltmè tre
; Mess5 : Texte de base de 2eme ligne du voltmè tre
;*******************************************************************************

ProgStruct.doc JMT 13/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : tempo.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Routines offrant plusieurs temporisations
;
; Tempo10us : temporisation de W fois 10 µs
; Tempo100us : temporisation de W fois 100 µs
; Tempo1ms : temporisation de W fois 1 ms
; Tempo10ms : temporisation de W fois 10 ms
; Tempo100ms : temporisation de W fois 100 ms
; Tempo1s : temporisation de W fois 1 s
; Tempo5ms : temporisation de W fois 5 ms ( basé e sur le quartz )
;
; Wait1s : attends 1 seconde
; Wait2s : attends 2 secondes
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
; Tempo1,Tempo2,Tempo3 ; variables temporaires
;*******************************************************************************

;*******************************************************************************
; Fichier : convert.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Fonctions de conversions diverses
;
; Bin2BCD : Conversion Binaire (8 bits) en BCD (2 digits)
; BinBCD : Conversion Binaire (8 bits) en BCD (3 digits)
; Bin16BCD : Conversion Binaire (16bits) en BCD (5 digits)
;
; B16toBCD : Conversion Binaire (16bits) en BCD (5 digits) (stockage 4 bits)
; BCDto16B : Conversion BCD (5 digits) en Binaire (16 bits) (stockage 4 bits)
;
; Ascii : Conversion de W (en BDC) en son code ascii
; Convdeci : Convertit W (binaire) en dé cimal (1 led parmi 5)
;*******************************************************************************

;*******************************************************************************
; Fichier : math.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Fonctions de calculs mathé matiques
;
; B16add : Addition binaire (16+16->16 bits) : val1 = val1 + val2
; B16sub : Soustraction binaire (16-16->16 bits) : val1 = val1 - val2
;
; mul816 : Multiplication ( 8 x 8 -> 16) : val1 = val1L x val2L
; mul1616 : Multiplication (16 x 16 -> 16) : val1 = val1 * val2
; mul1632 : Multiplication (16 x 16 -> 32) : val1(Hi) & val2(Lo) = val1 x val2
;
; div1616 : Division (16/16->16 bits) : val1 = val1 / val2 (reste)
;
; BCDadd : Addition de deux nombres BCD : val2=val1+val2 (val1 = centaines)
; BCDsub : Soustraction de deux nombres BCD : val2=val2-val1 (val1=1 si né gatif)
;*******************************************************************************

ProgStruct.doc JMT 14/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : math.h
; Date : 27.03.02
; Version : V1.01
;*******************************************************************************
; Dé finition des variables pour les fonctions contenues dans les fichiers :
; lcdsup.asm math.asm convert.asm
;*******************************************************************************
CBLOCK 0x0A0 ; 16 variables en bank 1 : 0x0A0 à 0x0AF
val1:2 ; variable 16 bits pour conversions et calculs
val2:2 ; variable 16 bits pour conversions et calculs
reste:2 ; reste (16 bits) pour division sur 16 bits
result:2 ; ré sultat (16 bits) pour calculs sur 16 bits
dixmil,mille ; ré sultat de conversion binaire --> BCD
cent,dix,un ; ré sultat de conversion binaire --> BCD
cnt ; compteur pour division et multiplication 16 bits
cmpval ; variable pour les comparaisons
ENDC
CBLOCK 0x0A0 ; 16 variables en bank 1 : 0x0A0 à 0x0AF
val1H ; variable 16 bits pour conversions et calculs
val1L ; variable 16 bits pour conversions et calculs
val2H ; variable 16 bits pour conversions et calculs
val2L ; variable 16 bits pour conversions et calculs
resteH ; reste (16 bits) pour division sur 16 bits
resteL ; reste (16 bits) pour division sur 16 bits
resultH ; ré sultat (16 bits) pour calculs sur 16 bits
resultL ; ré sultat (16 bits) pour calculs sur 16 bits
dixmil,mille ; ré sultat de conversion binaire --> BCD
cent,dix,un ; ré sultat de conversion binaire --> BCD
cnt ; compteur pour division et multiplication 16 bits
cmpval ; variable pour les comparaisons
ENDC
math EQU 0x0A0 ; pour les banksel avant les calculs !

;*******************************************************************************
; Fichier : can.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour la conversion anlogique - numé rique
;
; CANinit : initialisation du convertisseur
; CANconv : effectue une conversion 8 bits et fournit le ré sultat dans W
; CANstart : lance une nouvelle conversion
; CANbusy : teste l'é tat de la conversion
; CANwait : attend la fin de la conversion
; CANread : renvoie (W) le ré sultat de la conversion sur 8 bits (MSB)
; CANreadl : renvoie (W) le ré sultat de la conversion : 2 LSB sup!
;
; Conversions avec moyenne glissante : utilisent le TIMER 1 sous IT
; CANinitit : initialise la conversion sous IT (1 ms)
; CANit : calcule la valeur moyenne de conversion durant l'IT
; CANvmoy8 : renvoie la valeur moyenne de conversion sur 8 bits (dans W)
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
; CANmoy8 ; = valeur moyenne de la conversion sous IT ( 8 bits)
; CANmoy16:2 ; = valeur moyenne de la conversion sous IT (16 bits)
; CANtmp ; tempo pour la CAN
; CANvalit ; validation de la conversion sous IT
;*******************************************************************************
; CABLAGE : RA0 = Entré e analogique
; RA2 = Ré fé rence né gative (si dé fini par la commande CANinit)
; RA3 = Ré fé rence positive (si dé fini par la commande CANinit)
;*******************************************************************************
ProgStruct.doc JMT 15/26
Gé nie Electronique – 2iè me année de formation Programmation Structurée
FICHIERS DES LIBRAIRIES SPECIFIQUES
;*******************************************************************************
; Fichier : lcd.asm
; Date : 27.03.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour un afficheur LCD 2 lignes de 16 car en mode 4 Bits.
; Controleur de type KS0066.
;
; LCDinit : initialisation de l'afficheur
; LCDcls : efface tout l'afficheur
; LCDcar : é crit un caractè re ( contenu dans W ) sur l'afficheur
; LCDcmd : envoie une commande ( contenue dans W) à l'afficheur
; LCDhome : positionne le curseur en haut à gauche
; LCDcls1 : efface la ligne 1 de l'afficheur et va au dé but
; LCDcls2 : efface la ligne 2 de l'afficheur et va au dé but
; LCDlin1 : positionne le curseur au debut de la ligne 1
; LCDlin2 : positionne le curseur au debut de la ligne 2
; LDCpos1 : dé place le curseur à la position W ligne 1
; LDCpos2 : dé place le curseur à la position W ligne 2
;; >> Pour les affichages avec dé codage et pour les textes, voir lcdsup.asm <<
;; LCDwaitBusy : Attends la fin du Busy du LCD (si busy cablé !)
; LCDtstBusy : Teste le Busy du LCD (renvoie W=0 si LCD disponible)
;
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
;; LCDtmp,LCDcpt ; variables temporaires
; LCDind,LCDbus ; index pour les textes, Test busy
; LCDvalit ; validation de l'affichage sous IT
;*******************************************************************************

;*******************************************************************************
; Fichier : lcdsup.asm
; Date : 27.03.02
; Version : V2.01
;********************************************************************************
; Fonctions de conversions directes et d'affichage sur le LCD
;
; Pour des nombres bcd -----------------------
; LCDAff2bcd : Affiche deux chiffres BCD : W<7-4>=dizaines - W<3-0>=unité s
;
; Pour des nombres binaires -----------------------
; LCDbcd5 : binaire 16 bits ( val1 ) en decimal 5 digits --> 00000 à 65535
; LCDbcd4 : binaire 16 bits ( val1 ) en decimal 4 digits --> 0000 à 9999
; LCDbcd3 : binaire 8 bits ( W ) en decimal 3 digits --> 000 à 255
; LCDbcd2 : binaire 8 bits ( W ) en decimal 2 digits --> 0 à 99
; LCDbcd1 : binaire 4 bits ( W ) en decimal 1 digits --> 0 à 9
; LCDaff5d : affiche 5 digits bcd contenus dans dixmil, mille, cent, dix, un
; LCDaff4d : affiche 4 digits bcd contenus dans mille, cent, dix, un
; LCDaff3d : affiche 3 digits bcd contenus dans cent, dix, un
; LCDaff2d : affiche 2 digits bcd contenus dans dix, un
; LCDaff1d : affiche 1 digit bcd contenu dans un
; LCDbin8 : affiche valeur 8 bits ( W ) en binaire --> 00000000
; LCDhex8 : affiche valeur 8 bits ( W ) en hexadecimal 2 digits --> 00 à FF
;
; Pour des textes ------------------------
; GetTabTxtAdr : Cherche l'adresse du texte N° W dans un tableau de textes
; LCDAffTxt : Affiche un texte sur le LCD (MemAdrH + MemAdrL = adresse)
; LCDtxt NomTxt : Affiche le texte 'NomTxt' (dé finie dans MACROS.H)
; LCDAffNomJour : Affiche le nom du jour ( W = numé ro du jour de 1 à 7 )
;
;*******************************************************************************
ProgStruct.doc JMT 16/26
Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : lcd.h
; Date : 27.03.02
; Version : V1.01
;*******************************************************************************
; Dé finition de constantes et du câ blage pour l'afficheur LCD
;
; Fonctionne avec un PIC 16F84 ou un PIC 16F877
;*******************************************************************************

; Câ blage de la connexion R/W


;
;LCD_RW_ON SET TRUE ; TRUE : contrô le installé
LCD_RW_ON SET FALSE ; FALSE : contrô le PAS installé
;*******************************************************************************

;-------------------------------------------------------------------------------
; Signaux de contrô le et de donné es
;-------------------------------------------------------------------------------
LCD_DATA EQU PORTB; Port des donné es pour le LCD : <D4:D7> = RB<0:3>
LCD_DATA_TRIS EQU TRISB ; Direction du port LCD : RB<3;0>

LCD_CNTL EQU PORTA; Port du bus de commande du LCD <RS,RW,E>


LCD_CNTL_TRIS EQU TRISA ; Direction du port LCD de commande du LCD

LCD_RS EQU 4 ; LCD: Ligne de Sé lection de l'afficheur


LCD_RW EQU 5 ; LCD: Ligne de Lecture/Ecriture de l'afficheur
LCD_E EQU 1 ; LCD: Ligne de Synchronisation de l'afficheur
;-------------------------------------------------------------------------------
; Câ blage du module LCD pour PIC 16F877
;-------------------------------------------------------------------------------
; Pin LCD : 4 5 6 - 11 12 13 14
; Signal : RS RW E - D0 D1 D2 D3
; Port : RA4 RA5 RA1 - RB0 RB1 RB2 RB3
; Pin Pic : 6 7 3 - 33 34 35 36

;*******************************************************************************
; Codes de Commande pour le LCD
;*******************************************************************************
LINE1 EQU 0x80 ; Curseur au dé but de la ligne 1
LINE2 EQU 0xC0 ; Curseur au dé but de la ligne 2
DISP_ON EQU 0x0C ; Display on
DISP_ON_C EQU 0x0E ; Display on, Cursor on
DISP_ON_B EQU 0x0F ; Display on, Cursor on, Blink cursor
DISP_OFF EQU 0x08 ; Display off

LCD_MODE EQU 0x28 ; Commande 4-bit, 2 lignes, Font 5x7


LCD_MODE2 EQU 0x2C ; Commande 4-bit, 2 lignes, Font 5x10

CLR_LCD EQU 0x01 ; Efface l'é cran


LCD_HOME EQU 0x02 ; Haut gauche de l'é cran

CURS_INC EQU 0x06 ; Avance curseur


CURS_INC_S EQU 0x07 ; Avance curseur + insertion
CURS_DEC EQU 0x04 ; Recul curseur
CURS_DEC_S EQU 0x05 ; Recul curseur + insertion

ProgStruct.doc JMT 17/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : aff.asm
; Date : 27.04.02
; Version : V1.01
;*******************************************************************************
; Fonctions pour un affichage 4 digits 7 segments
;
; AFFinit : Initialisation de l'affichage 7 segments multiplexé
; AFFiche : Toutes les 4 ms, change le digit actif et affiche le code
; AFFsetDigit : Active le digit selon AFFnumdig. é teint si W=0
; AFFsetCode : Affecte W<3:0> sur les sorties BCD
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
;
; AFFmin ; nombre de minutes à afficher (00-59)
; AFFhrs ; nombre d'heures à afficher (00-23)
; AFFnumdig ; mé moire du digit à afficher
; AFFtmp ; variable temporaire (calculs)
; CptritAff ; Compteur d'it pour l'affichage 7 segments
; TempoitAff ; Valeur de Temporisation pour l'affichage
;*******************************************************************************
; LES CONSTANTES ET LE CABLAGE sont dé finies dans le fichier <aff.h> :
;*******************************************************************************

;*******************************************************************************
; Fichier : aff.h
; Date : 28.04.02
; Version : V1.01
;*******************************************************************************
; Dé finition de constantes et du câ blage pour l'afficheur 7 segments

AFF_BCD EQU PORTC; Port des sorties du code BCD


AFF_BCD_TRIS EQU TRISC ; Direction du port des sorties du code BCD
AFF_BCD0 EQU 0 ; RC0 = bit 0 du code BCD
AFF_BCD1 EQU 1 ; RC1 = bit 1 du code BCD
AFF_BCD2 EQU 2 ; RC2 = bit 2 du code BCD
AFF_BCD3 EQU 3 ; RC3 = bit 3 du code BCD
AFF_BCDS EQU 0x0F ; masque pour les sorties du code BCD

AFF_DIGIT EQU PORTC; Port de sé lection de l'afficheur


AFF_DIGIT_TRIS EQU TRISC ; Direction du port de sé lection de l'afficheur
AFF_DH EQU 7 ; RC7 = afficheur des dizaines d'heures
AFF_UH EQU 6 ; RC6 = afficheur des unité s d'heures
AFF_DM EQU 5 ; RC5 = afficheur des dizaines de minutes
AFF_UM EQU 4 ; RC4 = afficheur des unité s de minutes
AFF_DIGITS EQU 0xF0 ; masque pour les sorties commande de digits
;*******************************************************************************

ProgStruct.doc JMT 18/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : pwm.asm
; Date : 14.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour la sortie d'un signal PWM sur RC2 et la commande d'un moteur
;; PWMinit : initialise la sortie PWM (RC=50%) (fré quence 10 kHz)
; PWMfin : mets la sortie PWM en haute impé dance et arrê te la PWM
; PWMfreq : modifie la fré quence de la PWM (W en 1/10° kHz)
; PWMrapc : modifie le rapport cyclique (W en 1/2 %)
; PWMplus : aumente le rapport cyclique de la valeur de W (1/2 %)
; PWMmoins : diminue le rapport cyclique de la valeur de W (1/2 %)
; PWMmin : aumente le rapport cyclique à la valeur minimale
; PWMmax : diminue le rapport cyclique à la valeur maximale
; Ces fonctions permettent la commande directe du moteur :
; MOTinit : initialise les sorties RC0-RC1 à 0 pour le moteur
; MOTfin : mets les sorties RC0-RC1 en haute impé dance
; MOTstop : arrê te le moteur RC0=0 - RC1=0
; MOTsens1 : affecte les sorties RC0=0 - RC1=1 pour le sens de rotation 1
; MOTsens2 : affecte les sorties RC0=1 - RC1=0 pour le sens de rotation 2
; MOTsens : affecte les sorties RC0-RC1 pour dé finir le sens de rotation
; W=0 : arrê t moteur W=1: sens 1 W=2: sens 2
;;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
;; PWMfre ; valeur de la fré quence en 1/10° kHz
; PWMpr2 ; valeur du registre PR2 (=pé riode)
; PWMrap ; valeur du rapport cyclique en %
; PWMcc1 ; valeur du registre CCPR1L (=niveau haut)
; PWMdiv ; sauvegarde du pré diviseur (TMR2div)
; PWMtmp ; variable temporaire
;;*******************************************************************************
; CABLAGE :
; RC0 = MOT_S1 : sortie 1 de commande du moteur
; RC1 = MOT_S2 : sortie 2 de commande du moteur
; RC2 = PWM_EN : sortie de validation du moteur
;;*******************************************************************************
; Dé finition des signaux de contrô le
MOT_CTRL EQU PORTC; Port des donné es pour le Moteur
MOT_CTRL_TRIS EQU TRISC ; Direction du port Moteur
MOT_S1 EQU 0 ; sortie 1 de commande du moteur
MOT_S2 EQU 1 ; sortie 2 de commande du moteur
PWM_EN EQU 2 ; sortie de validation du moteur
;*******************************************************************************

;*******************************************************************************
; Fichier : asserv.asm
; Date : 13.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour un asservissement de moteur en PWM
; ASSinit : Initialise l'asservissement du moteur
; ASSmot : Fonction d'asservissement
; Fonctions internes (en mode 10 bits uniquement) :
; PWMcor2LSB : corrige les 2 LSB pour le rapport cyclique
; PWMget2LSB : lit (W) les 2 LSB pour le rapport cyclique
; PWMset2LSB : affecte les 2 LSB pour le rapport cyclique
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
; ASScon ; Consigne de l'asservissement
; ASStmp ; variable temporaire (calcul - signe)
; ASSval ; variable temporaire (mesure - é cart)
; CptritAss ; Compteur d'it pour l'asservissement
; TempoitAss ; Valeur de Temporisation pour l'asservissement (ms)
;*******************************************************************************

ProgStruct.doc JMT 19/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : hor.asm
; Date : 16.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour une horloge temps ré el type DS1306/DS1302
;
; FONCTIONS DE BASE ---------------------------------------
; HORinit : Initialisation de l'horloge
; HOR1HzON : Valide la sortie 1Hz de l'horloge ==> DS1306 uniquement
; HOR1HzOFF : Dé sactive la sortie 1Hz de l'horloge ==> DS1306 uniquement
; HORsetdata : Sauve W dans la variable HORdata (donné e à envoyer)
; HORstart : initialise un é change avec l'horloge
; HORstop : termine un é change avec l'horloge
; HORread : lit le contenu de l'adresse W et le retourne dans W + HORdata
; HORwrite : é crit le contenu de HORdata à l'adresse contenue dans W
; HORrd8b : lit 8 bits dans l'horloge, renvoyé s dans W
; HORwr8b : é crit 8 bits (W) dans l'horloge
;
; FONCTIONS DE LECTURE DIRECTE DE L'HORLOGE ---------------
; HORgetSEC : lit les secondes W<7-4>=dizaines W<3-0>=unité s (00-59)
; HORgetMIN : lit les minutes W<7-4>=dizaines W<3-0>=unité s (00-59)
; HORgetHRS : lit les heures W<5-4>=dizaines W<3-0>=unité s (00-23)
; HORgetJOUR : lit le jour (L-D) W<7-4>= -- W<2-0>=unité s (01-07)
; HORgetDATE : lit la date W<5-4>=dizaines W<3-0>=unité s (01-31)
; HORgetMOIS : lit le mois W<5-4>=dizaines W<3-0>=unité s (01-12)
; HORgetANNE : lit l'anné e W<7-4>=dizaines W<3-0>=unité s (00-99)
;
; FONCTIONS D'ECRITURE DIRECTE DANS L'HORLOGE -------------
; ! ! !AUCUN CONTROLE DES VALEURS N'EST EFFECTUE ! ! !
;
; HORsetSEC : é crit les secondes W<7-4>=dizaines W<3-0>=unité s (00-59)
; HORsetMIN : é crit les minutes W<7-4>=dizaines W<3-0>=unité s (00-59)
; HORsetHRS : é crit les heures W<5-4>=dizaines W<3-0>=unité s (00-23)
; HORsetJOUR : é crit le jour (L-D) W<7-4>= -- W<2-0>=unité s (01-07)
; HORsetDATE : é crit la date W<5-4>=dizaines W<3-0>=unité s (01-31)
; HORsetMOIS : é crit le mois W<5-4>=dizaines W<3-0>=unité s (01-12)
; HORsetANNE : é crit l'anné e W<7-4>=dizaines W<3-0>=unité s (00-99)
;
;*******************************************************************************
; UTILISATION PREFERENTIELLE
;
; FONCTIONS UTILISANT LE TABLEAU DE DATES (mode burst) -----
; HORlit : lit la date complè te et renseigne le tableau HORtab
; HORecrit : é crit la date complè te du tableau HORtab dans l'horloge
; ( NOTE : HORtab est dé fini ci-dessous )
;
; FONCTIONS DE CALCULS SUR LES DONNEES ---------------------
; HORinc : incré mente la valeur de W (en BCD)
; HORinc60 : incré mente la valeur de W et gè re le dé passement de 60
; HORinc24 : incré mente la valeur de W et gè re le dé passement de 24
; HORinc12 : incré mente la valeur de W et gè re le dé passement de 12
; HORinc31 : incré mente la valeur de W et gè re le dé passement de 31
; HORinc7 : incré mente la valeur de W et gè re le dé passement de 7
;
;*******************************************************************************
;
; LES CONSTANTES sont dé finies dans le fichier <hor.h>
;
;*******************************************************************************

ProgStruct.doc JMT 20/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal (RAM.H)
;
; Variables communes aux fonctions ------------------------ 3
; HORdata ; donné e à é crire ou lue dans l'horloge
; HORtmp ; variable temporaire
; HORcpt ; compteur de bits
;
; TABLEAU HORtab: ------------------------------------ 15
; ** L'ORDRE NE DOIT PAS ETRE CHANGE A CAUSE DE L'ACCES EN BURST **
; HORsec ; secondes (00-59)
; HORmin ; minutes (00-59)
; HORhrs ; heures (00-23)
; HORjour ; jours de semaine (01-07)
; HORdate ; dates (01-31)
; HORmois ; mois (01-12)
; HORanne ; anné es (00-99)
; HORsecAL0 ; alarme 0 : secondes
; HORminAL0 ; alarme 0 : minutes
; HORhrsAL0 ; alarme 0 : heures
; HORjourAL0 ; alarme 0 : jour de la semaine
; HORsecAL1 ; alarme 1 : secondes
; HORminAL1 ; alarme 1 : minutes
; HORhrsAL1 ; alarme 1 : heures
; HORjourAL1 ; alarme 1 : jour de la semaine
;*******************************************************************************
; CABLAGE :
; RA0 = HOR_CEN : sé lection du circuit horloge 'Chip Enable'
; RA2 = HOR_CLK : horloge de sé quencement des transferts
; RA3 = MOT_DAT : entré e/sortie des donné es
;*******************************************************************************

;*******************************************************************************
; Fichier : hor.h
; Date : 16.04.02
; Version : V1.01
;*******************************************************************************
; Dé finition de constantes pour l'horloge type DS1306 ou 1302
;
; Fonctionne avec un PIC 16F84 ou un PIC 16F877
;*******************************************************************************
; Choix du circuit horloge DS1302 ou DS1306
;
;DS13xx SET 1302 ; le circuit d'horloge est un DS1302 <<---
DS13xx SET 1306 ; le circuit d'horloge est un DS1306 <<---
;*******************************************************************************
; Signaux de contrô le et de donné es
HOR_PORT EQU PORTA; Port utilisé pour l'horloge
HOR_TRIS EQU TRISA ; Port de direction pour l'horloge

HOR_CEN EQU 0 ; Bit de sé lection 'Chip Enable'


HOR_CLK EQU 2 ; Bit d'horloge 'Serial Clock'
HOR_DAT EQU 3 ; Bit de donné es 'In-Out'
;*******************************************************************************
; Câ blage de l'horloge pour PIC 16F877
; DS1306 : 10 11 12
; DS1302 : 5 7 6
; Signal : CEN CLK DAT
; Port : RA0 RA2 RA3
; Pin Pic : 2 4 5
ProgStruct.doc JMT 21/26
Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
IF DS13xx == 1306 ; Dé finition des adresses des registres de l'horloge DS1306
;-------------------------------------------------------------------------------
HOR_SEC EQU 0x00 ; registre des secondes (00-59)
HOR_MIN EQU 0x01 ; registre des minutes (00-59)
HOR_HRS EQU 0x02 ; registre des heures (00-23)
HOR_JOUR EQU 0x03 ; registre des jours de la semaine (01-07)
HOR_DATE EQU 0x04 ; registre des dates dans le mois (01-31)
HOR_MOIS EQU 0x05 ; registre des mois (01-12)
HOR_ANNE EQU 0x06 ; registre des anné es (00-99)
HOR_SECal0 EQU 0x07 ; registre d'alarme 0 : secondes
HOR_MINal0 EQU 0x08 ; registre d'alarme 0 : minutes
HOR_HRSal0 EQU 0x09 ; registre d'alarme 0 : heures
HOR_DAYal0 EQU 0x0A ; registre d'alarme 0 : jour de la semaine
HOR_SECal1 EQU 0x0B ; registre d'alarme 1 : secondes
HOR_MINal1 EQU 0x0C ; registre d'alarme 1 : minutes
HOR_HRSal1 EQU 0x0D ; registre d'alarme 1 : heures
HOR_DAYal1 EQU 0x0E ; registre d'alarme 1 : jour de la semaine

; bits 7 6 5 4 3 2 1 0
HOR_CTRL EQU 0x0F ; registre de contrô le 0 WP 0 0 0 1Hz Al1 Al0
HOR_STATUS EQU 0x10 ; registre d'é tat 0 0 0 0 0 0 it1 it2
HOR_CHARGE EQU 0x11 ; registre de charge TC TC TC TC DS DS RS RS
; TC: charge 1010=on xxxx=off
; DS: diodes 01=1 - 10=2 - 00=11=off
; RS: ré sist 01=2k - 10=4k - 11=8k - 00=off

HOR_CLKburst EQU 0x00 ; adresse de dé but du burst horloge


HOR_CLKsize EQU d'15' ; nombre d'octets pour le burst horloge

HOR_1Hz EQU 0x04 ; Validation de la sortie 1Hz (bit2=1: marche)


HOR_WP EQU 0x40 ; Write Protect (bit6=1 : interdiction é criture)
HOR_RW EQU 0x80 ; masque de lecture-é criture (bit7=1 : é criture)
ENDIF ;************************************************************************

;*******************************************************************************
IF DS13xx == 1302 ; Dé finition des adresses des registres de l'horloge DS1302
;-------------------------------------------------------------------------------
HOR_SEC EQU 0x80 ; registre des secondes (00-59)
HOR_MIN EQU 0x82 ; registre des minutes (00-59)
HOR_HRS EQU 0x84 ; registre des heures (00-23)
HOR_JOUR EQU 0x8A ; registre des jours de la semaine (01-07)
HOR_DATE EQU 0x86 ; registre des dates dans le mois (01-31)
HOR_MOIS EQU 0x88 ; registre des mois (01-12)
HOR_ANNE EQU 0x8C ; registre des anné es (00-99)

; bits 7 6 5 4 3 2 1 0
HOR_CTRL EQU 0x8E ; registre de contrô le WP 0 0 0 0 0 0 0
HOR_CHARGE EQU 0x90 ; registre de charge TC TC TC TC DS DS RS RS
; TC: charge 1010=on xxxx=off
; DS: diodes 01=1 - 10=2 - 00=11=off
; RS: ré sist 01=2k - 10=4k - 11=8k - 00=off

HOR_CLKburst EQU 0xBE ; adresse de dé but du burst horloge


HOR_CLKsize EQU d'8' ; nombre d'octets pour le burst horloge

HOR_HALT EQU 0x80 ; Arrê t de l'horloge (bit7=1 : arrê t) (secondes)


HOR_WP EQU 0x80 ; Write Protect (bit7=1 : interdiction é criture)
HOR_RW EQU 0x01 ; masque de lecture-é criture (bit0=1 : lecture)

jour1302 equ HORmois


date1302 equ HORjour ; les jours, date et mois ne sont pas stocké s
mois1302 equ HORdate ; dans le mê me ordre que pour le DS1306 !
ENDIF ;************************************************************************

ProgStruct.doc JMT 22/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : mem.asm
; Date : 17.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour une mé moire type DS1306/DS1302
;
; FONCTIONS DE BASE ---------------------------------------
; * MEMinit : Initialisation de l'accè s à la mé moire
; MEMsetdata : Sauve W dans la variable MEMdata (donné e à envoyer)
; MEMstart : initialise un é change avec la mé moire
; MEMstop : termine un é change avec la mé moire
; * MEMread : lit le contenu de l'adresse W et le retourne dans W + MEMdata
; * MEMwrite : é crit le contenu de MEMdata à l'adresse contenue dans W
; MEMrd8b : lit 8 bits dans la mé moire, renvoyé s dans W
; MEMwr8b : é crit 8 bits (W) dans la mé moire
;
; FONCTIONS UTILISANT LE MODE BURST -----------------------
; MEMlitbloc : lit la mé moire par blocs en mode rafale (burst)
; MEMecritbloc : é crit la mé moire par blocs en mode rafale (burst)
; * MEMfill : remplit TOUTE la mé moire avec la valeur dans W
;
; ( NOTE : MEMtab est dé fini ci-dessous )
;
;*******************************************************************************
; LES CONSTANTES sont dé finies dans le fichier <mem.h>
;
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal (RAM.H)
;
; MEMdata ; donné e à é crire ou lue dans la mé moire
; MEMtmp ; variable temporaire
; MEMcpt ; compteur de bits
; MEMsize ; taille du transfert en rafale (burst)
; MEMtab:31 ; Tableau de donné es pour le burst
;
;*******************************************************************************
; CABLAGE :
; RA0 = MEM_CEN : sé lection du circuit mé moire 'Chip Enable'
; RA2 = MEM_CLK : horloge de sé quencement des transferts
; RA3 = MEM_DAT : entré e/sortie des donné es
;
;*******************************************************************************

;*******************************************************************************
; Fichier : mem.h
; Date : 16.04.02
; Version : V1.01
;*******************************************************************************
; Dé finition de constantes pour la mé moire type DS1306 ou 1302
;
;
;*******************************************************************************
; Choix du circuit mé moire DS1302 ou DS1306
;
;DS13xx SET 1302 ; le circuit d'horloge est un DS1302 <<---
DS13xx SET 1306 ; le circuit d'horloge est un DS1306 <<---
;*******************************************************************************

ProgStruct.doc JMT 23/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;-------------------------------------------------------------------------------
; Signaux de contrô le et de donné es
;-------------------------------------------------------------------------------
MEM_PORT EQU PORTA; Port utilisé pour la mé moire
MEM_TRIS EQU TRISA ; Port de direction pour la mé moire

MEM_CEN EQU 0 ; Bit de sé lection 'Chip Enable'


MEM_CLK EQU 2 ; Bit d'horloge 'Serial Clock'
MEM_DAT EQU 3 ; Bit de donné es 'In-Out'
;-------------------------------------------------------------------------------
; Câ blage de la mé moire pour PIC 16F877
;-------------------------------------------------------------------------------
; DS1306 : 10 11 12
; DS1302 : 5 7 6
; Signal : CEN CLK DAT
; Port : RA0 RA2 RA3
; Pin Pic : 2 4 5

;*******************************************************************************
IF DS13xx == 1306 ; Dé finition des adresses des registres de la mé moire DS1306
;-------------------------------------------------------------------------------
; bits 7 6 5 4 3 2 1 0
MEM_CTRL EQU 0x0F ; registre de contrô le 0 WP 0 0 0 1Hz Al1 Al0
MEM_CHARGE EQU 0x11 ; registre de charge TC TC TC TC DS DS RS RS
; TC: charge 1010=on xxxx=off
; DS: diodes 01=1 - 10=2 - 00=11=off
; RS: ré sist 01=2k - 10=4k - 11=8k - 00=off

MEM_RAMdeb EQU 0x20 ; dé but de la zone RAM (0x00)


MEM_RAMfin EQU 0x7F ; fin de la zone RAM (0x5F)

MEM_RAMburst EQU 0x20 ; adresse de dé but du burst RAM


MEM_RAMsize EQU 0x60 ; 96 d'octets pour le burst RAM

MEM_WP EQU 0x40 ; Write Protect (bit6=1 : interdiction é criture)


MEM_RW EQU 0x80 ; masque de lecture-é criture (bit7=1 : é criture)
ENDIF ;************************************************************************

;*******************************************************************************
IF DS13xx == 1302 ; Dé finition des adresses des registres de la mé moire DS1302
;-------------------------------------------------------------------------------
; bits 7 6 5 4 3 2 1 0
MEM_CTRL EQU 0x8E ; registre de contrô le WP 0 0 0 0 0 0 0
MEM_CHARGE EQU 0x90 ; registre de charge TC TC TC TC DS DS RS RS
; TC: charge 1010=on xxxx=off
; DS: diodes 01=1 - 10=2 - 00=11=off
; RS: ré sist 01=2k - 10=4k - 11=8k - 00=off

MEM_RAMdeb EQU 0xC0 ; dé but de la zone RAM (0x00)


MEM_RAMfin EQU 0xFC ; fin de la zone RAM (0x1E)

MEM_RAMburst EQU 0xFE ; adresse de dé but du burst RAM


MEM_RAMsize EQU 0x20 ; Attention : 31 d'octets pour le burst RAM

MEM_WP EQU 0x80 ; Write Protect (bit7=1 : interdiction é criture)


MEM_RW EQU 0x01 ; masque de lecture-é criture (bit0=1 : lecture)
ENDIF ;************************************************************************

ProgStruct.doc JMT 24/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : key.asm
; Date : 28.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour un clavier de 12 touches
;
; KEYinit : Initialisation du clavier
; KEYtst : Teste si une touche est appuyé e, renvoie W=0 si aucune
; KEYlitnum : Renvoie W = numé ro de touche (sans tester clavier!)
; KEYwait : Attends une touche et renvoie W = numé ro de touche
;
; KEYlitval : si une touche est appuyé e, affecte les variables
;
; KEYsetBCD : transforme W (le numé ro de touche) en un code BCD
; KEYsetAscii : transforme le numé ro de touche en un code Ascii
; KEYtrancode : renvoie dans W l'octet numé ro W d'un tableau
;
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
;
; KEYbcd ; valeur de la touche en BCD
; KEYascii ; valeur de la touche en Ascii
; KEYtmp ; variable temporaire (sauvegarde)
;
;*******************************************************************************
; CABLAGE :
; RC0 = KEY_DATA0 ; bit 0
; RC0 = KEY_DATA1 ; bit 1
; RC0 = KEY_DATA2 ; bit 2
; RC0 = KEY_DATA3 ; bit 3
; RC0 = KEY_RECU ; data available
; RC0 = KEY_OE ; output enable
;
;*******************************************************************************
; Dé finition des signaux de contrô le

KEY_PORT EQU PORTC; Port du clavier


KEY_TRIS EQU TRISC ; Direction du port du clavier

KEY_DATA0 EQU 0 ; RC0 = bit 0 du code fourni par le clavier


KEY_DATA1 EQU 1 ; RC1 = bit 1 du code fourni par le clavier
KEY_DATA2 EQU 2 ; RC2 = bit 2 du code fourni par le clavier
KEY_DATA3 EQU 3 ; RC3 = bit 3 du code fourni par le clavier
KEY_DATAS EQU 0x0F ; masque pour les entré es du code clavier

KEY_OK EQU 4 ; RC4 = entré e touche appuyé e


KEY_OE EQU 5 ; RC5 = sortie de sé lection du clavier (enable)

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

ProgStruct.doc JMT 25/26


Gé nie Electronique – 2iè me année de formation Programmation Structurée
;*******************************************************************************
; Fichier : bp.asm
; Date : 28.04.02
; Version : V2.01
;*******************************************************************************
; Fonctions pour 4 boutons poussoirs
;
; BPinit : Initialisation du clavier
; BPlitval : Renvoie le numé ro du bouton dans W = 1, 2, 4, 8 ou 0 si aucun
; ==> attends que le bouton soit relâ ché avant de terminer
; BPwait : Attends un bouton et renvoie W = 1, 2, 4 ou 8
; BPisbps : renvoie W = bit du bouton si appuyé , sinon 0
; BPishrs : renvoie W = bit du bouton heures appuyé (sinon 0)
; BPismin : renvoie W = bit du bouton minutes appuyé (sinon 0)
; BPispls : renvoie W = bit du bouton plus appuyé (sinon 0)
; BPismns : renvoie W = bit du bouton moins appuyé (sinon 0)
; BPtst : recoit = masque du bouton, renvoie W diffé rent de 0 si bp
;*******************************************************************************
; VARIABLES à dé finir dans le programme principal :
;
; BPval ; valeur du port des boutons (1 si appuyé )
; BPbusy ; drapeau pour attendre bp relâ ché
; BPtmp ; variable temporaire (sauvegarde)
;*******************************************************************************
; CABLAGE :
; tirage de 10K au + 5V, BP vers la masse : appuyé => 0V
;
; RB0 = BP_HRS; bouton pour les heures
; RB1 = BP_MIN ; bouton pour les minutes
; RB2 = BP_PLS ; bouton plus
; RB3 = BP_MNS ; bouton moins
;
;*******************************************************************************
; Dé finition des signaux de contrô le

BP_PORT EQU PORTB; Port des entré es pour les boutons poussoirs
BP_TRIS EQU TRISB ; Direction du port

BP_HRS EQU 0 ; RB0 = bouton pour les heures


BP_MIN EQU 1 ; RB1 = bouton pour les minutes
BP_PLS EQU 2 ; RB2 = bouton plus
BP_MNS EQU 3 ; RB3 = bouton moins
BP_DATAS EQU 0x0F ; masque pour les entré es des boutons
BP_masqHRS EQU 0x01 ; masque pour le bouton heures
BP_masqMIN EQU 0x02 ; masque pour le bouton minutes
BP_masqPLS EQU 0x04 ; masque pour le bouton plus
BP_masqMNS EQU 0x08 ; masque pour le bouton moins

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

ProgStruct.doc JMT 26/26