;********************************************************************** ; Ce fichier est la base de départ pour une programmation avec * ; le PIC 16F876. Il contient les informations de base pour * ; démarrer. * ; * ; Si les interruptions ne sont pas utilisées, supprimez les lignes * ; entre ORG 0x004 et l'étiquette init. De plus, les variables * ; w_temp et status_temp peuvent être supprimées. * ; * ;********************************************************************** ; * ; NOM: * ; Date: * ; Version: * ; Circuit: ; Auteur: ; * ;********************************************************************** ; * ; Fichier requis: P16F876.inc * ; * ; * ; * ;********************************************************************** ; * ; Notes: * ; * ; * ; * ; * ;********************************************************************** LIST p=16F876 ; Définition de processeur #include ; Définitions des constantes __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _WDT_ON & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de ; la programmation du processeur. Les définitions sont dans le fichier include. ; Voici les valeurs et leurs définitions : ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power on en service ; _PWRTE_OFF Timer reset hors-service ; _WDT_ON Watch-dog en service ; _WDT_OFF Watch-dog hors service ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ; _RC_OSC Oscillateur à réseau RC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* ; Valeur registre option ; 7:Résistance pull-up 1:off 0:on ; 6:niveau d interuption 1:front montant 0:front descendant ; 5:clock source 1:ra4 pin 0:interne ; 4:increment de clock 1:front descendant 0:front montant ; 3:diviseur interne 1:wdt 0:timer0 ; 2,1,0:valeur du diviseur div tmr0 wdt ; 000 2 1 ; 001 4 2 ; 010 8 4 ; 011 16 8 ; 100 32 16 ; 101 64 32 ; 110 128 64 ; 111 256 128 OPTIONVAL EQU B'10000010' ; Masque d'interruption ; 7:all interupt 1:on 0:off ; 6:peripheral int 1:on 0:off ; 5:tmr0 int 1:on 0:off ; 4:rb0 int 1:on 0:off ; 3:rb port int 1:on 0:off ; 2:tmr0 flag int 1:mark 0:not mark ; 1:rb0 flag int 1:mark 0:not mark ; 0:rb flag int 1:mark 0:not mark INTERMASK EQU B'10100100' INTERMASK1 EQU B'10000000' ; mask d interuption des periferiques ; 7:parallel slave port 1:on 0:off ; 6:CAN int 1:on 0:off ; 5:uart rx int 1:on 0:off ; 4:uart tx int 1:on 0:off ; 3:syncro serie int 1:on 0:off ; 2:ccp1 int 1:on 0:off ; 1:tmr2 to pr2 int 1:on 0:off ; 0:tmr1 int 1:on 0:off INTERMASK2 EQU B'00000000' ;FREQH EQU B'01101010' ;27.142MHz ;FREQL EQU B'00000110' ;CONFH EQU B'10011101' ;CONF SAA1057 ;CONFL EQU B'01000101' ;PLLC EQU B'01101100' ;PLLRHI EQU B'00001111' ;4000 f ref=1KHz ;PLLRLO EQU B'10100000' ;4000 f ref=1KHz ;PLLNHI EQU B'01101010' ;27147 f ref=1KHz ;PLLNLO EQU B'00001011' ;27147 f ref=1KHz PLLC EQU B'00001100' PLLRHI EQU B'00001111' ;4000 f ref=1KHz PLLRLO EQU B'10100000' ;4000 f ref=1KHz PLLNHI EQU B'01101001' ;27025 f ref=1KHz PLLNLO EQU B'10010001' ;27025 f ref=1KHz ERRMAX EQU 30 ;********************************************************************* ; DEFINE * ;********************************************************************* ; exemples ; --------- ;#DEFINE PLLLOCK PORTC,0 ; PLL #DEFINE PLLCE PORTC,1 ; PLL #DEFINE PLLCLK PORTC,0 ; PLL #DEFINE PLLDATA PORTC,2 ; PLL #DEFINE LED PORTC,4 ; PLL #DEFINE FPLL FLAG,0 ; FLAGPLL #DEFINE SWITCH PORTC,3 ; SELECTION RS232 PWD ;********************************************************************* ; MACRO * ;********************************************************************* ; PAGE/BANK0/1/2/3 selects register bank 0/1/2/3. ; Leave set to BANK0 normally. BANK0 MACRO BCF STATUS,RP0 ; clear bank select bits BCF STATUS,RP1 BCF STATUS,IRP ; clear indirect adressing bit ENDM BANK1 MACRO BSF STATUS,RP0 ; BCF STATUS,RP1 ; BCF STATUS,IRP ; clear indirect adressing bit ENDM BANK2 MACRO BCF STATUS,RP0 ; BSF STATUS,RP1 BSF STATUS,IRP ; set bit for indirect adressing ENDM BANK3 MACRO BSF STATUS,RP0 ; BSF STATUS,RP1 BSF STATUS,IRP ; set bit for indirect adressing ENDM ; macros for accessing page's directly PAGE0 MACRO BCF PCLATH,3 BCF PCLATH,4 ENDM PAGE1 MACRO BSF PCLATH,3 BCF PCLATH,4 ENDM PAGE2 MACRO BCF PCLATH,3 BSF PCLATH,4 ENDM PAGE3 MACRO BSF PCLATH,3 BSF PCLATH,4 ENDM ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* ;exemples ;--------- CBLOCK 0x020 ; début de la zone variables w_temp :1 ; Zone de 1 byte status_temp : 1 ; zone de 1 byte VANA1 :1 ;analog1 VANA2 :1 ;analog1 VANA3 :1 ;analog1 VANA4 :1 ;analog1 VALNUM :1 ;numero de l octet a envoyer VTIME :1 ;variable interuption VTIME2 :1 ;variable interuption VTIME3 :1 ;variable interuption VTIME4 :1 ;variable interuption VAR1 :1 ;variable 1 VAR2 :1 ;variable 2 FLAG :1 ;FLAG DATA8 :1 ;VALEUR DANS LA PLL VANA :1 ;valeur ana MOYH :1 ;valeur DU CALCUL DE LA MOYENNE MOYL :1 ;valeur DU CALCUL DE LA MOYENNE VALUART :1 ;numero de la valeur a envoyer DATAMOY1 :1 ;tableau pour calculer la moyenne DATAMOY :8 ;tableau pour calculer la moyenne DATAMOY2 :8 ;tableau pour calculer la moyenne ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ;sauvegarder registres ;--------------------- org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ; switch vers différentes interrupts ; inverser ordre pour modifier priorités ;---------------------------------------- btfsc INTCON,T0IE ; tester si interrupt timer autorisée btfss INTCON,T0IF ; oui, tester si interrupt timer en cours goto intsw1 ; non test suivant call inttimer ; oui, traiter interrupt timer bcf INTCON,T0IF ; effacer flag interrupt timer goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS intsw1 btfsc INTCON,INTE ; tester si interrupt RB0 autorisée btfss INTCON,INTF ; oui, tester si interrupt RB0 en cours goto intsw2 ; non sauter au test suivant call intrb0 ; oui, traiter interrupt RB0 bcf INTCON,INTF ; effacer flag interupt RB0 goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS intsw2 btfsc INTCON,RBIE ; tester si interrupt RB4/7 autorisée btfss INTCON,RBIF ; oui, tester si interrupt RB4/7 en cours goto intadi ; non sauter call intrb4 ; oui, traiter interrupt RB4/7 bcf INTCON,RBIF ; effacer flag interupt RB4/7 goto restorereg ; et fin d'interrupt intadi BANK1 btfss PIE1,ADIE ; tester si interrupt CAN autorisée goto intrci ; non sauter BANK0 btfss PIR1,ADIF ; oui, tester si interrupt CAN en cours goto intrci ; non sauter call INTADIE ; oui, traiter interrupt CAN bcf PIR1,ADIF ; effacer flag interupt CAN goto restorereg ; et fin d'interrupt intrci BANK1 btfss PIE1,RCIE ; tester si interrupt UART RX autorisée goto inttxi ; non sauter BANK0 btfss PIR1,RCIF ; oui, tester si interrupt UART RX en cours goto inttxi ; non sauter call INTRCIE ; oui, traiter interrupt UART RX bcf PIR1,RCIF ; effacer flag interupt UART RX goto restorereg ; et fin d'interrupt inttxi BANK1 btfss PIE1,TXIE ; tester si interrupt UART TX autorisée goto intspi ; non sauter BANK0 btfss PIR1,TXIF ; oui, tester si interrupt UART TX en cours goto intspi ; non sauter call INTTXIE ; oui, traiter interrupt UART TX bcf PIR1,TXIF ; effacer flag interupt UART TX goto restorereg ; et fin d'interrupt intspi BANK1 btfss PIE1,SSPIE ; tester si interrupt SSP autorisée goto intccp ; non sauter BANK0 btfss PIR1,SSPIF ; oui, tester si interrupt SSP en cours goto intccp ; non sauter call INTSSPIE ; oui, traiter interrupt SSP bcf PIR1,SSPIF ; effacer flag interupt SSP goto restorereg ; et fin d'interrupt intccp BANK1 btfss PIE1,CCP1IE ; tester si interrupt CCP autorisée goto inttmr2 ; non sauter BANK0 btfss PIR1,CCP1IF ; oui, tester si interrupt CCP en cours goto inttmr2 ; non sauter call INTCCP1IE ; oui, traiter interrupt CCP bcf PIR1,CCP1IF ; effacer flag interupt CCP goto restorereg ; et fin d'interrupt inttmr2 BANK1 btfss PIE1,TMR2IE ; tester si interrupt TMR2 autorisée goto inttmr1 ; non sauter BANK0 btfss PIR1,TMR2IF ; oui, tester si interrupt TMR2 en cours goto inttmr1 ; non sauter call INTTMR2IE ; oui, traiter interrupt TMR2 bcf PIR1,TMR2IF ; effacer flag interupt TMR2 goto restorereg ; et fin d'interrupt inttmr1 BANK1 btfss PIE1,TMR1IE ; tester si interrupt TMR1 autorisée goto inttmr3 ; non sauter BANK0 btfss PIR1,TMR1IF ; oui, tester si interrupt TMR1 en cours goto inttmr3 ; non sauter call INTTMR1IE ; oui, traiter interrupt TMR1 bcf PIR1,TMR1IF ; effacer flag interupt TMR1 goto restorereg ; et fin d'interrupt inttmr3 ;restaurer registres ;------------------- restorereg swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION TIMER 0 * ;********************************************************************** inttimer DECF VTIME,F DECFSZ VTIME3,F GOTO INITTIMER2 DECFSZ VTIME4,F GOTO INITTIMER2 BSF FPLL INITTIMER2 return ; fin d'interruption timer ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** intrb0 return ; fin d'interruption RB0/INT ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION RB0/RB4 * ;********************************************************************** intrb4 return ; fin d'interruption RB0/RB4 ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION CAN * ;********************************************************************** INTADIE return ; fin d'interruption CAN ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION UART RX * ;********************************************************************** INTRCIE return ; fin d'interruption UART RX ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION UART TX * ;********************************************************************** INTTXIE RETURN ; fin d'interruption UART TX ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION SSP * ;********************************************************************** INTSSPIE return ; fin d'interruption SSP ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION CCP * ;********************************************************************** INTCCP1IE return ; fin d'interruption CCP ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION TMR2 * ;********************************************************************** INTTMR2IE return ; fin d'interruption TMR2 ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION TMR1 * ;********************************************************************** INTTMR1IE return ; fin d'interruption TMR1 ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 BANK1 ; sélectionner banque 1 clrf EEADR ; permet de diminuer la consommation movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x20 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler MOVLW INTERMASK2 ; masque interruption2 MOVWF PIE1 MOVLW B'00111111' MOVWF TRISA MOVLW B'11111111' MOVWF TRISB MOVLW B'11101000' MOVWF TRISC MOVLW B'00001010' ;can MOVWF ADCON1 MOVLW 25 ;uart speed 2.4kbaud MOVWF SPBRG MOVLW B'10100000' ;uart tx MOVWF TXSTA BANK0 ; Sélectionner banque 0 MOVLW B'10000000' ;uart rx MOVWF RCSTA movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control MOVLW B'00110001' ;timer1 8µs no interuption MOVWF T1CON MOVLW B'01111111' ;timer2 8µs no interuption MOVWF T2CON BSF LED ; CALL SENDPLL BSF PIR1,TXIF CALL SENDPLL ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* BTFSC SWITCH GOTO START2 START clrwdt ; effacer watch dog ; BCF LED CALL TEMPO ; CALL TESTM ; GOTO START CALL GETAN1 CALL TEMPO CALL TEMPO CALL TEMPO CALL SENDDATA ;DATA ana1 GOTO START START2 CLRWDT CALL GETAN1 CALL SENDDATAP ;DATA ana1 GOTO START2 ;********************************************************************* ; routine de codage can * ;********************************************************************* GETAN1 MOVLW B'01000001' MOVWF ADCON0 MOVLW DATAMOY1 ;chargement de l adresse du tableau MOVWF FSR MOVLW 9 MOVWF VAR1 GETAN12 CALL TEMPOS BSF ADCON0,GO GETAN2 CLRWDT BTFSC ADCON0,NOT_DONE GOTO GETAN2 MOVFW ADRESH MOVWF INDF INCF FSR,F DECFSZ VAR1,F GOTO GETAN12 MOVLW B'01001001' MOVWF ADCON0 ;positionnement deja de la 2e variable CALL CMOY CALL REJECT CALL CMOY CALL REJECT CALL CMOY MOVWF VANA1 MOVLW DATAMOY1 ;chargement de l adresse du tableau MOVWF FSR MOVLW 9 MOVWF VAR1 GETAN13 CALL TEMPOS BSF ADCON0,GO GETAN3 CLRWDT BTFSC ADCON0,NOT_DONE GOTO GETAN3 MOVFW ADRESH MOVWF INDF INCF FSR,F DECFSZ VAR1,F GOTO GETAN13 MOVLW B'01010001' MOVWF ADCON0 ;positionnement deja de la 2e variable CALL CMOY CALL REJECT CALL CMOY CALL REJECT CALL CMOY MOVWF VANA2 MOVLW DATAMOY1 ;chargement de l adresse du tableau MOVWF FSR MOVLW 9 MOVWF VAR1 GETAN14 CALL TEMPOS BSF ADCON0,GO GETAN4 CLRWDT BTFSC ADCON0,NOT_DONE GOTO GETAN4 MOVFW ADRESH MOVWF INDF INCF FSR,F DECFSZ VAR1,F GOTO GETAN14 MOVLW B'01100001' MOVWF ADCON0 ;positionnement deja de la 2e variable CALL CMOY CALL REJECT CALL CMOY CALL REJECT CALL CMOY MOVWF VANA3 MOVLW DATAMOY1 ;chargement de l adresse du tableau MOVWF FSR MOVLW 9 MOVWF VAR1 GETAN15 CALL TEMPOS BSF ADCON0,GO GETAN5 CLRWDT BTFSC ADCON0,NOT_DONE GOTO GETAN5 MOVFW ADRESH MOVWF INDF INCF FSR,F DECFSZ VAR1,F GOTO GETAN15 MOVLW B'01100001' MOVWF ADCON0 ;positionnement deja de la 2e variable CALL CMOY CALL REJECT CALL CMOY CALL REJECT CALL CMOY MOVWF VANA4 GETAN11 RETURN ;********************************************************************* ; routine de CALCUL DE LA MOYENNE * ;********************************************************************* CMOY CLRF MOYL CLRF MOYH MOVLW 8 MOVWF VAR1 MOVLW DATAMOY MOVWF FSR CMOY2 MOVLW B'00000111' ANDWF INDF,W ADDWF MOYL,F INCF FSR,F DECFSZ VAR1,F GOTO CMOY2 BCF STATUS,C RRF MOYL,F BCF STATUS,C RRF MOYL,F BCF STATUS,C RRF MOYL,F MOVLW 8 MOVWF VAR1 MOVLW DATAMOY MOVWF FSR CMOY3 MOVFW INDF MOVWF VAR2 BCF STATUS,C RRF VAR2,F BCF STATUS,C RRF VAR2,F BCF STATUS,C RRF VAR2,W ADDWF MOYH,F INCF FSR,F DECFSZ VAR1,F GOTO CMOY3 MOVFW MOYL ADDWF MOYH,W RETURN ;********************************************************************* ; routine de REJECTION DES EREURS * ;********************************************************************* REJECT MOVWF MOYH MOVLW 8 MOVWF VAR1 MOVLW DATAMOY MOVWF FSR MOVLW ERRMAX SUBWF MOYH,W BTFSS STATUS,C ;TEST SI MOY >ERREUR MAX GOTO REJECT4 MOVLW ERRMAX SUBWF MOYH,W MOVWF VAR2 REJECT2 MOVFW INDF ;TEST SI VALEUR DU TABLEAU SUBWF VAR2,W ;EST < MOY-ERREUR MAX BTFSS STATUS,C GOTO REJECT3 MOVLW 8 ;TEST SI C LA 1ER VALEUR SUBWF VAR1,W ;SI OUI ALOR VALEUR=MOY BTFSS STATUS,Z GOTO REJECT8 MOVFW MOYH MOVWF INDF GOTO REJECT3 REJECT8 DECF FSR,F ;SI NON VALEUR =VALEUR -1 MOVFW INDF INCF FSR,F MOVWF INDF REJECT3 INCF FSR,F DECFSZ VAR1,F GOTO REJECT2 REJECT4 MOVLW 8 MOVWF VAR1 MOVLW DATAMOY MOVWF FSR MOVLW 255-ERRMAX SUBWF MOYH,W BTFSC STATUS,C ;TEST SI MOY <230 GOTO REJECT7 MOVLW ERRMAX ADDWF MOYH,W MOVWF VAR2 REJECT5 MOVFW INDF SUBWF VAR2,W BTFSC STATUS,C GOTO REJECT6 MOVLW 8 SUBWF VAR1,W BTFSS STATUS,Z GOTO REJECT9 MOVFW MOYH MOVWF INDF GOTO REJECT6 REJECT9 DECF FSR,F MOVFW INDF INCF FSR,F MOVWF INDF REJECT6 INCF FSR,F DECFSZ VAR1,F GOTO REJECT5 REJECT7 RETURN ;********************************************************************* ; routine de test * ;********************************************************************* TESTM MOVLW DATAMOY ;chargement de l adresse du tableau MOVWF FSR MOVLW H'51' MOVWF INDF INCF FSR,F MOVLW H'52' MOVWF INDF INCF FSR,F MOVLW H'53' MOVWF INDF INCF FSR,F MOVLW H'54' MOVWF INDF INCF FSR,F MOVLW H'55' MOVWF INDF INCF FSR,F MOVLW H'56' MOVWF INDF INCF FSR,F MOVLW H'57' MOVWF INDF INCF FSR,F MOVLW H'58' MOVWF INDF INCF FSR,F MOVLW H'59' MOVWF INDF INCF FSR,F MOVLW H'5A' MOVWF INDF INCF FSR,F MOVLW H'FE' ;ERREUR MOVWF INDF INCF FSR,F MOVLW H'FF' MOVWF INDF INCF FSR,F MOVLW H'FA' MOVWF INDF INCF FSR,F MOVLW H'5E' MOVWF INDF INCF FSR,F MOVLW H'5F' MOVWF INDF INCF FSR,F MOVLW H'60' MOVWF INDF INCF FSR,F CALL CMOY CALL REJECT CALL CMOY MOVWF VANA1 RETURN ;********************************************************************* ; routine de d envoie des donmees rs232 * ;********************************************************************* SENDDATA CLRWDT BTFSS PIR1,TXIF GOTO SENDDATA MOVLW H'AA' MOVWF TXREG SENDDATA1 CLRWDT BTFSS PIR1,TXIF GOTO SENDDATA1 COMF PORTB,W MOVWF TXREG SENDDATA2 CLRWDT BTFSS PIR1,TXIF GOTO SENDDATA2 MOVFW VANA1 MOVWF TXREG SENDDATA3 CLRWDT ;debut tempo BTFSS PIR1,TXIF GOTO SENDDATA3 BCF INTCON,7 ;interuption off BANK1 ; sélectionner banque 1 SENDDATA7 CLRWDT BTFSS TXSTA,TRMT GOTO SENDDATA7 BANK0 BSF INTCON,7 ;interuption on BCF LED CALL TEMPO CALL TEMPO CALL TEMPO CALL TEMPO CALL TEMPO CALL TEMPO CALL TEMPO CALL TEMPO ;FIN TEMPO BSF LED MOVFW VANA2 MOVWF TXREG SENDDATA4 CLRWDT BTFSS PIR1,TXIF GOTO SENDDATA4 MOVFW VANA3 MOVWF TXREG SENDDATA5 CLRWDT BTFSS PIR1,TXIF GOTO SENDDATA5 MOVFW VANA4 MOVWF TXREG SENDDATA6 CLRWDT ;FIN DE TRANSMISSION BTFSS PIR1,TXIF GOTO SENDDATA6 BCF INTCON,7 ;interuption off BANK1 ; sélectionner banque 1 SENDDATA8 CLRWDT BTFSS TXSTA,TRMT GOTO SENDDATA8 BANK0 BSF INTCON,7 ;interuption on RETURN ;********************************************************************* ; routine de d envoie des donmees pwm * ;********************************************************************* SENDDATAP movlw INTERMASK1 ; masque interruption timer1 off movwf INTCON ; charger interrupt control BANK1 MOVLW B'00001000' ;rs232 output off MOVWF TRISC BCF TXSTA,5 BANK0 BCF RCSTA,7 CLRWDT CLRF TMR1H CLRF TMR1L MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP2 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP2 BCF PORTC,6 ;fin du puls MOVLW H'AA' SUBWF TMR2,F ;tempo de data1 SENDDATAP3 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP3 ;fin de tempo data1 MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP4 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP4 BCF PORTC,6 ;fin du puls COMF PORTB,W SUBWF TMR2,F ;tempo de data1 SENDDATAP5 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP5 ;fin de tempo data1 MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP6 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP6 BCF PORTC,6 ;fin du puls BCF LED MOVFW VANA1 SUBWF TMR2,F ;tempo de data1 SENDDATAP7 CLRWDT MOVF TMR2,W BTFSC STATUS,Z GOTO SENDDATAP7 ;fin de tempo data1 SENDDATAP8 CLRWDT MOVFW TMR1H ;test si 20ms sont passé SUBLW B'00001001' BTFSS STATUS,Z GOTO SENDDATAP8 ;fin du test de l octet de poind fort SENDDATAP9 CLRWDT MOVFW TMR1L ;test si 20ms sont passé SUBLW B'11000100' BTFSS STATUS,Z GOTO SENDDATAP9 ;fin du test de l octet de poind faible BSF LED CLRWDT CLRF TMR1H CLRF TMR1L MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP12 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP12 BCF PORTC,6 ;fin du puls MOVFW VANA2 SUBWF TMR2,F ;tempo de data1 SENDDATAP13 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP13 ;fin de tempo data1 MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP14 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP14 BCF PORTC,6 ;fin du puls MOVFW VANA3 SUBWF TMR2,F ;tempo de data1 SENDDATAP15 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP15 ;fin de tempo data1 MOVLW 131 ;pulse 2µs MOVWF TMR2 BSF PORTC,6 SENDDATAP16 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP16 BCF PORTC,6 ;fin du puls BCF LED MOVFW VANA4 SUBWF TMR2,F ;tempo de data1 SENDDATAP17 CLRWDT MOVF TMR2,W BTFSS STATUS,Z GOTO SENDDATAP17 ;fin de tempo data1 ;SENDDATAP18 CLRWDT ; MOVFW TMR1H ;test si 20ms sont passé ; SUBLW B'00001001' ; BTFSS STATUS,Z ; GOTO SENDDATAP18 ;fin du test de l octet de poind fort ;SENDDATAP19 CLRWDT ; MOVFW TMR1L ;test si 20ms sont passé ; SUBLW B'11000100' ; BTFSS STATUS,Z ; GOTO SENDDATAP19 ;fin du test de l octet de poind faible BSF LED RETURN ;********************************************************************* ; routine de transmission pll * ;********************************************************************* SENDPLL CALL PLLINIT ;SET THE GOOD VALIU TO THE PINE CALL TEMPO ; CALL PLLRESET ;RESET PLL CALL TEMPO MOVLW PLLC ;SEND PLL C MOVWF DATA8 CALL SENDPLL8 BSF PLLCE CALL TEMPO MOVLW PLLRHI ;SEND PLL R MOVWF DATA8 CALL SENDPLL7 MOVLW PLLRLO MOVWF DATA8 CALL SENDPLL8 BSF PLLCE CALL TEMPO MOVLW PLLNHI ;SEND PLL N MOVWF DATA8 CALL SENDPLL8 MOVLW PLLNLO MOVWF DATA8 CALL SENDPLL8 BSF PLLCE CALL TEMPO RETURN PLLINIT BSF PLLCE BCF PLLCLK BCF PLLDATA CALL TEMPO RETURN PLLRESET MOVLW 5 MOVWF VAR1 PLLRESET1 BSF PLLCLK CALL TEMPO BCF PLLCLK CALL TEMPO DECFSZ VAR1,F GOTO PLLRESET1 BCF PLLCE MOVLW 3 MOVWF VAR1 PLLRESET2 BSF PLLCLK CALL TEMPO BCF PLLCLK CALL TEMPO DECFSZ VAR1,F GOTO PLLRESET2 BSF PLLDATA CALL TEMPO BSF PLLCLK CALL TEMPO BCF PLLCLK CALL TEMPO BCF PLLDATA CALL TEMPO BSF PLLCLK CALL TEMPO BCF PLLCLK CALL TEMPO BSF PLLCE CALL TEMPO RETURN SENDPLL8 MOVLW 8 MOVWF VAR1 BCF PLLCLK BCF PLLCE CALL TEMPO SENDPLL81 BTFSS DATA8,7 GOTO SENDPLL82 BSF PLLDATA GOTO SENDPLL83 SENDPLL82 BCF PLLDATA SENDPLL83 CALL TEMPO BSF PLLCLK CALL TEMPO BCF PLLCLK RLF DATA8,F DECFSZ VAR1,F GOTO SENDPLL81 CALL TEMPO RETURN SENDPLL7 MOVLW 7 MOVWF VAR1 BCF PLLCLK BCF PLLCE CALL TEMPO RLF DATA8,F SENDPLL71 BTFSS DATA8,7 GOTO SENDPLL72 BSF PLLDATA GOTO SENDPLL73 SENDPLL72 BCF PLLDATA SENDPLL73 CALL TEMPO BSF PLLCLK CALL TEMPO BCF PLLCLK RLF DATA8,F DECFSZ VAR1,F GOTO SENDPLL71 CALL TEMPO RETURN ;********************************************************************* ; routine tempo 1ms * ;********************************************************************* TEMPO ; RETURN MOVLW 131 MOVWF TMR0 MOVLW 1 MOVWF VTIME TEMPO2 CLRWDT MOVF VTIME,W BTFSS STATUS,Z GOTO TEMPO2 RETURN ;********************************************************************* ; routine tempo 20µS * ;********************************************************************* TEMPOS ; RETURN MOVLW 10 MOVWF VTIME CLRF TMR0 TEMPOS2 DECFSZ VTIME,F GOTO TEMPOS2 RETURN ;********************************************************************* ; routine tempo TRES LONG 125ms * ;********************************************************************* TEMPO20 MOVLW 32 MOVWF VTIME2 TEMPO21 CLRWDT CALL TEMPO DECFSZ VTIME2,F GOTO TEMPO21 RETURN END ; directive fin de programme