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