PROGRAMMATION STRUCTUREE DES PIC 16F877

Transcription

PROGRAMMATION STRUCTUREE DES PIC 16F877
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
et son fichier de librairie
«xxx.h »(s’ il existe)
«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
interface convertisseur A/N
interface pour affichage sur LCD
voltmè tre utilisant A/N et LCD
commande de moteur en mode PWM
asservissement de vitesse moteur (PWM)
interface circuit horloge DS1306/DS1302
interface circuit mémoire DS1306/DS1302
interface clavier 12 ou 16 touches
interface pour 4 boutons poussoirs
interface affichage multiplexé 4 x 7 segments
interface EEPROM et PROM Flash
Fichier de tests
cantst.asm
lcdtst.asm
voltst.asm
pwmtst.asm (1à5)
pwmtst.asm (6)
hortst.asm
memtst.asm
keytst.asm
bptst.asm
afftst.asm
promtst.asm
Fichier utilisé s à dé clarer
can.asm
lcd.asm, lcd.h
can.asm, lcd.asm, lcd.h
pwm.asm, can.asm
asserv.asm, pwm.asm, can.asm
hor.asm, hor.h
mem.asm, mem.h
key.asm
bp.asm
aff.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"
include "aff.h"
; Dé finition pour le LCD
; Dé finition pour l’affichage 7 SEGMENTS
;------------------------------------------------------------------------------; Dé finition des Vecteurs IT et RESET
;------------------------------------------------------------------------------ORG
goto
0x0000
Main
; l'instruction qui suit est stocké e à l'adresse 0000H
;------------------------------------------------------------------------------; 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
lcdtst.asm
afftst.asm
voltst.asm
pwmtst.asm
hortst.asm
memtst.asm
keytst.asm
bptst.asm
promtst.asm
interface convertisseur A/N
interface pour LCD
interface affichage multiplexé à 7 segments
voltmè tre utilisant A/N et LCD
systè me de commande PWM
interface circuit horloge DS1306/DS1302
interface circuit mé moire DS1306/DS1302
interface clavier 12 touches
interface pour 4 boutons poussoirs
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"
include "hor.h"
; 3
;
fonctions de gestion de l'horloge DS1302/06
Dé finition pour l’horloge
;
;
include "mem.asm"
include "mem.h"
fonctions de gestion de la mé moire DS1302/06
Dé finition pour la mé moire
;
include "key.asm"
include "bp.asm"
; 3
;
;
; 3
; 3
fonctions de gestion du clavier 12/16 Touches
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
ERRORLEVEL -302
ERRORLEVEL -306
ERRORLEVEL -307
; supprime messages de changement de pages
; supprime messages de vé rification de bank
; supprime messages de vé rification de pages
; supprime messages d'affectation de pages
PROCESSOR 16F877
; type de microprocesseur
RADIX
RADIX
; valeurs en hexadé cimal par dé faut !
; valeurs en dé cimal par dé faut !
#include
HEX
DEC
<P16F877.INC> ; Fichier pour les dé finitions spé cifiques
__BADRAM 0x70,0xF0,0x170,0x1F0,0x1EB-0x1EF
;
; ré servé au programmateur
__CONFIG
__CONFIG
_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
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'
ProgStruct.doc
; Octet d'identification
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
LCD_CNTL_TRIS
EQU
EQU
PORTA; Port du bus de commande du LCD <RS,RW,E>
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
LCD_MODE2
EQU
EQU
0x28
0x2C
; Commande 4-bit, 2 lignes, Font 5x7
; Commande 4-bit, 2 lignes, Font 5x10
CLR_LCD
LCD_HOME
EQU
EQU
0x01
0x02
; Efface l'é cran
; Haut gauche de l'é cran
CURS_INC
CURS_INC_S
CURS_DEC
CURS_DEC_S
EQU
EQU
EQU
EQU
0x06
0x07
0x04
0x05
; Avance curseur
; Avance curseur + insertion
; Recul curseur
; 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
AFF_BCD_TRIS
AFF_BCD0
AFF_BCD1
AFF_BCD2
AFF_BCD3
AFF_BCDS
EQU
EQU
EQU
EQU
EQU
EQU
EQU
PORTC; Port des sorties du code BCD
TRISC ; Direction du port des sorties du code BCD
0
; RC0 = bit 0 du code BCD
1
; RC1 = bit 1 du code BCD
2
; RC2 = bit 2 du code BCD
3
; RC3 = bit 3 du code BCD
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
HOR_CTRL
HOR_STATUS
HOR_CHARGE
EQU
EQU
EQU
;
0x0F
0x10
0x11
bits 7 6 5 4 3 2 1 0
; registre de contrô le 0 WP 0 0 0 1Hz Al1 Al0
; registre d'é tat
0 0 0 0 0 0 it1 it2
; 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
HOR_CLKsize
EQU
EQU
0x00
d'15'
; adresse de dé but du burst horloge
; 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
; registre de contrô le WP 0 0 0 0 0 0 0
; 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_CTRL
HOR_CHARGE
EQU
EQU
0x8E
0x90
HOR_CLKburst
HOR_CLKsize
EQU
EQU
0xBE
d'8'
; adresse de dé but du burst horloge
; nombre d'octets pour le burst horloge
HOR_HALT
HOR_WP
HOR_RW
EQU
EQU
EQU
0x80
0x80
0x01
; Arrê t de l'horloge (bit7=1 : arrê t) (secondes)
; Write Protect (bit7=1 : interdiction é criture)
; 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
MEM_RAMfin
EQU
EQU
0x20
0x7F
; dé but de la zone RAM (0x00)
; fin de la zone RAM (0x5F)
MEM_RAMburst
MEM_RAMsize
EQU
EQU
0x20
0x60
; adresse de dé but du burst RAM
; 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
MEM_RAMfin
EQU
EQU
0xC0
0xFC
; dé but de la zone RAM (0x00)
; fin de la zone RAM (0x1E)
MEM_RAMburst
MEM_RAMsize
EQU
EQU
0xFE
0x20
; adresse de dé but du burst RAM
; 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
KEY_TRIS
EQU
EQU
PORTC; Port du clavier
TRISC ; Direction du port du clavier
KEY_DATA0
KEY_DATA1
KEY_DATA2
KEY_DATA3
KEY_DATAS
EQU
EQU
EQU
EQU
EQU
0
1
2
3
0x0F
; RC0 = bit 0 du code fourni par le clavier
; RC1 = bit 1 du code fourni par le clavier
; RC2 = bit 2 du code fourni par le clavier
; RC3 = bit 3 du code fourni par le clavier
; masque pour les entré es du code clavier
KEY_OK
KEY_OE
EQU
EQU
4
5
; RC4 = entré e touche appuyé e
; 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
BP_TRIS
EQU
EQU
PORTB; Port des entré es pour les boutons poussoirs
TRISB ; Direction du port
BP_HRS
BP_MIN
BP_PLS
BP_MNS
BP_DATAS
BP_masqHRS
BP_masqMIN
BP_masqPLS
BP_masqMNS
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0
1
2
3
0x0F
0x01
0x02
0x04
0x08
; RB0 = bouton pour les heures
; RB1 = bouton pour les minutes
; RB2 = bouton plus
; RB3 = bouton moins
; masque pour les entré es des boutons
; masque pour le bouton heures
; masque pour le bouton minutes
; masque pour le bouton plus
; masque pour le bouton moins
;*******************************************************************************
ProgStruct.doc
JMT
26/26

Documents pareils