MP2COD 3.92, COFF to COD File Converter Copyright (c) 2005 Microchip Technology Inc. Listing File Generated: Thu Sep 29 17:51:50 2005 Address Value Disassembly Source File ------- ------- ----------------------- ------------------------------------------------------------------------------- ----- ;=============================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; VARIATEUR pour moteur BRUSHLESS à 3 fils : variat3_21.ASM F:\Electronique\DataPic\Variat3\variat3.asm ; pour PIC16F628 et Qx=20,000 Mhz F:\Electronique\DataPic\Variat3\variat3.asm ; par Silicium 628 F:\Electronique\DataPic\Variat3\variat3.asm ;dernière mise à jour: 29/09/2005 F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;REMERCIEMENTS F:\Electronique\DataPic\Variat3\variat3.asm ;Suite à la publication de ce soft sur mon site, certains internautes spécialistes dans tel ou tel domaine F:\Electronique\DataPic\Variat3\variat3.asm ;m'ont contacté afin de m'aider à en améliorer l'écriture. F:\Electronique\DataPic\Variat3\variat3.asm ;Je tiens ainsi à remercier tout particulièrement I.M.B. qui m'a donné (en anglais);beaucoup d'astuces F:\Electronique\DataPic\Variat3\variat3.asm ;afin de rendre mon code plus structuré et plus lisible. F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;DIRECTIVEES D'ASSEMBLAGE: F:\Electronique\DataPic\Variat3\variat3.asm stops=1 F:\Electronique\DataPic\Variat3\variat3.asm stop_BEC=1 F:\Electronique\DataPic\Variat3\variat3.asm frein_permis=1 F:\Electronique\DataPic\Variat3\variat3.asm vif=1 F:\Electronique\DataPic\Variat3\variat3.asm detecte_perio_z=0 F:\Electronique\DataPic\Variat3\variat3.asm detecte_vts_lente=0 F:\Electronique\DataPic\Variat3\variat3.asm integration_PPM=1 F:\Electronique\DataPic\Variat3\variat3.asm ;NOTE: ces directives activent ou inhibent certaines fontions F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;LISTE DES PRINCIPALES PROCEDURES: (Double-clic sur 1 mot pour le sélectionner puis ctrl+F3 dans MPLAB, pratique...) F:\Electronique\DataPic\Variat3\variat3.asm ;TESTS F:\Electronique\DataPic\Variat3\variat3.asm ;MACROS F:\Electronique\DataPic\Variat3\variat3.asm ;mot16A macro ;charge AH et AL avec le mot codé sur 16 bits transmis F:\Electronique\DataPic\Variat3\variat3.asm ;mot16B macro ;charge BH et BL avec le mot codé sur 16 bits transmis F:\Electronique\DataPic\Variat3\variat3.asm ;Changements de banques F:\Electronique\DataPic\Variat3\variat3.asm ;R_EEPROM F:\Electronique\DataPic\Variat3\variat3.asm ;W_EEPROM F:\Electronique\DataPic\Variat3\variat3.asm ;CONSTANTES F:\Electronique\DataPic\Variat3\variat3.asm ;VARIABLES_EN_BANQUE0 F:\Electronique\DataPic\Variat3\variat3.asm ;TRAITEMENT DES INTERRUPTIONS (Aiguillage vers routines) F:\Electronique\DataPic\Variat3\variat3.asm ;INITIALISATION DES PORTS F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;PROGRAMMATION DU REGISTRE OPTION (BANK1) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE INTCON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE T1CON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE T2CON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE PR2 (BANK1) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE PIE1 (BANK1) F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE CCP1CON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Initialisation_des_variables F:\Electronique\DataPic\Variat3\variat3.asm ;BOUCLE_PRINCIPALE F:\Electronique\DataPic\Variat3\variat3.asm ;inttimer0 ;-> PERIODEMETRE sur le signal PPM du récepteur de radiocommande (détecte arret radio) F:\Electronique\DataPic\Variat3\variat3.asm ;inttimer1 ;-> génère les signaux de commande moteur F:\Electronique\DataPic\Variat3\variat3.asm ;inttimer2 ;-> découpe le signal de sortie à (relativement, 10kHz) haute fréquence au démarrage F:\Electronique\DataPic\Variat3\variat3.asm ;intB0 ;-> detecte les fronts du signal PPM du récepteur de radio-commande et MESURE le signal T_PPM F:\Electronique\DataPic\Variat3\variat3.asm ;intB4_7 ;-> détection signaux BEMF F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;pasMot1 F:\Electronique\DataPic\Variat3\variat3.asm ;BLOQUE F:\Electronique\DataPic\Variat3\variat3.asm ;sortie F:\Electronique\DataPic\Variat3\variat3.asm ;demarre F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;ROUTINES MATH F:\Electronique\DataPic\Variat3\variat3.asm ;convhbin ;conversion sexadécimale -> binaire ;entrée: AA, BB ;resultat: AH,AL = 60*AA+BB F:\Electronique\DataPic\Variat3\variat3.asm ;multi16 ;mutiplication 8 bits x 8 bits de w par AA (données sur 1 octet) ;resultat (sur 2 octets) dans AH,AL F:\Electronique\DataPic\Variat3\variat3.asm ;multi24 ;mutiplication 8 bits x 16 bits de w par AH,L (données sur 1 octet) ;resultat (sur 3 octets) dans A2,1,0 F:\Electronique\DataPic\Variat3\variat3.asm ;divi2 ;division d'une valeur codée sur 16 bits (AH,AL) par 2 F:\Electronique\DataPic\Variat3\variat3.asm ;Div24_8 ;division 24bits par 8 bits, résultat sur 24 bits F:\Electronique\DataPic\Variat3\variat3.asm ;add16A ;addition 16bits résultat dans A ;(AH,AL)+(BH,BL) -> (AH,AL) F:\Electronique\DataPic\Variat3\variat3.asm ;add16B ;addition 16bits résultat dans B ;(AH,AL)+(BH,BL) -> (BH,BL) F:\Electronique\DataPic\Variat3\variat3.asm ;cpl16x ;complément à deux de la variable codée sur 2 octets situés aux adresses w et w+1 permet les soustractions F:\Electronique\DataPic\Variat3\variat3.asm ;compar16p;comparaison de deux valeurs codées sur 16 bits (AH,AL à BH,BL) ;resultat dans STATUS carry et zéro F:\Electronique\DataPic\Variat3\variat3.asm ;movxA ;mov la variable codée sur 2 octets situés aux adresses w et w+1 dans -> AH,AL F:\Electronique\DataPic\Variat3\variat3.asm ;movAx ;mov AH,AL dans -> la variable codée sur 2 octets situés aux adresses w et w+1 F:\Electronique\DataPic\Variat3\variat3.asm ;movxB ;mov la variable codée sur 2 octets situés aux adresses w et w+1 dans -> BH,BL F:\Electronique\DataPic\Variat3\variat3.asm ;movBx ;mov BH,BL dans -> la variable codée sur 2 octets situés aux adresses w et w+1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;cvBDU ;CONVERSION BINAIRE(1) (1 octet incomplet 0..99 et pas 0..255) --> BCD ;nombre à convertir dans AA F:\Electronique\DataPic\Variat3\variat3.asm ;cvBCU ;CONVERSION BINAIRE(2) (1 octet complet 0..255) --> BCD ;resultat dans BB (centaines) et dans AA (unités) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Delay_ms (voir code externe dans le fichier Delay.asm) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;pasMot1 F:\Electronique\DataPic\Variat3\variat3.asm ;vari_vit F:\Electronique\DataPic\Variat3\variat3.asm ;demarre F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;TABLEAUX F:\Electronique\DataPic\Variat3\variat3.asm ; F:\Electronique\DataPic\Variat3\variat3.asm ; F:\Electronique\DataPic\Variat3\variat3.asm ;------------------------------------------------------------------------------------------------ F:\Electronique\DataPic\Variat3\variat3.asm ;remarque: suite aux modifications (=améliorations!) certains commentaires peuvent se révéler faux !!! F:\Electronique\DataPic\Variat3\variat3.asm ;j'en suis désolé. Je relis régulièrement les commentaires et essaye de les tenir à jour. F:\Electronique\DataPic\Variat3\variat3.asm ;toutefois il m'arrive de trouver des énormités ! que je corrige... F:\Electronique\DataPic\Variat3\variat3.asm ;------------------------------------------------------------------------------------------------ F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;===================================== PRINCIPE ================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;REMARQUE PRELIMINAIRE: F:\Electronique\DataPic\Variat3\variat3.asm ;De par la constitution du moteur brusless utilisé: (9 pôles électro-magnétiques câblés en 3 groupes de 3 et 12 aimants): F:\Electronique\DataPic\Variat3\variat3.asm ;Quand le champ tourne de 360º durant le cycle électrique complet, le rotor ne tourne que de 360/6=60°. F:\Electronique\DataPic\Variat3\variat3.asm ;Il faut que le champ magnétique fasse 6 tours pour que le rotor en fasse un -> couple important F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;un tour (360º) de champ magnétique se décompose électroniquement en 6 phases. F:\Electronique\DataPic\Variat3\variat3.asm ;un tour moteur est effectué après 6x6 = 36 phases électriques. F:\Electronique\DataPic\Variat3\variat3.asm ;chacune de ces phases électriques correspond à un pas dans le tableau Tab_ph F:\Electronique\DataPic\Variat3\variat3.asm ;le tableau Tab_ph comprend 6 lignes correspondant aux six types de phases, F:\Electronique\DataPic\Variat3\variat3.asm ;dont la totalité se déroule pendant 1/6 de tour moteur soit 60º F:\Electronique\DataPic\Variat3\variat3.asm ;une ligne du tableau concerne donc un angle de 10º du moteur. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;le PIC commande 6 MOSFETS (2 par phase) montés en pont en H F:\Electronique\DataPic\Variat3\variat3.asm ;par 4 bits du PORTA (bit 0 à 3) et 2 bits du portB F:\Electronique\DataPic\Variat3\variat3.asm ;Il s'agit de construire un champs tournant avec un courant triphasé F:\Electronique\DataPic\Variat3\variat3.asm ;voir tableau Tab_ph F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Par l'interruption intPortB, les signaux issus d'un traitement analogique des tensions BEMF font avancer F:\Electronique\DataPic\Variat3\variat3.asm ;le cycle de commande des MOSFFETS d'un pas à chaque impulsion reçue sur un des 3 pins (RB5, RB6 ou RB7) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;la variation de vitesse se fait par variation du rapport cyclique de découpage des signaux de sortie F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;===================================== SECURITE ================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;arrêt si plus de signal de réception F:\Electronique\DataPic\Variat3\variat3.asm ;arrêt si manche gaz + trim =0 F:\Electronique\DataPic\Variat3\variat3.asm ;ne démarre pas à la mise sous tension, même avec le manche des gaz à fond (à condition que la durée F:\Electronique\DataPic\Variat3\variat3.asm ;de coupure de l'alim soit suffisante pour que le PIC ait eu le temps de reseter, donc attention!) F:\Electronique\DataPic\Variat3\variat3.asm ;le seul demarrage possible se produit en montant le manche des gaz DEPUIS ZERO F:\Electronique\DataPic\Variat3\variat3.asm ;attention si l'émetteur de radiocommande est à l'arrêt, il faut s'attendre à des réceptions de parasites F:\Electronique\DataPic\Variat3\variat3.asm ;provoquant des démarrages ratés. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;fonction BEC implantée depuis la version 19 - met le moteur au ralentit si tension accu faible. sert à deux choses F:\Electronique\DataPic\Variat3\variat3.asm ;- ne pas décharger les accus LiPo sous le minimum autorisé (3V par élément, reglage par diode zener et resistances F:\Electronique\DataPic\Variat3\variat3.asm ; sur le circuit) F:\Electronique\DataPic\Variat3\variat3.asm ;- toujours garder sufisamment de tension pour alimenter le récepteur de radiocommande F:\Electronique\DataPic\Variat3\variat3.asm ;ATTENTION: le BEC est ici ajusté pour 2 éléments LiPo en série, pas pour 3. F:\Electronique\DataPic\Variat3\variat3.asm ;le circuit constitué autour du transistor Q10 est perfectible F:\Electronique\DataPic\Variat3\variat3.asm ;la partie du soft qui gère le BEC, et qui stope complètement (ou pas) le moteur et également révisable F:\Electronique\DataPic\Variat3\variat3.asm ;(chercher BEC dans le listing) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;============================== REMARQUES GENERALES ============================================== F:\Electronique\DataPic\Variat3\variat3.asm ;RAZ signifie Remise à Zéro F:\Electronique\DataPic\Variat3\variat3.asm ;PPM : type de modulation utilisée en radiocommande analogique par largeur d'impulsion (Phase Pulse Modulation) F:\Electronique\DataPic\Variat3\variat3.asm ;un train de 'n' impulsions, 'n'=nombre de voies module la HF, 1 impulsion par voie F:\Electronique\DataPic\Variat3\variat3.asm ;les impulsions durent entre 1,1ms et 2,2ms suivant la position du manche de la télécommande F:\Electronique\DataPic\Variat3\variat3.asm ;période de 'relaxation' entre deux trains = 20ms environ F:\Electronique\DataPic\Variat3\variat3.asm ;la séparation des impultions destinées à chaque voies se fait dans le récepteur radio F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;la notation ':=' dans les commentaires (affectation) me vient de la programmation en Pascal. F:\Electronique\DataPic\Variat3\variat3.asm ;une lecture attentive de ce code fait apparaitre de curieuses séquences goto étiquette suivis immédiatement F:\Electronique\DataPic\Variat3\variat3.asm ;par la destination. C'est voulu, par souci de lisibilité et de structuration du code F:\Electronique\DataPic\Variat3\variat3.asm ;ca évite surtout, lors d'ajout de bouts de code, D'OUBLIER d'ajouter le-dit goto F:\Electronique\DataPic\Variat3\variat3.asm ;D'autre part, j'aime bien que mes routines aient une porte de sortie unique F:\Electronique\DataPic\Variat3\variat3.asm ;plutôt que de ballancer des 'return' un peu partout. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;représentation d'un nombre hexadécimal: commence par "0x" ex: 0x20 F:\Electronique\DataPic\Variat3\variat3.asm ; B'00010000' represente une valeur binaire F:\Electronique\DataPic\Variat3\variat3.asm ;la notation periodeH,L (par exemple) désigne ici le mot 16bits formé par les 2 octets periodeH et periodeL F:\Electronique\DataPic\Variat3\variat3.asm ;et représente donc une valeur numérique codée sur 16 bits F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Utiliser une version récente de MPLAB afin que le PIC16F628 soit pris en compte (ma version= 7.10.00 ) F:\Electronique\DataPic\Variat3\variat3.asm ;voir sur le site de Microchip(R): http://www.microchip.com F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm list p=16f628A,r=dec ; list directive to define processor ; constantes système décimal F:\Electronique\DataPic\Variat3\variat3.asm #include ; processor specific variable definitions F:\Electronique\DataPic\Variat3\variat3.asm LIST E:\Program Files\Microchip\MPASM Suite\p16f628a.inc ; P16F628A.INC Standard Header File, Version 1.10 Microchip Technology, Inc. E:\Program Files\Microchip\MPASM Suite\p16f628a.inc LIST E:\Program Files\Microchip\MPASM Suite\p16f628a.inc E:\Program Files\Microchip\MPASM Suite\p16f628a.inc #include "Delay.inc" F:\Electronique\DataPic\Variat3\variat3.asm extern Delay_ms F:\Electronique\DataPic\Variat3\Delay.inc F:\Electronique\DataPic\Variat3\variat3.asm 002007 3f62 ADDLW 0x62 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _MCLRE_ON & _LVP_OFF F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de F:\Electronique\DataPic\Variat3\variat3.asm ; la programmation du processeur. Les définitions sont dans le fichier include. F:\Electronique\DataPic\Variat3\variat3.asm ; Voici les valeurs et leurs définitions : F:\Electronique\DataPic\Variat3\variat3.asm ; _CP_ON Code protection ON : impossible de relire F:\Electronique\DataPic\Variat3\variat3.asm ; _CP_OFF Code protection OFF F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ; _PWRTE_ON Timer reset sur power on en service F:\Electronique\DataPic\Variat3\variat3.asm ; _PWRTE_OFF Timer reset hors-service F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ; _WDT_ON Watch-dog en service F:\Electronique\DataPic\Variat3\variat3.asm ; _WDT_OFF Watch-dog hors service F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ; _LP_OSC Oscillateur quartz basse vitesse (32 Bank 0, 1 (00h - FFh) F:\Electronique\DataPic\Variat3\variat3.asm ;=1 -> Bank 2, 3 (100h - 1FFh) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000051 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 000052 1303 BCF 0x3,0x6 F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;ZONE de TESTS de procédures (simulation soft) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; INITIALISATION DES PORTS F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000053 1398 BCF 0x18,0x7 bcf RCSTA,7 ;(bit SPEN) portB[1,2] en ports E/S ( pas en USART ) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000054 1283 BCF 0x3,0x5 banksel CMCON ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 000055 1303 BCF 0x3,0x6 000056 3007 MOVLW 0x7 movlw 0x07 F:\Electronique\DataPic\Variat3\variat3.asm 000057 009f MOVWF 0x1f movwf CMCON ;PORT A en E/S numériques (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000058 2149 CALL 0x149 call BLOQUE ;positionne les bits du port A avant même de les configurer en sortie F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000059 1683 BSF 0x3,0x5 banksel TRISA F:\Electronique\DataPic\Variat3\variat3.asm 00005a 1303 BCF 0x3,0x6 00005b 3000 MOVLW 0x0 movlw B'00000000' ;0=sortie 1=entree ATTENTION RA4 =drain ouvert F:\Electronique\DataPic\Variat3\variat3.asm 00005c 0085 MOVWF 0x5 movwf TRISA ;config du port A (TRISA en page 1) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00005d 30e9 MOVLW 0xe9 movlw B'11101001' F:\Electronique\DataPic\Variat3\variat3.asm 00005e 0086 MOVWF 0x6 movwf TRISB ;config du port B F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00005f 1283 BCF 0x3,0x5 banksel AA F:\Electronique\DataPic\Variat3\variat3.asm 000060 1303 BCF 0x3,0x6 ; bsf PORTB,4 ;POUR TEST: signal de RESET visible sur le PORTB,4 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROGRAMMATION DU REGISTRE OPTION (BANK1) - voir datasheet p:20 du datasheet PIC16F62X.pdf F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7: RBPU =0 -> R tirage à Vdd du port B F:\Electronique\DataPic\Variat3\variat3.asm ;bit 6: INTEDG=1 -> INT sur front montant ou descendant de RB0 F:\Electronique\DataPic\Variat3\variat3.asm ; 1 = Interrupt on rising edge of RB0/INT pin F:\Electronique\DataPic\Variat3\variat3.asm ; 0 = Interrupt on falling edge of RB0/INT pin F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5: T0CS = 0 -> TMR0 Clock Source Select bit F:\Electronique\DataPic\Variat3\variat3.asm ; 1 = Transition on RA4/T0CKI pin (Fonctionnement en mode compteur) F:\Electronique\DataPic\Variat3\variat3.asm ; 0 = Internal instruction cycle clock (CLKOUT) (Fonctionnement en mode timer) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 4: RTE = 0 -> inc sur front montant F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3: PSA = 0 -> prédiv affecté au timer0 F:\Electronique\DataPic\Variat3\variat3.asm ;bits 2,1,0 : PS2,1,0 F:\Electronique\DataPic\Variat3\variat3.asm ;Bit Value TMR0 Rate WDT Rate F:\Electronique\DataPic\Variat3\variat3.asm ;000 1 : 2 1 : 1 F:\Electronique\DataPic\Variat3\variat3.asm ;001 1 : 4 1 : 2 F:\Electronique\DataPic\Variat3\variat3.asm ;010 1 : 8 1 : 4 F:\Electronique\DataPic\Variat3\variat3.asm ;011 1 : 16 1 : 8 F:\Electronique\DataPic\Variat3\variat3.asm ;100 1 : 32 1 : 16 F:\Electronique\DataPic\Variat3\variat3.asm ;101 1 : 64 1 : 32 ***** ICI 100b -> Timer0 = 1/64 ***** F:\Electronique\DataPic\Variat3\variat3.asm ;110 1 : 128 1 : 64 F:\Electronique\DataPic\Variat3\variat3.asm ;111 1 : 256 1 : 128 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000061 1683 BSF 0x3,0x5 banksel OPTION_REG F:\Electronique\DataPic\Variat3\variat3.asm 000062 1303 BCF 0x3,0x6 ; nº bits: '76543210' F:\Electronique\DataPic\Variat3\variat3.asm 000063 3045 MOVLW 0x45 movlw B'01000101' F:\Electronique\DataPic\Variat3\variat3.asm 000064 0081 MOVWF 0x1 movwf OPTION_REG F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE INTCON (BANK0) - voir datasheet p:21 F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7 GIE =0 -> INT GLOBALE interdite. (voir + bas) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 6 PEIE=1 -> INT PERIPHERIQUES autorisées. (timer1 en fait partie) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5 T0IE=1 -> INT par debordement Timer0 autorisées. F:\Electronique\DataPic\Variat3\variat3.asm ;bit 4 INTE=1 -> INT de RB0/INT autorisée (INTERRUPTIONS EXTERNES) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3 RBIE=1 -> INT du port RB4 à RB7 autorisée. F:\Electronique\DataPic\Variat3\variat3.asm ;bit 2 T0IF=x (flag mis à 1 par débordement du Timer0) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 1 INTF=x (flag mis à 1 par une INT provoquée par la libne RB0/INT du port B) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 0 RBIF=x (flag mis à 1 si changement d'état des entrées RB4 à RB7 du port B. attention RB1 à RB3 -> pas d'INT) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000065 1283 BCF 0x3,0x5 banksel INTCON F:\Electronique\DataPic\Variat3\variat3.asm 000066 1303 BCF 0x3,0x6 ; nº bits: '76543210' F:\Electronique\DataPic\Variat3\variat3.asm 000067 3078 MOVLW 0x78 movlw B'01111000' F:\Electronique\DataPic\Variat3\variat3.asm 000068 008b MOVWF 0xb movwf INTCON F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE T1CON (BANK0) (i zorépu lapelé ôtremen !) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7-6: Unimplemented: Read as '0' F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5-4: T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits F:\Electronique\DataPic\Variat3\variat3.asm ;11 = 1/8 Prescale value F:\Electronique\DataPic\Variat3\variat3.asm ;10 = 1/4 Prescale value >> valeur choisie ici << F:\Electronique\DataPic\Variat3\variat3.asm ;01 = 1/2 Prescale value F:\Electronique\DataPic\Variat3\variat3.asm ;00 = 1/1 Prescale value F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3: T1OSCEN: Timer1 Oscillator Enable Control bit F:\Electronique\DataPic\Variat3\variat3.asm ;1 = Oscillator is enabled F:\Electronique\DataPic\Variat3\variat3.asm ;0 = Oscillator is shut off F:\Electronique\DataPic\Variat3\variat3.asm ;Note: The oscillator inverter and feedback resistor are turned off to eliminate power drain F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 2: T1SYNC: Timer1 External Clock Input Synchronization Control bit F:\Electronique\DataPic\Variat3\variat3.asm ;si -> TMR1CS = 1 F:\Electronique\DataPic\Variat3\variat3.asm ;1 = Do not synchronize external clock input F:\Electronique\DataPic\Variat3\variat3.asm ;0 = Synchronize external clock input F:\Electronique\DataPic\Variat3\variat3.asm ;si -> TMR1CS = 0 F:\Electronique\DataPic\Variat3\variat3.asm ;This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 1: TMR1CS: Timer1 Clock Source Select bit F:\Electronique\DataPic\Variat3\variat3.asm ;1 = External clock from pin RB6/T1OSO/T1CKI (on the rising edge) F:\Electronique\DataPic\Variat3\variat3.asm ;0 = Internal clock (FOSC/4) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 0: TMR1ON: Timer1 On bit F:\Electronique\DataPic\Variat3\variat3.asm ;1 = Enables Timer1 F:\Electronique\DataPic\Variat3\variat3.asm ;0 = Stops Timer1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ; **** RECAPITULONS:***** F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7 : Inutilisé : lu comme « 0 » F:\Electronique\DataPic\Variat3\variat3.asm ;bit 6 : Inutilisé : lu comme « 0 » F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1 F:\Electronique\DataPic\Variat3\variat3.asm ;bit 4 ; T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0 F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3 : T1OSCEN : Timer 1 OSCillator ENable control bit (oscillateur interne) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit F:\Electronique\DataPic\Variat3\variat3.asm ;bit 1 : TMR1CS : TiMeR 1 Clock Source select bit F:\Electronique\DataPic\Variat3\variat3.asm ;bit 0 : TMR1ON : TiMeR 1 ON bit F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000069 1283 BCF 0x3,0x5 banksel T1CON F:\Electronique\DataPic\Variat3\variat3.asm 00006a 1303 BCF 0x3,0x6 ; nº bits: '76543210' ;prescale Timer1=1/4 F:\Electronique\DataPic\Variat3\variat3.asm 00006b 3021 MOVLW 0x21 movlw B'00100001' F:\Electronique\DataPic\Variat3\variat3.asm 00006c 0090 MOVWF 0x10 movwf T1CON F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE T2CON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7: Unimplemented: Read as '0' F:\Electronique\DataPic\Variat3\variat3.asm ;bit 6-3: TOUTPS3:TOUTPS0: Timer2 Output Postscale Select bits F:\Electronique\DataPic\Variat3\variat3.asm ;0000 = 1:1 Postscale F:\Electronique\DataPic\Variat3\variat3.asm ;0001 = 1:2 Postscale F:\Electronique\DataPic\Variat3\variat3.asm ;0010 = 1:3 Postscale F:\Electronique\DataPic\Variat3\variat3.asm ;0011 = 1:4 Postscale F:\Electronique\DataPic\Variat3\variat3.asm ;0100 = 1:5 Postscale etc... (valeur binaire +1) F:\Electronique\DataPic\Variat3\variat3.asm ;1111 = 1:16 Postscale F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 2: TMR2ON: Timer2 On bit =1 : Timer2 is on F:\Electronique\DataPic\Variat3\variat3.asm ;bit 1-0: T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits F:\Electronique\DataPic\Variat3\variat3.asm ;00 = Prescaler = 1 F:\Electronique\DataPic\Variat3\variat3.asm ;01 = Prescaler = 4 F:\Electronique\DataPic\Variat3\variat3.asm ;1x = Prescaler = 16 (valeur choisie ici) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00006d 1283 BCF 0x3,0x5 banksel T2CON F:\Electronique\DataPic\Variat3\variat3.asm 00006e 1303 BCF 0x3,0x6 ; nº bits: '76543210' F:\Electronique\DataPic\Variat3\variat3.asm 00006f 3006 MOVLW 0x6 movlw B'00000110' F:\Electronique\DataPic\Variat3\variat3.asm 000070 0092 MOVWF 0x12 movwf T2CON F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE PR2 (BANK1) F:\Electronique\DataPic\Variat3\variat3.asm ;utilisé par timer2 F:\Electronique\DataPic\Variat3\variat3.asm 000071 1683 BSF 0x3,0x5 banksel PR2 F:\Electronique\DataPic\Variat3\variat3.asm 000072 1303 BCF 0x3,0x6 000073 3010 MOVLW 0x10 movlw 16 F:\Electronique\DataPic\Variat3\variat3.asm 000074 0092 MOVWF 0x12 movwf PR2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE PIE1 (BANK1) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7 : PSPIE b7 : Toujours 0 sur PIC 16F876 F:\Electronique\DataPic\Variat3\variat3.asm ;bit 6 : ADIE : masque int convertisseur A/D F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5 : RCIE : masque int réception USART F:\Electronique\DataPic\Variat3\variat3.asm ;bit 4 : TXIE : masque int transmission USART F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3 : SSPIE : masque int port série synchrone F:\Electronique\DataPic\Variat3\variat3.asm ;bit 2 : CCP1IE: masque int CCP1 (module de comparaison TMR1H,L = CCPR1H,L ->INT) F:\Electronique\DataPic\Variat3\variat3.asm ;bit 1 : TMR2IE: masque int TMR2 = PR2 F:\Electronique\DataPic\Variat3\variat3.asm ;bit 0 : TMR1IE: masque int débordement tmr1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000075 1683 BSF 0x3,0x5 banksel PIE1 F:\Electronique\DataPic\Variat3\variat3.asm 000076 1303 BCF 0x3,0x6 ; nº bits: '76543210' F:\Electronique\DataPic\Variat3\variat3.asm 000077 3007 MOVLW 0x7 movlw B'00000111' ;enable: INT TIMER1 ; INT TIMER2 ; COMPARAISON ; disable le reste F:\Electronique\DataPic\Variat3\variat3.asm 000078 008c MOVWF 0xc movwf PIE1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;PROG DU REGISTRE CCP1CON (BANK0) F:\Electronique\DataPic\Variat3\variat3.asm ;je vous fais un petit copier coller du datasheet pour le plaisir... F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 7-6: Unimplemented: Read as '0' -> dommage, ça aurait pu compliquer un peu ! F:\Electronique\DataPic\Variat3\variat3.asm ;bit 5-4: CCP1X:CCP1Y: PWM Least Significant bits F:\Electronique\DataPic\Variat3\variat3.asm ;Capture Mode: Unused F:\Electronique\DataPic\Variat3\variat3.asm ;Compare Mode: Unused F:\Electronique\DataPic\Variat3\variat3.asm ;PWM Mode: These bits are the two LSbs of the PWM duty cycle. The eight MSbs are found in CCPRxL. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;bit 3-0: CCP1M3:CCP1M0: CCPx Mode Select bits F:\Electronique\DataPic\Variat3\variat3.asm ;0000 = Capture/Compare/PWM off (resets CCP1 module) F:\Electronique\DataPic\Variat3\variat3.asm ;0100 = Capture mode, every falling edge F:\Electronique\DataPic\Variat3\variat3.asm ;0101 = Capture mode, every rising edge F:\Electronique\DataPic\Variat3\variat3.asm ;0110 = Capture mode, every 4th rising edge F:\Electronique\DataPic\Variat3\variat3.asm ;0111 = Capture mode, every 16th rising edge F:\Electronique\DataPic\Variat3\variat3.asm ;1000 = Compare mode, set output on match (CCP1IF bit is set) F:\Electronique\DataPic\Variat3\variat3.asm ;1001 = Compare mode, clear output on match (CCP1IF bit is set) F:\Electronique\DataPic\Variat3\variat3.asm ;1010 = Compare mode, generate software interrupt on match (CCP1IF bit is set, CCP1 pin is unaffected) F:\Electronique\DataPic\Variat3\variat3.asm ;1011 = Compare mode, trigger special event (CCP1IF bit is set; CCP1 resets TMR1 F:\Electronique\DataPic\Variat3\variat3.asm ;11xx = PWM mode F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000079 1283 BCF 0x3,0x5 banksel CCP1CON F:\Electronique\DataPic\Variat3\variat3.asm 00007a 1303 BCF 0x3,0x6 ; nº bits: '76543210' F:\Electronique\DataPic\Variat3\variat3.asm 00007b 300a MOVLW 0xa movlw B'00001010' ;bits 0-3 = 1010 -> mode COMPARE F:\Electronique\DataPic\Variat3\variat3.asm 00007c 0097 MOVWF 0x17 movwf CCP1CON F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00007d 1283 BCF 0x3,0x5 banksel AA ;BANK1 F:\Electronique\DataPic\Variat3\variat3.asm 00007e 1303 BCF 0x3,0x6 00007f 30c8 MOVLW 0xc8 movlw .200 ;durée du signal de RESET visible sur le PORTB,4 F:\Electronique\DataPic\Variat3\variat3.asm 000080 2224 CALL 0x224 call Delay_ms F:\Electronique\DataPic\Variat3\variat3.asm ; bcf PORTB,4 ;POUR TEST: fin du signal de RESET visible sur le PORTB,4 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;Initialisation_des_variables F:\Electronique\DataPic\Variat3\variat3.asm 000081 138b BCF 0xb,0x7 N1 bcf INTCON, GIE ;->INT GLOBALE interdite F:\Electronique\DataPic\Variat3\variat3.asm 000082 3014 MOVLW 0x14 movlw .20 ;voir inttimer2 F:\Electronique\DataPic\Variat3\variat3.asm 000083 00b8 MOVWF 0x38 movwf rapcycl F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000084 1283 BCF 0x3,0x5 banksel n_ph F:\Electronique\DataPic\Variat3\variat3.asm 000085 1303 BCF 0x3,0x6 000086 01b2 CLRF 0x32 clrf n_ph F:\Electronique\DataPic\Variat3\variat3.asm 000087 01b0 CLRF 0x30 clrf count0 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000088 30c8 MOVLW 0xc8 movlw 200 F:\Electronique\DataPic\Variat3\variat3.asm 000089 0081 MOVWF 0x1 movwf TMR0 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00008a 018e CLRF 0xe clrf TMR1L F:\Electronique\DataPic\Variat3\variat3.asm 00008b 018f CLRF 0xf clrf TMR1H F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00008c 3080 MOVLW 0x80 movlw 128 F:\Electronique\DataPic\Variat3\variat3.asm 00008d 0091 MOVWF 0x11 movwf TMR2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00008e 3064 MOVLW 0x64 movlw 100 F:\Electronique\DataPic\Variat3\variat3.asm 00008f 0196 CLRF 0x16 clrf CCPR1H F:\Electronique\DataPic\Variat3\variat3.asm 000090 3001 MOVLW 0x1 movlw 1 F:\Electronique\DataPic\Variat3\variat3.asm 000091 0095 MOVWF 0x15 movwf CCPR1L F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000092 1140 BCF 0x40,0x2 bcf VTS_LENTE F:\Electronique\DataPic\Variat3\variat3.asm 000093 13c0 BCF 0x40,0x7 bcf A_FOND F:\Electronique\DataPic\Variat3\variat3.asm 000094 1441 BSF 0x41,0x0 bsf DECOU_En F:\Electronique\DataPic\Variat3\variat3.asm 000095 10c0 BCF 0x40,0x1 bcf STOP_ACCRO F:\Electronique\DataPic\Variat3\variat3.asm 000096 1340 BCF 0x40,0x6 bcf U_FAIBLE F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000097 30c8 MOVLW 0xc8 movlw .200 ;durée du signal de RESET visible sur le PORTB,4 F:\Electronique\DataPic\Variat3\variat3.asm 000098 2224 CALL 0x224 call Delay_ms F:\Electronique\DataPic\Variat3\variat3.asm 000099 178b BSF 0xb,0x7 bsf INTCON, GIE ;->INT GLOBALE autorisée F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------------------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm 00009a 20c0 CALL 0xc0 call STOP F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;TESTS HARDWARE F:\Electronique\DataPic\Variat3\variat3.asm ;ici1 bcf PORTB,1 F:\Electronique\DataPic\Variat3\variat3.asm ; call tp10ms F:\Electronique\DataPic\Variat3\variat3.asm ; bsf PORTB,1 F:\Electronique\DataPic\Variat3\variat3.asm ; call tp10ms F:\Electronique\DataPic\Variat3\variat3.asm ; goto ici1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; BOUCLE_PRINCIPALE F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;Les numéros des noeuds N1,2... correspondent à ceux de l'organigramme F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00009b 20b1 CALL 0xb1 N2 call PPMzero? ;c=1 si oui F:\Electronique\DataPic\Variat3\variat3.asm 00009c 1c03 BTFSS 0x3,0x0 btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 00009d 289b GOTO 0x9b goto N2 ;non F:\Electronique\DataPic\Variat3\variat3.asm 00009e 289f GOTO 0x9f goto N3 ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00009f 20b1 CALL 0xb1 N3 call PPMzero? ;c=1 si oui F:\Electronique\DataPic\Variat3\variat3.asm 0000a0 1c03 BTFSS 0x3,0x0 btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0000a1 28a3 GOTO 0xa3 goto N4 ;non F:\Electronique\DataPic\Variat3\variat3.asm 0000a2 289f GOTO 0x9f goto N3 ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000a3 2963 GOTO 0x163 N4 goto demarre F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000a4 20c9 CALL 0xc9 N5 call REG_VIT F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000a5 20b1 CALL 0xb1 N6 call PPMzero? ;c=1 si oui F:\Electronique\DataPic\Variat3\variat3.asm 0000a6 1c03 BTFSS 0x3,0x0 btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0000a7 28a9 GOTO 0xa9 goto N7 ;non F:\Electronique\DataPic\Variat3\variat3.asm 0000a8 28ac GOTO 0xac goto N8 ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000a9 0000 NOP N7 nop F:\Electronique\DataPic\Variat3\variat3.asm if detecte_vts_lente == 1 ;voir directives en tout début du listing F:\Electronique\DataPic\Variat3\variat3.asm btfss VTS_LENTE ;vitesse lente ou moteur arrêté ? F:\Electronique\DataPic\Variat3\variat3.asm ENDIF F:\Electronique\DataPic\Variat3\variat3.asm 0000aa 28ae GOTO 0xae goto N9 ;non F:\Electronique\DataPic\Variat3\variat3.asm 0000ab 2881 GOTO 0x81 goto N1 ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000ac 1440 BSF 0x40,0x0 N8 bsf STOP_RADIO ;pour stopper le MOTEUR F:\Electronique\DataPic\Variat3\variat3.asm 0000ad 289f GOTO 0x9f goto N3 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000ae 0000 NOP N9 nop F:\Electronique\DataPic\Variat3\variat3.asm if detecte_perio_z == 1 F:\Electronique\DataPic\Variat3\variat3.asm call perio_z? ;(c=1 si oui) F:\Electronique\DataPic\Variat3\variat3.asm btfss STOP_ACCRO F:\Electronique\DataPic\Variat3\variat3.asm ENDIF F:\Electronique\DataPic\Variat3\variat3.asm 0000af 28a4 GOTO 0xa4 goto N5 ;non F:\Electronique\DataPic\Variat3\variat3.asm 0000b0 2881 GOTO 0x81 goto N1 ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; DEBUT DES PROCEDURES F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Teste si T_PPM est inférieure à 90 ? (c=1 si oui) F:\Electronique\DataPic\Variat3\variat3.asm 0000b1 0834 MOVF 0x34,0x0 PPMzero? movf T_PPM,w F:\Electronique\DataPic\Variat3\variat3.asm 0000b2 3c5b SUBLW 0x5b sublw 91 ;90-w ; c=0 si neg ; c=1 si pos c.a.d si T_PPM<91 F:\Electronique\DataPic\Variat3\variat3.asm 0000b3 1c03 BTFSS 0x3,0x0 btfss STATUS,C ;(c=1 si oui) F:\Electronique\DataPic\Variat3\variat3.asm 0000b4 10c1 BCF 0x41,0x1 bcf FREIN_En F:\Electronique\DataPic\Variat3\variat3.asm 0000b5 1803 BTFSC 0x3,0x0 btfsc STATUS,C ; F:\Electronique\DataPic\Variat3\variat3.asm 0000b6 14c1 BSF 0x41,0x1 bsf FREIN_En F:\Electronique\DataPic\Variat3\variat3.asm 0000b7 0008 RETURN return ;si oui, c=1 et FREIN_En=1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;teste si periodeH,L < valeur mini (si accrochage HF) (c=1 si oui) F:\Electronique\DataPic\Variat3\variat3.asm ;RAPPEL: 1 pas de TMR1H,L = 20MHz/4/4 -> 0,8us F:\Electronique\DataPic\Variat3\variat3.asm ;cette routine ne me donne pas satisfaction ! le moteur ne peut pas prendre ses tours ! F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000b8 3036 MOVLW 0x36 perio_z? movlw periodeH ;adresse de periodeH,L F:\Electronique\DataPic\Variat3\variat3.asm 0000b9 21f4 CALL 0x1f4 call movxA F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm mot16B 20 ;20*0.8 = 16us ; si la période est < 16us, on positionne 'c' F:\Electronique\DataPic\Variat3\variat3.asm 0000be 2210 CALL 0x210 call compar16p ;B-A c=0 si négatif c.a.d si A>B F:\Electronique\DataPic\Variat3\variat3.asm ; btfsc STATUS,C ;(c=1 si oui) F:\Electronique\DataPic\Variat3\variat3.asm ; return F:\Electronique\DataPic\Variat3\variat3.asm ; bsf STOP_ACCRO F:\Electronique\DataPic\Variat3\variat3.asm 0000bf 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm 0000c0 1440 BSF 0x40,0x0 STOP bsf STOP_RADIO ;STOP F:\Electronique\DataPic\Variat3\variat3.asm 0000c1 118b BCF 0xb,0x3 bcf INTCON,3 ;bit3 RBIE=0 -> disable INT du port RB4 à RB7 ; Le moteur ne peut redémarrer F:\Electronique\DataPic\Variat3\variat3.asm ;que par la routine 'demarre', et pas 'à la main' F:\Electronique\DataPic\Variat3\variat3.asm 0000c2 2149 CALL 0x149 call BLOQUE F:\Electronique\DataPic\Variat3\variat3.asm 0000c3 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;note: ce test est appelé dans l'int timer0 F:\Electronique\DataPic\Variat3\variat3.asm 0000c4 1986 BTFSC 0x6,0x3 V_mini? btfsc PORTB,3 ;PB3=1 si U<6V F:\Electronique\DataPic\Variat3\variat3.asm 0000c5 1740 BSF 0x40,0x6 bsf U_FAIBLE F:\Electronique\DataPic\Variat3\variat3.asm 0000c6 1d86 BTFSS 0x6,0x3 btfss PORTB,3 F:\Electronique\DataPic\Variat3\variat3.asm 0000c7 1340 BCF 0x40,0x6 bcf U_FAIBLE F:\Electronique\DataPic\Variat3\variat3.asm 0000c8 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;REGLAGE DE LA VITESSE (en fait, règlage du rapport cyclique de conduction des MOSFETS, F:\Electronique\DataPic\Variat3\variat3.asm ;ce qui entraine la variation de vitesse) F:\Electronique\DataPic\Variat3\variat3.asm ;calcul d'une fonction AH,L = F(T_PPM) F:\Electronique\DataPic\Variat3\variat3.asm ;fait sauter l'offset F:\Electronique\DataPic\Variat3\variat3.asm 0000c9 0834 MOVF 0x34,0x0 REG_VIT movf T_PPM,w F:\Electronique\DataPic\Variat3\variat3.asm 0000ca 00b5 MOVWF 0x35 movwf memo1 F:\Electronique\DataPic\Variat3\variat3.asm 0000cb 305f MOVLW 0x5f movlw 95 ; w:=95 T_PPM_G mini CETTE VALEUR EST A AJUSTER F:\Electronique\DataPic\Variat3\variat3.asm 0000cc 02b5 SUBWF 0x35,0x1 subwf memo1,f ; f-w(c=0 si negatif) T_PPM_G:= T_PPM_G - 90 (pré-ofset) F:\Electronique\DataPic\Variat3\variat3.asm 0000cd 1c03 BTFSS 0x3,0x0 btfss STATUS,C ; débordement ? F:\Electronique\DataPic\Variat3\variat3.asm 0000ce 01b5 CLRF 0x35 clrf memo1 ;oui ;memo1 n'est jamais <0 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;memo1 est donc une fontion directe de T_PPM F:\Electronique\DataPic\Variat3\variat3.asm ;ici memo1 = [0..80] F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;offset strictement positif F:\Electronique\DataPic\Variat3\variat3.asm 0000cf 300f MOVLW 0xf movlw 15 ;valeur minimale admise F:\Electronique\DataPic\Variat3\variat3.asm 0000d0 07b5 ADDWF 0x35,0x1 addwf memo1,f F:\Electronique\DataPic\Variat3\variat3.asm ;ici memo1 = [15..95] F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm ;BEC = DETECTION TENSION D'ALIM FAIBLE F:\Electronique\DataPic\Variat3\variat3.asm if stop_BEC == 1 F:\Electronique\DataPic\Variat3\variat3.asm 0000d1 1f40 BTFSS 0x40,0x6 btfss U_FAIBLE ;U faible ? F:\Electronique\DataPic\Variat3\variat3.asm 0000d2 28d7 GOTO 0xd7 goto suite2 ;non F:\Electronique\DataPic\Variat3\variat3.asm 0000d3 3004 MOVLW 0x4 movlw 4 ;oui, brider vitesse moteur à une valeur fixe, faible, si l'accu est déchargé (BEC) F:\Electronique\DataPic\Variat3\variat3.asm 0000d4 00b5 MOVWF 0x35 movwf memo1 F:\Electronique\DataPic\Variat3\variat3.asm 0000d5 13c0 BCF 0x40,0x7 bcf A_FOND ;pour s'assurer que le découpage aura bien lieu F:\Electronique\DataPic\Variat3\variat3.asm 0000d6 28df GOTO 0xdf goto suite3 F:\Electronique\DataPic\Variat3\variat3.asm endif F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm ;ARRET DU DECOUPAGE si manche des gaz à fond : pleine puissance. F:\Electronique\DataPic\Variat3\variat3.asm ;cette partie est sautée si le BEC est entré en limitation de vitesse F:\Electronique\DataPic\Variat3\variat3.asm 0000d7 305a MOVLW 0x5a suite2 movlw 90 F:\Electronique\DataPic\Variat3\variat3.asm 0000d8 0235 SUBWF 0x35,0x0 subwf memo1,w ; f-w(c=0 si negatif donc si memo1<90) w= memo1 - 90 F:\Electronique\DataPic\Variat3\variat3.asm 0000d9 1803 BTFSC 0x3,0x0 btfsc STATUS,C ;memo1>=90 ? F:\Electronique\DataPic\Variat3\variat3.asm 0000da 17c0 BSF 0x40,0x7 bsf A_FOND ;oui F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000db 3055 MOVLW 0x55 movlw 85 ;cette valeur différente de la précédente imtroduit un hystérésis dans le seuil F:\Electronique\DataPic\Variat3\variat3.asm 0000dc 0235 SUBWF 0x35,0x0 subwf memo1,w ; f-w(c=0 si negatif donc si memo1<90) w= memo1 - 85 F:\Electronique\DataPic\Variat3\variat3.asm 0000dd 1c03 BTFSS 0x3,0x0 btfss STATUS,C ;memo1>=90 ? F:\Electronique\DataPic\Variat3\variat3.asm 0000de 13c0 BCF 0x40,0x7 bcf A_FOND ;non F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000df 3036 MOVLW 0x36 suite3 movlw periodeH ;adresse de periodeH,L F:\Electronique\DataPic\Variat3\variat3.asm 0000e0 21f4 CALL 0x1f4 call movxA ;AH,L:=periodeH,L F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;on va borner la valeur obtenue à la valeur max atteinte par TMR1H,L compte tenu de la vitesse de rotation actuelle F:\Electronique\DataPic\Variat3\variat3.asm ;c.a.d de la période actuelle max F:\Electronique\DataPic\Variat3\variat3.asm ;qui est mémorisée dans periodeH,L par l'INT PORTB4-7 F:\Electronique\DataPic\Variat3\variat3.asm ;le but est de ne pas découper le signal de sortie à partir d'un instant situé au delà de sa durée maximale ! F:\Electronique\DataPic\Variat3\variat3.asm ;REMARQUE: cette durée maximale de la période EN COURS n'est pas connue d'avance ! F:\Electronique\DataPic\Variat3\variat3.asm ;on prend donc en compte la durée de la période précédente et on suppose que la période en cours F:\Electronique\DataPic\Variat3\variat3.asm ;aura une durée très proche, même si le moteur accélère ou ralentit... F:\Electronique\DataPic\Variat3\variat3.asm ;La méthode a ses limites (en cas de changement brutal du couple mécanique par exemple) F:\Electronique\DataPic\Variat3\variat3.asm ;toutefois, avec comme charge une hélice d'avion, les changements de régime restent progressifs F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;Le calcul est le suivant: F:\Electronique\DataPic\Variat3\variat3.asm ;CCPR1H,L = ( memo1 * periodeH,L )/95 F:\Electronique\DataPic\Variat3\variat3.asm ;sachant que 95 représente la valeur max de memo1, lorsque memo1 = memo1_max = 95 on aura: F:\Electronique\DataPic\Variat3\variat3.asm ;CCPR1H,L = 95 * periodeH,L / 95 = periodeH,L F:\Electronique\DataPic\Variat3\variat3.asm ;on obtient donc pour memo1 une valeur [0..periodeH,L] F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000e1 30ec MOVLW 0xec movlw -1 * 20 ;w=20 ;garde F:\Electronique\DataPic\Variat3\variat3.asm 0000e2 07a5 ADDWF 0x25,0x1 addwf AL,f F:\Electronique\DataPic\Variat3\variat3.asm 0000e3 1c03 BTFSS 0x3,0x0 btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0000e4 03a4 DECF 0x24,0x1 decf AH,f ;ici AH,L:=periodeH,L -20 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000e5 0835 MOVF 0x35,0x0 movf memo1,w F:\Electronique\DataPic\Variat3\variat3.asm 0000e6 21b1 CALL 0x1b1 call multi24 ;mutiplication 8 bits x 16 bits de w par AH,L resultat (24bits) dans A2,1,0 F:\Electronique\DataPic\Variat3\variat3.asm ;B:=A F:\Electronique\DataPic\Variat3\variat3.asm 0000e7 082c MOVF 0x2c,0x0 movf A0,w F:\Electronique\DataPic\Variat3\variat3.asm 0000e8 00b9 MOVWF 0x39 movwf Dividende F:\Electronique\DataPic\Variat3\variat3.asm 0000e9 082b MOVF 0x2b,0x0 movf A1,w F:\Electronique\DataPic\Variat3\variat3.asm 0000ea 00ba MOVWF 0x3a movwf Dividende+1 F:\Electronique\DataPic\Variat3\variat3.asm 0000eb 082a MOVF 0x2a,0x0 movf A2,w F:\Electronique\DataPic\Variat3\variat3.asm 0000ec 00bb MOVWF 0x3b movwf Dividende+2 F:\Electronique\DataPic\Variat3\variat3.asm ;ici Dividende= memo1 * periodeH,L F:\Electronique\DataPic\Variat3\variat3.asm 0000ed 305f MOVLW 0x5f movlw 95 ;valeur de max de memo1 F:\Electronique\DataPic\Variat3\variat3.asm 0000ee 21c7 CALL 0x1c7 call Div24_8 ;Dividende / w -> Quotient (division 24bits par 8 bits résultat sur 24 bits) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;------------------------------------------------ F:\Electronique\DataPic\Variat3\variat3.asm ;écriture de la valeur dans le registre CCPR1L du module de COMPARAISON du PIC F:\Electronique\DataPic\Variat3\variat3.asm ;fonctionne avec le Timer1 F:\Electronique\DataPic\Variat3\variat3.asm ;lorsque TMR1H,L (qui mesure le temps depuis l'INT PORB4-7) = CCPR1H,L, une interruption se produit F:\Electronique\DataPic\Variat3\variat3.asm ;qui découpe le signal de sortie F:\Electronique\DataPic\Variat3\variat3.asm ;RAPPEL: l'INT PORB4-7 se produit quant à elle lors d'un front d'un des trois signaux BEMF F:\Electronique\DataPic\Variat3\variat3.asm ;et détermine 2 actions: F:\Electronique\DataPic\Variat3\variat3.asm ;- RAZ du Timer1 (TMR1H,L:=0) F:\Electronique\DataPic\Variat3\variat3.asm ;- Début de conduction d'une phase F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000ef 0839 MOVF 0x39,0x0 movf Quotient,w F:\Electronique\DataPic\Variat3\variat3.asm 0000f0 0095 MOVWF 0x15 movwf CCPR1L F:\Electronique\DataPic\Variat3\variat3.asm 0000f1 083a MOVF 0x3a,0x0 movf Quotient+1,w F:\Electronique\DataPic\Variat3\variat3.asm 0000f2 0096 MOVWF 0x16 movwf CCPR1H F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000f3 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; SOUS-ROUTINES d'INTERRUPTIONS F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int timer0 F:\Electronique\DataPic\Variat3\variat3.asm ;utilisé en PERIODEMETRE sur le signal PPM du récepteur de radiocommande F:\Electronique\DataPic\Variat3\variat3.asm ;la RAZ du timer0 se fait par l'intportB; en principe le timer0 ne déborde jamais, sauf émetteur sur OFF. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;20MHz/4/64= 78.125kHz (12.8us) F:\Electronique\DataPic\Variat3\variat3.asm ;12.8us*256=3.2768ms (temps max mesurable) F:\Electronique\DataPic\Variat3\variat3.asm ;en fait on doit mesurer une durée [1,1 ... 2,2 ms] F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000f4 0bb0 DECFSZ 0x30,0x1 inttimer0 decfsz count0,f F:\Electronique\DataPic\Variat3\variat3.asm 0000f5 28f7 GOTO 0xf7 goto fintimer0 F:\Electronique\DataPic\Variat3\variat3.asm 0000f6 1440 BSF 0x40,0x0 bsf STOP_RADIO ;STOP MOTEUR pour arrêt si plus de signal de réception F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000f7 20c4 CALL 0xc4 fintimer0 call V_mini? F:\Electronique\DataPic\Variat3\variat3.asm 0000f8 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int timer1 F:\Electronique\DataPic\Variat3\variat3.asm ;TMR1H,L est utilisé pour chronometrer la période de l'enveloppe (1 pas moteur) et géré par l'intB4_7 F:\Electronique\DataPic\Variat3\variat3.asm ;on passe ici si le moteur est à l'arrêt ou tourne à vitesse très faible <100rpm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;voir prediv =1/4 (voir T1CON)) F:\Electronique\DataPic\Variat3\variat3.asm ;20MHz -> 50ns F:\Electronique\DataPic\Variat3\variat3.asm ;20MHz/4/4 -> 0,8us F:\Electronique\DataPic\Variat3\variat3.asm ;THM1H,L peuvent compter 65536 soit: 53 ms F:\Electronique\DataPic\Variat3\variat3.asm ;Le moteur à fond sous 8V -> 10 000 rpm soit 1/(10000 /60 *6) -> 1ms de durée de cycle entre 2 INT PORTB4-7 F:\Electronique\DataPic\Variat3\variat3.asm ;Le moteur à 3000 rpm soit 10/3000 = 3,3ms de durée de cycle entre 2 INT PORTB4-7 F:\Electronique\DataPic\Variat3\variat3.asm ;Le moteur à 100 rpm soit 10/100 = 100ms de durée de cycle entre 2 INT PORTB4-7 soit presque 104ms (max) F:\Electronique\DataPic\Variat3\variat3.asm ;Donc la limite de la vitesse minimale mesurable est d'environ 200rpm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;10000rpm ->TRM1H,L max:= 1236 F:\Electronique\DataPic\Variat3\variat3.asm ;3000 ->TRM1H,L max:= 3710 F:\Electronique\DataPic\Variat3\variat3.asm ;200 ->TRM1H,L max:= 61826 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000f9 1540 BSF 0x40,0x2 inttimer1 bsf VTS_LENTE ;vitesse lente ou arret F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000fa 0008 RETURN fin_int1 return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int module COMPARAISON F:\Electronique\DataPic\Variat3\variat3.asm ;on passe ici lorsque TMR1H,L = CCPR1H,L F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0000fb 1bc0 BTFSC 0x40,0x7 intCompar btfsc A_FOND F:\Electronique\DataPic\Variat3\variat3.asm 0000fc 2900 GOTO 0x100 goto FinIntCmp F:\Electronique\DataPic\Variat3\variat3.asm 0000fd 1c41 BTFSS 0x41,0x0 btfss DECOU_En F:\Electronique\DataPic\Variat3\variat3.asm 0000fe 2900 GOTO 0x100 goto FinIntCmp F:\Electronique\DataPic\Variat3\variat3.asm 0000ff 2149 CALL 0x149 call BLOQUE ;decoupage des signaux de sortie F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000100 0008 RETURN FinIntCmp return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int timer2 F:\Electronique\DataPic\Variat3\variat3.asm ;pour découper le signal de sortie à (relativement, 10kHz) haute fréquence lors de la phase de démarrage F:\Electronique\DataPic\Variat3\variat3.asm ;ce timer fonctionne ici suivant 2 alternances consécutives de durées inégales, mais dont la somme est constante F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000101 1dc0 BTFSS 0x40,0x3 inttimer2 btfss DECOUP_HF F:\Electronique\DataPic\Variat3\variat3.asm 000102 2919 GOTO 0x119 goto fin_int2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000103 1e40 BTFSS 0x40,0x4 btfss PHASE_HF F:\Electronique\DataPic\Variat3\variat3.asm 000104 2906 GOTO 0x106 goto ph0 F:\Electronique\DataPic\Variat3\variat3.asm 000105 2910 GOTO 0x110 goto ph1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000106 1640 BSF 0x40,0x4 ph0 bsf PHASE_HF F:\Electronique\DataPic\Variat3\variat3.asm 000107 0838 MOVF 0x38,0x0 movf rapcycl,w ;ici w=rapcycl F:\Electronique\DataPic\Variat3\variat3.asm 000108 3cff SUBLW 0xff sublw .255 ;ici w=255-rapcycl F:\Electronique\DataPic\Variat3\variat3.asm 000109 1683 BSF 0x3,0x5 banksel PR2 F:\Electronique\DataPic\Variat3\variat3.asm 00010a 1303 BCF 0x3,0x6 00010b 0092 MOVWF 0x12 movwf PR2 F:\Electronique\DataPic\Variat3\variat3.asm 00010c 1283 BCF 0x3,0x5 banksel AA F:\Electronique\DataPic\Variat3\variat3.asm 00010d 1303 BCF 0x3,0x6 F:\Electronique\DataPic\Variat3\variat3.asm 00010e 2149 CALL 0x149 call BLOQUE ;bloque les MOSFETS du port A (pas le moteur!) F:\Electronique\DataPic\Variat3\variat3.asm 00010f 2919 GOTO 0x119 goto fin_int2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000110 1240 BCF 0x40,0x4 ph1 bcf PHASE_HF F:\Electronique\DataPic\Variat3\variat3.asm 000111 0838 MOVF 0x38,0x0 movf rapcycl,w ;ici w=rapcycl F:\Electronique\DataPic\Variat3\variat3.asm 000112 1683 BSF 0x3,0x5 banksel PR2 F:\Electronique\DataPic\Variat3\variat3.asm 000113 1303 BCF 0x3,0x6 000114 0092 MOVWF 0x12 movwf PR2 F:\Electronique\DataPic\Variat3\variat3.asm 000115 1283 BCF 0x3,0x5 banksel AA F:\Electronique\DataPic\Variat3\variat3.asm 000116 1303 BCF 0x3,0x6 F:\Electronique\DataPic\Variat3\variat3.asm 000117 214e CALL 0x14e call sortie ;sortie physique des signaux vers les MOSFETS F:\Electronique\DataPic\Variat3\variat3.asm 000118 2919 GOTO 0x119 goto fin_int2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000119 0008 RETURN fin_int2 return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int Extérieure par bit 0 du port B F:\Electronique\DataPic\Variat3\variat3.asm ;detecte les fronts du signal PPM du récepteur de radio-commande F:\Electronique\DataPic\Variat3\variat3.asm ;mesure et mémorise la durée des impulsions PPM de la voie gaz dans la variable T_PPM F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00011a 1ec0 BTFSS 0x40,0x5 intB0 btfss EDGE_PPM ;quel front vient-on de détecter ? F:\Electronique\DataPic\Variat3\variat3.asm 00011b 2925 GOTO 0x125 goto frontD ;le front descendant F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00011c 0181 CLRF 0x1 frontM clrf TMR0 ;le front montant. RAZ Timer0 F:\Electronique\DataPic\Variat3\variat3.asm 00011d 01b0 CLRF 0x30 clrf count0 F:\Electronique\DataPic\Variat3\variat3.asm 00011e 1683 BSF 0x3,0x5 banksel OPTION_REG F:\Electronique\DataPic\Variat3\variat3.asm 00011f 1303 BCF 0x3,0x6 000120 1301 BCF 0x1,0x6 bcf OPTION_REG,6 ;Interrupt on falling edge of RB0/INT pin (détectera le front descendant) F:\Electronique\DataPic\Variat3\variat3.asm 000121 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 000122 1303 BCF 0x3,0x6 000123 12c0 BCF 0x40,0x5 bcf EDGE_PPM ;pour éviter une lecture en bank1 au début de cette procédure, on testera ce flag F:\Electronique\DataPic\Variat3\variat3.asm 000124 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000125 0801 MOVF 0x1,0x0 frontD movf TMR0,w ;le timer0 à compté (l'horloge du PIC) depuis le front montant précédent F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm if vif == 1 ;voir directives en tout début du listing F:\Electronique\DataPic\Variat3\variat3.asm 000126 00b4 MOVWF 0x34 movwf T_PPM ;mémorisation du temps mesuré dans T_PPM, pour utilisation dans le reste du programme F:\Electronique\DataPic\Variat3\variat3.asm else F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm ;on va mémoriser dans T_PPM le temps mesuré, pour utilisation dans le reste du programme F:\Electronique\DataPic\Variat3\variat3.asm ;ici, plutôt qu'une affectation directe et brutale (comme T_PPM:=TMR0), on va procéder F:\Electronique\DataPic\Variat3\variat3.asm ;par comparaison des deux valeurs, et on va faire tendre T_PPM vers TMR0 progressivement F:\Electronique\DataPic\Variat3\variat3.asm ;ceci dans le but d'éliminer les valeurs abérantes qui peuvent se présenter F:\Electronique\DataPic\Variat3\variat3.asm ;ce qui rendait la vitesse de rotation un peu fluctuante autour de certaines valeurs. F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm subwf T_PPM,w ; f-w(c=0 si negatif) w:= T_PPM - TMR0 (c=0 si TMR0 > T_PPM) F:\Electronique\DataPic\Variat3\variat3.asm btfsc STATUS,Z F:\Electronique\DataPic\Variat3\variat3.asm goto intB0_1 ;si égalité, on ne fait rien F:\Electronique\DataPic\Variat3\variat3.asm btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm decf T_PPM,f F:\Electronique\DataPic\Variat3\variat3.asm btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm incf T_PPM,f F:\Electronique\DataPic\Variat3\variat3.asm endif F:\Electronique\DataPic\Variat3\variat3.asm ;----------------------------------------- F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000127 0000 NOP intB0_1 nop F:\Electronique\DataPic\Variat3\variat3.asm 000128 1683 BSF 0x3,0x5 banksel OPTION_REG F:\Electronique\DataPic\Variat3\variat3.asm 000129 1303 BCF 0x3,0x6 00012a 1701 BSF 0x1,0x6 bsf OPTION_REG,6 ;(détectera le front montant) F:\Electronique\DataPic\Variat3\variat3.asm 00012b 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 00012c 1303 BCF 0x3,0x6 00012d 16c0 BSF 0x40,0x5 bsf EDGE_PPM F:\Electronique\DataPic\Variat3\variat3.asm 00012e 0181 CLRF 0x1 clrf TMR0 F:\Electronique\DataPic\Variat3\variat3.asm 00012f 01b0 CLRF 0x30 clrf count0 F:\Electronique\DataPic\Variat3\variat3.asm 000130 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;int Extérieure par bits 4à7 du port B F:\Electronique\DataPic\Variat3\variat3.asm ;détecte les fronts des 3 signaux de BEMF F:\Electronique\DataPic\Variat3\variat3.asm ;REMARQUE: contrairement à l'intRB0, les INT RB4-7 sont déclenchées par les fronts montants ET descendants F:\Electronique\DataPic\Variat3\variat3.asm ;sans que l'on puisse choisir lequel F:\Electronique\DataPic\Variat3\variat3.asm ;RAPPEL: TMR1H,L est compteur 16 bits du timer1 (voir plus haut l'inttimer1) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000131 080f MOVF 0xf,0x0 intB4_7 movf TMR1H,w F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm if integration_PPM == 1 ;voir directives en tout début du listing F:\Electronique\DataPic\Variat3\variat3.asm 000132 07b6 ADDWF 0x36,0x1 addwf periodeH,f ;intègre et mémorise la valeur mesurée de la période de rotation F:\Electronique\DataPic\Variat3\variat3.asm 000133 0cb6 RRF 0x36,0x1 rrf periodeH,f ;/2 F:\Electronique\DataPic\Variat3\variat3.asm ;il s'agit donc de la valeur maximale de TMRH,L d'autant plus grande que la vitesse est faible F:\Electronique\DataPic\Variat3\variat3.asm 000134 080e MOVF 0xe,0x0 movf TMR1L,w F:\Electronique\DataPic\Variat3\variat3.asm 000135 07b7 ADDWF 0x37,0x1 addwf periodeL,f F:\Electronique\DataPic\Variat3\variat3.asm 000136 0cb7 RRF 0x37,0x1 rrf periodeL,f F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm else F:\Electronique\DataPic\Variat3\variat3.asm movf TMR1H,w F:\Electronique\DataPic\Variat3\variat3.asm movwf periodeH ;mémorise la valeur mesurée de la période de rotation F:\Electronique\DataPic\Variat3\variat3.asm ;il s'agit donc de la valeur maximale de TMRH,L d'autant plus grande que la vitesse est faible F:\Electronique\DataPic\Variat3\variat3.asm movf TMR1L,w F:\Electronique\DataPic\Variat3\variat3.asm movwf periodeL F:\Electronique\DataPic\Variat3\variat3.asm endif F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000137 018f CLRF 0xf clrf TMR1H F:\Electronique\DataPic\Variat3\variat3.asm 000138 018e CLRF 0xe clrf TMR1L ;départ de la mesure suivante F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000139 213c CALL 0x13c saut2 call pasMot1 ;prépare l'enveloppe du signal F:\Electronique\DataPic\Variat3\variat3.asm 00013a 214e CALL 0x14e call sortie F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00013b 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; PROCEDURES de commande moteur F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;cette routine est appelée par l'int ext: intB4_7 F:\Electronique\DataPic\Variat3\variat3.asm ;génere l'enveloppe du signal qui sera sorti par l'intimer2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00013c 3000 MOVLW 0x0 pasMot1 movlw HIGH Tab_Ph F:\Electronique\DataPic\Variat3\variat3.asm 00013d 008a MOVWF 0xa movwf PCLATH F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00013e 0832 MOVF 0x32,0x0 movf n_ph,w F:\Electronique\DataPic\Variat3\variat3.asm 00013f 2040 CALL 0x40 call Tab_Ph ;retourne la valeur de l'octet dans w F:\Electronique\DataPic\Variat3\variat3.asm 000140 00b3 MOVWF 0x33 movwf signal ;signal pour commande des MOSFETs. sera utilisé par intTimer2 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm IF stops == 1 ;voir directives en tout début du listing F:\Electronique\DataPic\Variat3\variat3.asm 000141 1840 BTFSC 0x40,0x0 btfsc STOP_RADIO F:\Electronique\DataPic\Variat3\variat3.asm 000142 01b3 CLRF 0x33 clrf signal F:\Electronique\DataPic\Variat3\variat3.asm ; btfsc STOP_ACCRO F:\Electronique\DataPic\Variat3\variat3.asm ; clrf signal F:\Electronique\DataPic\Variat3\variat3.asm ENDIF F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000143 0ab2 INCF 0x32,0x1 incf n_ph,f F:\Electronique\DataPic\Variat3\variat3.asm 000144 3006 MOVLW 0x6 movlw 6 ;butée max F:\Electronique\DataPic\Variat3\variat3.asm 000145 0232 SUBWF 0x32,0x0 subwf n_ph,w ;w-f(c=0 si negatif) F:\Electronique\DataPic\Variat3\variat3.asm 000146 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 000147 01b2 CLRF 0x32 clrf n_ph F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000148 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;bloque électriquement tous les MOSFETS reliés au PORT A (uniquement) sauf pendqnt le freinage moteur F:\Electronique\DataPic\Variat3\variat3.asm 000149 18c1 BTFSC 0x41,0x1 BLOQUE btfsc FREIN_En F:\Electronique\DataPic\Variat3\variat3.asm 00014a 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm 00014b 300a MOVLW 0xa movlw B'00001010' F:\Electronique\DataPic\Variat3\variat3.asm 00014c 0085 MOVWF 0x5 movwf PORTA F:\Electronique\DataPic\Variat3\variat3.asm 00014d 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;SORTIE PHYSIQUE DES SIGNAUX VERS LES MOSFETS F:\Electronique\DataPic\Variat3\variat3.asm 00014e 0000 NOP sortie nop F:\Electronique\DataPic\Variat3\variat3.asm if frein_permis == 1 ;voir directives en tout début du listing F:\Electronique\DataPic\Variat3\variat3.asm 00014f 18c1 BTFSC 0x41,0x1 btfsc FREIN_En F:\Electronique\DataPic\Variat3\variat3.asm 000150 295e GOTO 0x15e goto frein F:\Electronique\DataPic\Variat3\variat3.asm ENDIF F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000151 300f MOVLW 0xf movlw B'00001111' ;bits concernant le PORT A F:\Electronique\DataPic\Variat3\variat3.asm 000152 0533 ANDWF 0x33,0x0 andwf signal,w ;ne touche pas signal F:\Electronique\DataPic\Variat3\variat3.asm 000153 3a0a XORLW 0xa xorlw B'00001010' ;les MOSFETS côté(+) sont pilotés par des transistors inversant la phase F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000154 0085 MOVWF 0x5 movwf PORTA F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000155 1e33 BTFSS 0x33,0x4 btfss signal,4 F:\Electronique\DataPic\Variat3\variat3.asm 000156 1086 BCF 0x6,0x1 bcf PORTB,1 F:\Electronique\DataPic\Variat3\variat3.asm 000157 1a33 BTFSC 0x33,0x4 btfsc signal,4 F:\Electronique\DataPic\Variat3\variat3.asm 000158 1486 BSF 0x6,0x1 bsf PORTB,1 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000159 1eb3 BTFSS 0x33,0x5 btfss signal,5 F:\Electronique\DataPic\Variat3\variat3.asm 00015a 1506 BSF 0x6,0x2 bsf PORTB,2 ;inverse le bit F:\Electronique\DataPic\Variat3\variat3.asm 00015b 1ab3 BTFSC 0x33,0x5 btfsc signal,5 F:\Electronique\DataPic\Variat3\variat3.asm 00015c 1106 BCF 0x6,0x2 bcf PORTB,2 ;inverse le bit F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00015d 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00015e 1506 BSF 0x6,0x2 frein bsf PORTB,2 ;bloque Q6 (MOSFET côté(+)) F:\Electronique\DataPic\Variat3\variat3.asm 00015f 1486 BSF 0x6,0x1 bsf PORTB,1 ;puis ensuite sature Q5 (MOSFET côté(-)) F:\Electronique\DataPic\Variat3\variat3.asm 000160 300f MOVLW 0xf movlw B'00001111' ;sature les transistors côté(-), bloque ceux côté(+) (MOSFETS Q1,2,3,4) F:\Electronique\DataPic\Variat3\variat3.asm 000161 0085 MOVWF 0x5 movwf PORTA F:\Electronique\DataPic\Variat3\variat3.asm 000162 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;demarrage forcé du moteur. On ne passe ici que sur action du manche des GAZ en partant de zéro F:\Electronique\DataPic\Variat3\variat3.asm ; ATTENTION: routine appelée par un goto (N4 dans bcl pincipale) et pas par un call. F:\Electronique\DataPic\Variat3\variat3.asm ; ne se termine donc pas par un return, mais par un goto N5 F:\Electronique\DataPic\Variat3\variat3.asm ; permet de gagner un niveau dans de pile, mais surtout permet de retourner ailleurs en cas d'arret d'urgence F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000163 1040 BCF 0x40,0x0 demarre bcf STOP_RADIO F:\Electronique\DataPic\Variat3\variat3.asm 000164 1140 BCF 0x40,0x2 bcf VTS_LENTE F:\Electronique\DataPic\Variat3\variat3.asm 000165 10c0 BCF 0x40,0x1 bcf STOP_ACCRO F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000166 118b BCF 0xb,0x3 bcf INTCON,3 ;bit3 RBIE=1 -> desable INT du port RB4 à RB7 F:\Electronique\DataPic\Variat3\variat3.asm 000167 15c0 BSF 0x40,0x3 bsf DECOUP_HF ;découpage HF pendant le démarrage forçé F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000168 1283 BCF 0x3,0x5 banksel PIR1 F:\Electronique\DataPic\Variat3\variat3.asm 000169 1303 BCF 0x3,0x6 00016a 148c BSF 0xc,0x1 bsf PIR1,TMR2IE ;enable INT Timer2 pour découper les signaux en HF pendant le démarrage F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00016b 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 00016c 1303 BCF 0x3,0x6 00016d 178b BSF 0xb,0x7 bsf INTCON,GIE ;enable INT's F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00016e 3014 MOVLW 0x14 movlw 20 ;20 F:\Electronique\DataPic\Variat3\variat3.asm 00016f 00a0 MOVWF 0x20 movwf AA F:\Electronique\DataPic\Variat3\variat3.asm ;====================================== F:\Electronique\DataPic\Variat3\variat3.asm 000170 3004 MOVLW 0x4 dema1 movlw 4 ;8 F:\Electronique\DataPic\Variat3\variat3.asm 000171 00a1 MOVWF 0x21 movwf BB F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000172 20b1 CALL 0xb1 call PPMzero? ;c=1 si oui F:\Electronique\DataPic\Variat3\variat3.asm 000173 1c03 BTFSS 0x3,0x0 btfss STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 000174 2980 GOTO 0x180 goto dema2 ;non F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000175 1440 BSF 0x40,0x0 bsf STOP_RADIO ;oui, arret d'urgence et retour F:\Electronique\DataPic\Variat3\variat3.asm 000176 2149 CALL 0x149 call BLOQUE ;moteur en roue libre F:\Electronique\DataPic\Variat3\variat3.asm 000177 11c0 BCF 0x40,0x3 bcf DECOUP_HF ;plus de découpage 10kHz F:\Electronique\DataPic\Variat3\variat3.asm 000178 1283 BCF 0x3,0x5 banksel PIR1 F:\Electronique\DataPic\Variat3\variat3.asm 000179 1303 BCF 0x3,0x6 00017a 108c BCF 0xc,0x1 bcf PIR1,TMR2IE ;disable INT Timer2 F:\Electronique\DataPic\Variat3\variat3.asm 00017b 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 00017c 1303 BCF 0x3,0x6 00017d 1441 BSF 0x41,0x0 bsf DECOU_En ;découpage PWM F:\Electronique\DataPic\Variat3\variat3.asm 00017e 158b BSF 0xb,0x3 bsf INTCON,RBIE ;enable INT du port RB4 à RB7; passe le cycle en mode automatique F:\Electronique\DataPic\Variat3\variat3.asm 00017f 28ac GOTO 0xac goto N8 ;VERS boucle principale F:\Electronique\DataPic\Variat3\variat3.asm ;-------------------------- F:\Electronique\DataPic\Variat3\variat3.asm 000180 213c CALL 0x13c dema2 call pasMot1 F:\Electronique\DataPic\Variat3\variat3.asm 000181 214e CALL 0x14e call sortie F:\Electronique\DataPic\Variat3\variat3.asm ;pendant la phase de démarrage, les signaux sont physiquement sortis par l'int timer2 (qui découpe en HF) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000182 3002 MOVLW 0x2 movlw 2 F:\Electronique\DataPic\Variat3\variat3.asm 000183 0720 ADDWF 0x20,0x0 addwf AA,w F:\Electronique\DataPic\Variat3\variat3.asm 000184 2224 CALL 0x224 call Delay_ms ;delai proportionnel à AA +2 donc qui décroit avec AA -> f augmente F:\Electronique\DataPic\Variat3\variat3.asm 000185 0ba1 DECFSZ 0x21,0x1 decfsz BB,f F:\Electronique\DataPic\Variat3\variat3.asm 000186 2980 GOTO 0x180 goto dema2 ;boucle intérieure courte, BB fois F:\Electronique\DataPic\Variat3\variat3.asm ;-------------------------- F:\Electronique\DataPic\Variat3\variat3.asm 000187 0ba0 DECFSZ 0x20,0x1 decfsz AA,f F:\Electronique\DataPic\Variat3\variat3.asm 000188 2970 GOTO 0x170 goto dema1 ;boucle extérieure, AA fois F:\Electronique\DataPic\Variat3\variat3.asm ;====================================== F:\Electronique\DataPic\Variat3\variat3.asm 000189 1441 BSF 0x41,0x0 bsf DECOU_En ;découpage PWM F:\Electronique\DataPic\Variat3\variat3.asm 00018a 158b BSF 0xb,0x3 bsf INTCON,RBIE ;enable INT du port RB4 à RB7; passe le cycle en mode automatique F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00018b 2149 CALL 0x149 call BLOQUE ;moteur en roue libre F:\Electronique\DataPic\Variat3\variat3.asm 00018c 11c0 BCF 0x40,0x3 bcf DECOUP_HF ;plus de découpage 10kHz F:\Electronique\DataPic\Variat3\variat3.asm 00018d 1283 BCF 0x3,0x5 banksel PIR1 F:\Electronique\DataPic\Variat3\variat3.asm 00018e 1303 BCF 0x3,0x6 00018f 108c BCF 0xc,0x1 bcf PIR1,TMR2IE ;disable INT Timer2 F:\Electronique\DataPic\Variat3\variat3.asm 000190 1283 BCF 0x3,0x5 banksel AA ;BANK0 F:\Electronique\DataPic\Variat3\variat3.asm 000191 1303 BCF 0x3,0x6 F:\Electronique\DataPic\Variat3\variat3.asm 000192 3080 MOVLW 0x80 movlw 128 F:\Electronique\DataPic\Variat3\variat3.asm 000193 0095 MOVWF 0x15 movwf CCPR1L F:\Electronique\DataPic\Variat3\variat3.asm 000194 3078 MOVLW 0x78 movlw 120 F:\Electronique\DataPic\Variat3\variat3.asm 000195 0096 MOVWF 0x16 movwf CCPR1H F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000196 300a MOVLW 0xa movlw 10 F:\Electronique\DataPic\Variat3\variat3.asm 000197 2224 CALL 0x224 call Delay_ms F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000198 1040 BCF 0x40,0x0 bcf STOP_RADIO F:\Electronique\DataPic\Variat3\variat3.asm 000199 1140 BCF 0x40,0x2 bcf VTS_LENTE F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00019a 28a4 GOTO 0xa4 goto N5 ;vers appelant dans la boucle principale F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ; ROUTINES MATH F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;conversion sexadécimale -> binaire F:\Electronique\DataPic\Variat3\variat3.asm ;entrée: AA, BB F:\Electronique\DataPic\Variat3\variat3.asm ;resultat: AH,AL = 60*AA+BB F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 00019b 303c MOVLW 0x3c convhbin movlw 60 F:\Electronique\DataPic\Variat3\variat3.asm 00019c 21a2 CALL 0x1a2 call multi16 ;AA contient la donnée à multiplier F:\Electronique\DataPic\Variat3\variat3.asm 00019d 0821 MOVF 0x21,0x0 movf BB,w F:\Electronique\DataPic\Variat3\variat3.asm 00019e 07a5 ADDWF 0x25,0x1 addwf AL,f F:\Electronique\DataPic\Variat3\variat3.asm 00019f 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001a0 0aa4 INCF 0x24,0x1 incf AH,f F:\Electronique\DataPic\Variat3\variat3.asm 0001a1 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;mutiplication 8 bits x 8 bits de w par AA (données sur 1 octet) F:\Electronique\DataPic\Variat3\variat3.asm ;d'après note AN526 Microchip F:\Electronique\DataPic\Variat3\variat3.asm ;resultat (sur 2 octets) dans AH,AL (poids fort et poids faible) F:\Electronique\DataPic\Variat3\variat3.asm ;principe: exactement celui de la multiplication faite 'à la main' F:\Electronique\DataPic\Variat3\variat3.asm ;décallages (donc multiplications par le poids de chaque bit) et additions si le bit est un '1' F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001a2 01a4 CLRF 0x24 multi16 clrf AH ;RAZ de AH qui est ainsi prêt à servir pour réceptionner le résultat (poids fort) F:\Electronique\DataPic\Variat3\variat3.asm 0001a3 00a5 MOVWF 0x25 movwf AL ;memo temporaire du contenu de w, on a en effet besoin de w à la ligne suivante F:\Electronique\DataPic\Variat3\variat3.asm 0001a4 3008 MOVLW 0x8 movlw 8 ;pour charger une constante dans le compteur de boucle (8 passes) F:\Electronique\DataPic\Variat3\variat3.asm 0001a5 00b1 MOVWF 0x31 movwf count1 ;compteur de passages dans la boucle F:\Electronique\DataPic\Variat3\variat3.asm 0001a6 0825 MOVF 0x25,0x0 movf AL,w ;on remet la valeur sauvegardée temporairement dans AL dans w F:\Electronique\DataPic\Variat3\variat3.asm 0001a7 01a5 CLRF 0x25 clrf AL ;RAZ de AL qui est ainsi prêt à servir pour réceptionner le résultat (poids faible) F:\Electronique\DataPic\Variat3\variat3.asm 0001a8 1003 BCF 0x3,0x0 bcf STATUS,C ;RAZ carry F:\Electronique\DataPic\Variat3\variat3.asm 0001a9 0ca0 RRF 0x20,0x1 loopm16 rrf AA,f ;lecture d'un bit de AA F:\Electronique\DataPic\Variat3\variat3.asm 0001aa 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001ab 07a4 ADDWF 0x24,0x1 addwf AH,f ;si c' est un '1' on ajoute w à AH F:\Electronique\DataPic\Variat3\variat3.asm 0001ac 0ca4 RRF 0x24,0x1 rrf AH,f ;on décalle AH (poids forts) vers la droite, le bit de droite tombe dans c F:\Electronique\DataPic\Variat3\variat3.asm 0001ad 0ca5 RRF 0x25,0x1 rrf AL,f ;le bit de droite est récupéré dans AL F:\Electronique\DataPic\Variat3\variat3.asm 0001ae 0bb1 DECFSZ 0x31,0x1 decfsz count1,f ;compte les passages dans la boucle count1 = 0? F:\Electronique\DataPic\Variat3\variat3.asm 0001af 29a9 GOTO 0x1a9 goto loopm16 ;non, on boucle F:\Electronique\DataPic\Variat3\variat3.asm 0001b0 0008 RETURN return ;oui, on sort F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;multi24 ;mutiplication 8 bits x 16 bits de w par AH,L F:\Electronique\DataPic\Variat3\variat3.asm ;resultat 24bits (sur 3 octets) dans A2,1,0 F:\Electronique\DataPic\Variat3\variat3.asm ;principe: exactement celui de la multiplication faite 'à la main' F:\Electronique\DataPic\Variat3\variat3.asm ;décallages (donc multiplications par le poids de chaque bit) et additions si le bit est un '1' F:\Electronique\DataPic\Variat3\variat3.asm ;remarque: CAPACITE MAX: F:\Electronique\DataPic\Variat3\variat3.asm ;AH,L:=255,255 =65535 = 2^16 -1 F:\Electronique\DataPic\Variat3\variat3.asm ;w:=255 =2^8 -1 F:\Electronique\DataPic\Variat3\variat3.asm ;w * AH,L := 16711425 = (254,255,1) et pas (255,255,255) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001b1 01aa CLRF 0x2a multi24 clrf A2 ;RAZ de A2 qui est ainsi prêt à servir pour réceptionner le résultat (poids fort) F:\Electronique\DataPic\Variat3\variat3.asm 0001b2 01ab CLRF 0x2b clrf A1 ;RAZ de A1 qui est ainsi prêt à servir pour réceptionner le résultat F:\Electronique\DataPic\Variat3\variat3.asm 0001b3 00ac MOVWF 0x2c movwf A0 ;memo temporaire du contenu de w, on a en effet besoin de w à la ligne suivante F:\Electronique\DataPic\Variat3\variat3.asm 0001b4 3010 MOVLW 0x10 movlw 16 ;pour charger une constante dans le compteur de boucle (16 passes) F:\Electronique\DataPic\Variat3\variat3.asm 0001b5 00b1 MOVWF 0x31 movwf count1 ;compteur de passages dans la boucle F:\Electronique\DataPic\Variat3\variat3.asm 0001b6 082c MOVF 0x2c,0x0 movf A0,w ;on remet la valeur sauvegardée temporairement dans AL dans w F:\Electronique\DataPic\Variat3\variat3.asm 0001b7 01ac CLRF 0x2c clrf A0 ;RAZ de AL qui est ainsi prêt à servir pour réceptionner le résultat (poids faible) F:\Electronique\DataPic\Variat3\variat3.asm 0001b8 1003 BCF 0x3,0x0 loopm24 bcf STATUS,C ;RAZ carry F:\Electronique\DataPic\Variat3\variat3.asm 0001b9 0ca4 RRF 0x24,0x1 rrf AH,f ;décallage à droite, le bit de droite tombe dans c F:\Electronique\DataPic\Variat3\variat3.asm 0001ba 0ca5 RRF 0x25,0x1 rrf AL,f ;décallage à droite avec récup du bit ci-dessus, le bit de droite tombe dans c F:\Electronique\DataPic\Variat3\variat3.asm 0001bb 1803 BTFSC 0x3,0x0 btfsc STATUS,C ;lecture d'un bit de AH,L ; test de ce bit F:\Electronique\DataPic\Variat3\variat3.asm 0001bc 07aa ADDWF 0x2a,0x1 addwf A2,f ;si c' est un '1' on ajoute w à A2 F:\Electronique\DataPic\Variat3\variat3.asm 0001bd 0caa RRF 0x2a,0x1 rrf A2,f ;on décalle A2 (poids forts) vers la droite, le bit de droite tombe dans c F:\Electronique\DataPic\Variat3\variat3.asm 0001be 0cab RRF 0x2b,0x1 rrf A1,f ;le bit de droite de A2 est récupéré dans A1 F:\Electronique\DataPic\Variat3\variat3.asm 0001bf 0cac RRF 0x2c,0x1 rrf A0,f ;le bit de droite de A1 est récupéré dans A0 F:\Electronique\DataPic\Variat3\variat3.asm 0001c0 0bb1 DECFSZ 0x31,0x1 decfsz count1,f ;compte les passages dans la boucle count1 = 0? F:\Electronique\DataPic\Variat3\variat3.asm 0001c1 29b8 GOTO 0x1b8 goto loopm24 ;non, on boucle F:\Electronique\DataPic\Variat3\variat3.asm 0001c2 0008 RETURN return ;oui, on sort F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;division d'une valeur codée sur 16 bits (AH,AL) par 2 F:\Electronique\DataPic\Variat3\variat3.asm 0001c3 1003 BCF 0x3,0x0 divi2 bcf STATUS,C ;RAZ carry F:\Electronique\DataPic\Variat3\variat3.asm 0001c4 0ca4 RRF 0x24,0x1 rrf AH,f ;le bit de poids faible tombe dans -> c ; le bit de poids fort de AH devient nul F:\Electronique\DataPic\Variat3\variat3.asm 0001c5 0ca5 RRF 0x25,0x1 rrf AL,f ;le bit de poids faible de AH devient le bit de poids fort de AL F:\Electronique\DataPic\Variat3\variat3.asm 0001c6 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;division 24 bits par 8 bits F:\Electronique\DataPic\Variat3\variat3.asm ;(auteur I.M.B que je remercie) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001c7 00bc MOVWF 0x3c Div24_8 movwf Diviseur F:\Electronique\DataPic\Variat3\variat3.asm 0001c8 3018 MOVLW 0x18 movlw 24 F:\Electronique\DataPic\Variat3\variat3.asm 0001c9 00bf MOVWF 0x3f movwf Compteur1 F:\Electronique\DataPic\Variat3\variat3.asm 0001ca 01bd CLRF 0x3d clrf Aux+0 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001cb 0db9 RLF 0x39,0x1 rlf Dividende+0,f F:\Electronique\DataPic\Variat3\variat3.asm 0001cc 0dba RLF 0x3a,0x1 rlf Dividende+1,f F:\Electronique\DataPic\Variat3\variat3.asm 0001cd 0dbb RLF 0x3b,0x1 rlf Dividende+2,f F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001ce 0dbd RLF 0x3d,0x1 Div24_81 rlf Aux+0,f F:\Electronique\DataPic\Variat3\variat3.asm 0001cf 0dbe RLF 0x3e,0x1 rlf Aux+1,f F:\Electronique\DataPic\Variat3\variat3.asm 0001d0 083c MOVF 0x3c,0x0 movf Diviseur,w F:\Electronique\DataPic\Variat3\variat3.asm 0001d1 023d SUBWF 0x3d,0x0 subwf Aux,w F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001d2 183e BTFSC 0x3e,0x0 btfsc Aux+1,0 F:\Electronique\DataPic\Variat3\variat3.asm 0001d3 1403 BSF 0x3,0x0 bsf STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001d4 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001d5 00bd MOVWF 0x3d movwf Aux F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001d6 0db9 RLF 0x39,0x1 rlf Dividende+0,f F:\Electronique\DataPic\Variat3\variat3.asm 0001d7 0dba RLF 0x3a,0x1 rlf Dividende+1,f F:\Electronique\DataPic\Variat3\variat3.asm 0001d8 0dbb RLF 0x3b,0x1 rlf Dividende+2,f F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001d9 0bbf DECFSZ 0x3f,0x1 decfsz Compteur1,f F:\Electronique\DataPic\Variat3\variat3.asm 0001da 29ce GOTO 0x1ce goto Div24_81 F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001db 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;addition 16bits F:\Electronique\DataPic\Variat3\variat3.asm ;(AH,AL)+(BH,BL) -> (AH,AL) F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 0001dc 0827 MOVF 0x27,0x0 add16A movf BL,w F:\Electronique\DataPic\Variat3\variat3.asm 0001dd 07a5 ADDWF 0x25,0x1 addwf AL,f ;(f+w) -> dest ; c=1 si retenue (à traiter) F:\Electronique\DataPic\Variat3\variat3.asm 0001de 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001df 0aa6 INCF 0x26,0x1 incf BH,f ;ajout retenue F:\Electronique\DataPic\Variat3\variat3.asm 0001e0 0826 MOVF 0x26,0x0 movf BH,w F:\Electronique\DataPic\Variat3\variat3.asm 0001e1 07a4 ADDWF 0x24,0x1 addwf AH,f ;(f+w) -> dest ; c=1 si retenue F:\Electronique\DataPic\Variat3\variat3.asm 0001e2 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;addition 16bits F:\Electronique\DataPic\Variat3\variat3.asm ;(AH,AL)+(AH,AL) -> (BH,BL) F:\Electronique\DataPic\Variat3\variat3.asm ;remarque seule la destination (B) est différente par rapport à la procédure add16A F:\Electronique\DataPic\Variat3\variat3.asm 0001e3 0825 MOVF 0x25,0x0 add16B movf AL,w F:\Electronique\DataPic\Variat3\variat3.asm 0001e4 07a7 ADDWF 0x27,0x1 addwf BL,f ;(f+w) -> dest ; c=1 si retenue (à traiter) F:\Electronique\DataPic\Variat3\variat3.asm 0001e5 1803 BTFSC 0x3,0x0 btfsc STATUS,C F:\Electronique\DataPic\Variat3\variat3.asm 0001e6 0aa4 INCF 0x24,0x1 incf AH,f ;ajout retenue F:\Electronique\DataPic\Variat3\variat3.asm 0001e7 0824 MOVF 0x24,0x0 movf AH,w F:\Electronique\DataPic\Variat3\variat3.asm 0001e8 07a6 ADDWF 0x26,0x1 addwf BH,f ;(f+w) -> dest ; c=1 si retenue F:\Electronique\DataPic\Variat3\variat3.asm 0001e9 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;complément à deux de la variable codée sur 2 octets situés aux adresses w et w+1 F:\Electronique\DataPic\Variat3\variat3.asm 0001ea 0084 MOVWF 0x4 cpl16x movwf FSR F:\Electronique\DataPic\Variat3\variat3.asm 0001eb 0980 COMF 0x0,0x1 comf INDF,f ;w=complément (H) F:\Electronique\DataPic\Variat3\variat3.asm 0001ec 0a84 INCF 0x4,0x1 incf FSR,f F:\Electronique\DataPic\Variat3\variat3.asm 0001ed 0980 COMF 0x0,0x1 comf INDF,f ;w=complément (L) F:\Electronique\DataPic\Variat3\variat3.asm 0001ee 0a80 INCF 0x0,0x1 incf INDF,f ;w=complément à 2 de L F:\Electronique\DataPic\Variat3\variat3.asm 0001ef 1d03 BTFSS 0x3,0x2 btfss STATUS,Z F:\Electronique\DataPic\Variat3\variat3.asm 0001f0 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm 0001f1 0384 DECF 0x4,0x1 decf FSR,f ;pointe H F:\Electronique\DataPic\Variat3\variat3.asm 0001f2 0a80 INCF 0x0,0x1 incf INDF,f ;retenue F:\Electronique\DataPic\Variat3\variat3.asm 0001f3 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;mov la variable codée sur 2 octets situés aux adresses w et w+1 dans -> AH,AL F:\Electronique\DataPic\Variat3\variat3.asm ;ATTENTION: AL doit etre stocké en RAM à (adresse de AH) +1 F:\Electronique\DataPic\Variat3\variat3.asm 0001f4 0084 MOVWF 0x4 movxA movwf FSR F:\Electronique\DataPic\Variat3\variat3.asm 0001f5 0800 MOVF 0x0,0x0 movf INDF,w F:\Electronique\DataPic\Variat3\variat3.asm 0001f6 00a4 MOVWF 0x24 movwf AH F:\Electronique\DataPic\Variat3\variat3.asm 0001f7 0a84 INCF 0x4,0x1 incf FSR,f F:\Electronique\DataPic\Variat3\variat3.asm 0001f8 0800 MOVF 0x0,0x0 movf INDF,w F:\Electronique\DataPic\Variat3\variat3.asm 0001f9 00a5 MOVWF 0x25 movwf AL F:\Electronique\DataPic\Variat3\variat3.asm 0001fa 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;mov AH,AL dans -> la variable codée sur 2 octets situés aux adresses w et w+1 F:\Electronique\DataPic\Variat3\variat3.asm ;ATTENTION: AL doit etre stocké en RAM à (adresse de AH) +1 F:\Electronique\DataPic\Variat3\variat3.asm 0001fb 0084 MOVWF 0x4 movAx movwf FSR F:\Electronique\DataPic\Variat3\variat3.asm 0001fc 0824 MOVF 0x24,0x0 movf AH,w F:\Electronique\DataPic\Variat3\variat3.asm 0001fd 0080 MOVWF 0x0 movwf INDF F:\Electronique\DataPic\Variat3\variat3.asm 0001fe 0a84 INCF 0x4,0x1 incf FSR,f F:\Electronique\DataPic\Variat3\variat3.asm 0001ff 0825 MOVF 0x25,0x0 movf AL,w F:\Electronique\DataPic\Variat3\variat3.asm 000200 0080 MOVWF 0x0 movwf INDF F:\Electronique\DataPic\Variat3\variat3.asm 000201 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;mov la variable codée sur 2 octets situés aux adresses w et w+1 dans -> BH,BL F:\Electronique\DataPic\Variat3\variat3.asm ;ATTENTION: BL doit etre stocké en RAM à (adresse de BH) +1 F:\Electronique\DataPic\Variat3\variat3.asm 000202 0084 MOVWF 0x4 movxB movwf FSR F:\Electronique\DataPic\Variat3\variat3.asm 000203 0800 MOVF 0x0,0x0 movf INDF,w F:\Electronique\DataPic\Variat3\variat3.asm 000204 00a6 MOVWF 0x26 movwf BH F:\Electronique\DataPic\Variat3\variat3.asm 000205 0a84 INCF 0x4,0x1 incf FSR,f F:\Electronique\DataPic\Variat3\variat3.asm 000206 0800 MOVF 0x0,0x0 movf INDF,w F:\Electronique\DataPic\Variat3\variat3.asm 000207 00a7 MOVWF 0x27 movwf BL F:\Electronique\DataPic\Variat3\variat3.asm 000208 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;mov BH,BL dans -> la variable codée sur 2 octets situés aux adresses w et w+1 F:\Electronique\DataPic\Variat3\variat3.asm ;ATTENTION: BL doit etre stocké en RAM à (adresse de BH) +1 F:\Electronique\DataPic\Variat3\variat3.asm 000209 0084 MOVWF 0x4 movBx movwf FSR F:\Electronique\DataPic\Variat3\variat3.asm 00020a 0826 MOVF 0x26,0x0 movf BH,w F:\Electronique\DataPic\Variat3\variat3.asm 00020b 0080 MOVWF 0x0 movwf INDF F:\Electronique\DataPic\Variat3\variat3.asm 00020c 0a84 INCF 0x4,0x1 incf FSR,f F:\Electronique\DataPic\Variat3\variat3.asm 00020d 0827 MOVF 0x27,0x0 movf BL,w F:\Electronique\DataPic\Variat3\variat3.asm 00020e 0080 MOVWF 0x0 movwf INDF F:\Electronique\DataPic\Variat3\variat3.asm 00020f 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;comparaison de deux valeurs codées sur 16 bits (AH,L à BH,L) F:\Electronique\DataPic\Variat3\variat3.asm ;resultat dans STATUS carry et zéro F:\Electronique\DataPic\Variat3\variat3.asm ;les valeurs doivent représenter des nombres tous deux positifs (pas ok si valeurs codées en complément à 2 F:\Electronique\DataPic\Variat3\variat3.asm ;sauf pour le test d'égalité STATUS,Z ('z') ) ;16p-> p comme positifs F:\Electronique\DataPic\Variat3\variat3.asm ;les valeurs des flags c et z qui sont retournées sont les même que celles de l'instruction subwf F:\Electronique\DataPic\Variat3\variat3.asm ;z indiquant l'égalité et c=o si négatif c.a.d si A>B F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000210 0824 MOVF 0x24,0x0 compar16p movf AH,w F:\Electronique\DataPic\Variat3\variat3.asm 000211 0226 SUBWF 0x26,0x0 subwf BH,w ;f-w c.a.d B-A c=0 si neg donc si AH>BH F:\Electronique\DataPic\Variat3\variat3.asm 000212 1d03 BTFSS 0x3,0x2 btfss STATUS,Z ;z=1 si AH=BH il faut alors comparer AL à BL F:\Electronique\DataPic\Variat3\variat3.asm 000213 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm 000214 0825 MOVF 0x25,0x0 movf AL,w F:\Electronique\DataPic\Variat3\variat3.asm 000215 0227 SUBWF 0x27,0x0 subwf BL,w ;z=1 si AL=BL et comme on sait déjà que AH=BH, si z=1 -> A=B F:\Electronique\DataPic\Variat3\variat3.asm 000216 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;comparaison de deux valeurs codées sur 24 bits (A2,1,0 à B2,1,0) F:\Electronique\DataPic\Variat3\variat3.asm ;resultat dans STATUS carry et zéro F:\Electronique\DataPic\Variat3\variat3.asm ;les valeurs doivent représenter des nombres tous deux positifs (pas ok si valeurs codées en complément à 2 F:\Electronique\DataPic\Variat3\variat3.asm ;sauf pour le test d'égalité STATUS,Z ('z') ) ;16p-> p comme positifs F:\Electronique\DataPic\Variat3\variat3.asm ;les valeurs des flags c et z qui sont retournées sont les même que celles de l'instruction subwf F:\Electronique\DataPic\Variat3\variat3.asm ;z indiquant l'égalité et c=o si négatif c.a.d si A>B F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm 000217 082a MOVF 0x2a,0x0 compar24p movf A2,w F:\Electronique\DataPic\Variat3\variat3.asm 000218 022d SUBWF 0x2d,0x0 subwf B2,w ;f-w c=0 si neg donc si AH>BH F:\Electronique\DataPic\Variat3\variat3.asm 000219 1d03 BTFSS 0x3,0x2 btfss STATUS,Z ;z=1 si A2=B2 il faut alors comparer A1 à B1 F:\Electronique\DataPic\Variat3\variat3.asm 00021a 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm 00021b 082b MOVF 0x2b,0x0 movf A1,w F:\Electronique\DataPic\Variat3\variat3.asm 00021c 022e SUBWF 0x2e,0x0 subwf B1,w F:\Electronique\DataPic\Variat3\variat3.asm 00021d 1d03 BTFSS 0x3,0x2 btfss STATUS,Z ;z=1 si A1=B1 et comme on sait déjà que A2=B2, il faut alors comparer A0 à B0 F:\Electronique\DataPic\Variat3\variat3.asm 00021e 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm 00021f 082c MOVF 0x2c,0x0 movf A0,w F:\Electronique\DataPic\Variat3\variat3.asm 000220 022f SUBWF 0x2f,0x0 subwf B0,w ;z=1 si A0=B0 et comme on sait déjà que A2,1=B2,1, si z=1 -> A=B F:\Electronique\DataPic\Variat3\variat3.asm 000221 0008 RETURN return F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm ;DATA EN EEPROM F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;ORG 0x2100 ; zone EEPROM F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;=============================================================================================================== F:\Electronique\DataPic\Variat3\variat3.asm end F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm F:\Electronique\DataPic\Variat3\variat3.asm ;TEMPO AJUSTABLE F:\Electronique\DataPic\Variat3\Delay.asm ;Delay_ms F:\Electronique\DataPic\Variat3\Delay.asm ;REMERCIEMENTS à I.M.B. qui est l'auteur de cette routine. Fred. F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm list r=decimal,p=16f628a F:\Electronique\DataPic\Variat3\Delay.asm errorlevel -205,-207 F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm #include "p16f628a.inc" F:\Electronique\DataPic\Variat3\Delay.asm LIST E:\Program Files\Microchip\MPASM Suite\p16f628a.inc ; P16F628A.INC Standard Header File, Version 1.10 Microchip Technology, Inc. E:\Program Files\Microchip\MPASM Suite\p16f628a.inc LIST E:\Program Files\Microchip\MPASM Suite\p16f628a.inc E:\Program Files\Microchip\MPASM Suite\p16f628a.inc ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm #define CLOCK 20000000 F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm udata_shr F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm Delay res 1 F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm code F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm global Delay_ms F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm Cycles_Par_ms = ( CLOCK + 2000 ) / 4000 F:\Electronique\DataPic\Variat3\Delay.asm InnerLoopCycles = Cycles_Par_ms - 3 F:\Electronique\DataPic\Variat3\Delay.asm CyclesPerLoop = ( InnerLoopCycles + 255 ) / 256 F:\Electronique\DataPic\Variat3\Delay.asm if CyclesPerLoop < 5 F:\Electronique\DataPic\Variat3\Delay.asm CyclesPerLoop = 5 F:\Electronique\DataPic\Variat3\Delay.asm endif F:\Electronique\DataPic\Variat3\Delay.asm LoopRepeats = InnerLoopCycles / CyclesPerLoop F:\Electronique\DataPic\Variat3\Delay.asm CyclesInsideLoop = InnerLoopCycles / LoopRepeats F:\Electronique\DataPic\Variat3\Delay.asm CyclesOutsideLoop = InnerLoopCycles - LoopRepeats * CyclesInsideLoop F:\Electronique\DataPic\Variat3\Delay.asm F:\Electronique\DataPic\Variat3\Delay.asm 000224 00f5 MOVWF 0x75 Delay_ms: movwf Delay F:\Electronique\DataPic\Variat3\Delay.asm 000225 30f9 MOVLW 0xf9 Delay_ms_01: movlw LoopRepeats F:\Electronique\DataPic\Variat3\Delay.asm 000226 0064 CLRWDT Delay_ms_02: clrwdt F:\Electronique\DataPic\Variat3\Delay.asm while CyclesInsideLoop > 6 F:\Electronique\DataPic\Variat3\Delay.asm 000227 2a28 GOTO 0x228 goto $+1 ;Use GOTO Next Instruction instead of two NOPs (remplace 2 NOP) F:\Electronique\DataPic\Variat3\Delay.asm 000228 2a29 GOTO 0x229 000229 2a2a GOTO 0x22a 00022a 2a2b GOTO 0x22b 00022b 2a2c GOTO 0x22c 00022c 2a2d GOTO 0x22d 00022d 2a2e GOTO 0x22e CyclesInsideLoop -= 2 ;CyclesInsideLoo := CyclesInsideLoo -2 F:\Electronique\DataPic\Variat3\Delay.asm endw F:\Electronique\DataPic\Variat3\Delay.asm if CyclesInsideLoop > 5 F:\Electronique\DataPic\Variat3\Delay.asm 00022e 0000 NOP nop F:\Electronique\DataPic\Variat3\Delay.asm endif F:\Electronique\DataPic\Variat3\Delay.asm 00022f 3eff ADDLW 0xff addlw -1 F:\Electronique\DataPic\Variat3\Delay.asm 000230 1d03 BTFSS 0x3,0x2 btfss STATUS,Z F:\Electronique\DataPic\Variat3\Delay.asm 000231 2a26 GOTO 0x226 goto Delay_ms_02 F:\Electronique\DataPic\Variat3\Delay.asm while CyclesOutsideLoop > 1 F:\Electronique\DataPic\Variat3\Delay.asm 000232 2a33 GOTO 0x233 goto $+1 ;= 2 nop F:\Electronique\DataPic\Variat3\Delay.asm 000233 2a34 GOTO 0x234 000234 2a35 GOTO 0x235 000235 2a36 GOTO 0x236 000236 2a37 GOTO 0x237 000237 2a38 GOTO 0x238 000238 2a39 GOTO 0x239 000239 2a3a GOTO 0x23a CyclesOutsideLoop -= 2 F:\Electronique\DataPic\Variat3\Delay.asm endw F:\Electronique\DataPic\Variat3\Delay.asm if CyclesOutsideLoop > 0 F:\Electronique\DataPic\Variat3\Delay.asm 00023a 0000 NOP nop F:\Electronique\DataPic\Variat3\Delay.asm endif F:\Electronique\DataPic\Variat3\Delay.asm 00023b 0bf5 DECFSZ 0x75,0x1 decfsz Delay,f F:\Electronique\DataPic\Variat3\Delay.asm 00023c 2a25 GOTO 0x225 goto Delay_ms_01 F:\Electronique\DataPic\Variat3\Delay.asm 00023d 0008 RETURN return F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm end F:\Electronique\DataPic\Variat3\Delay.asm ;=============================================================================== F:\Electronique\DataPic\Variat3\Delay.asm