;********************************************************************** ; 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: * ; * ; * ; * ; * ;********************************************************************** ;http://www.sprut.de/electronic/pic/grund/rs232.htm 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'10000100' OPTIONVAL2 EQU B'10000110' ; 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'11100000' ; 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' INTERMASK2B EQU B'00000000' TIMER1R EQU B'00100001' ;********************************************************************* ; DEFINE * ;********************************************************************* ; exemples ; --------- #DEFINE DATAIN PORTC,7 ; data from recever #DEFINE SERVO1 PORTA,1 ; SERVO1 #DEFINE SERVO2 PORTA,2 ; SERVO2 #DEFINE SERVO3 PORTA,3 ; SERVO3 #DEFINE SERVO4 PORTB,5 ; SERVO4 #DEFINE WATHERD PORTA,5 ; WATHER DETECT #DEFINE ALIMP PORTC,1 ; ALIM LOW POWER SETECT #DEFINE PLOAD PORTB,0 ; pload 595 #DEFINE CLOCK PORTC,5 ; CLOCK 595 #DEFINE DATA PORTB,1 ; DATA 595 #DEFINE MOTORF PORTB,2 ; MOTEUR MARCHE AVENT #DEFINE MOTORR PORTB,3 ; MOTEUR MARCHE ARRIERE #DEFINE MOTORP PORTB,4 ; MOTEUR PROPULSION PWM #DEFINE LED PORTA,0 ; LED ;********************************************************************* ; 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 PUSH MACRO MOVWF Saved_W ; save w reg SWAPF STATUS,W ;The swapf instruction, unlike the movf, affects NO status bits, which is why it is used here. CLRF STATUS ; sets to BANK0 MOVWF Saved_Status ; save status reg MOVF PCLATH,W MOVWF Saved_Pclath ; save pclath CLRF PCLATH MOVF FSR,W MOVWF Saved_Fsr ; save fsr reg ENDM PULL MACRO MOVF Saved_Fsr,W ; get saved fsr reg MOVWF FSR ; restore MOVF Saved_Pclath,W ; get saved pclath MOVWF PCLATH ; restore SWAPF Saved_Status,W ; get saved status in w MOVWF STATUS ; restore status ( and bank ) SWAPF Saved_W,F ; reload into self to set status bits SWAPF Saved_W,W ; and restore 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 VALNUM :1 ;numero de l octet a envoyer VTIME :1 ;variable interuption VTIME2 :1 ;variable interuption VAR1 :1 ;variable 1 VAR2 :1 ;variable 2 VAR3 :1 ;variable 2 VANA :1 ;valeur ana VAR595 :1 ;VARIABLE 74HC595 VAR595OLD :1 ;ENCIENNE VARIABLE 74HC595 OLDPORT :1 ;ENCIENNE VALEUR 8BIT DATA8 :1 ;VALEUR DANS LA PLL VALUART :1 ;numero de la valeur a envoyer FLAG :1 ; TIMER1L :1 ; VALSERVO1 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO2 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO3 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO4 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO5 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO6 :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO1OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO2OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO3OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO4OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO5OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO VALSERVO6OUT :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO1 :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO2 :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO3 :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO4 :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO5 :1 ;TEMP DE MISE EN MARCHE DU SERVO OLDVALSERVO6 :1 ;TEMP DE MISE EN MARCHE DU SERVO FLAGSERVO :1 ; FLAG595 :1 ; ENDC ; Fin de la zone ; *** Bank2 *** 80 Bytes CBLOCK 0x120 ENDC ;********************************************************************** ; 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 inttmr1 ; 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 BCF FLAG,0 BSF FLAG,1 CLRF FLAGSERVO DECF VTIME,F DECF DATA8,F 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 BCF MOTORP 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'11110000' MOVWF TRISA MOVLW B'11000000' MOVWF TRISB MOVLW B'11011011' MOVWF TRISC MOVLW B'00000110' ;can MOVWF ADCON1 ; MOVLW 25 ;uart speed 2.4kbaud ; MOVWF SPBRG ; MOVLW B'10000000' ;uart tx ; MOVWF TXSTA BANK0 ; Sélectionner banque 0 ; MOVLW B'10010000' ;uart rx ; MOVWF RCSTA MOVLW B'00110110' ; timer2 val ana fx/16/6 MOVWF T2CON ; MOVLW TIMER1R ; timer1 ; MOVWF T1CON MOVLW B'00000000' ; can MOVWF ADCON0 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control ; BSF PIR1,RCIF ;TEST ; MOVLW H'FF' BSF SERVO1 CLRF VAR595 BSF VAR595,1 CALL PPLOAD CALL TEMPO CLRF VAR595 CLRF FLAG595 CALL PPLOAD ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* START clrwdt ; effacer watch dog ; MOVLW 54 ; MOVWF VALSERVO1 ; MOVLW 12 ; MOVWF VALSERVO2 ; MOVLW 15 ; MOVWF VALSERVO3 ; MOVLW 18 ; MOVWF VALSERVO4 ; MOVLW 38 ; MOVWF VALSERVO5OUT ; MOVLW 50 ; MOVWF VALSERVO6OUT ; CALL CORECTSERV ; CALL OUTSERV ; CALL PWMMOTEUR ; CALL TRAIT595 ; CALL TRAIT595 ; MOVLW 50 ; MOVWF VALSERVO5OUT ; MOVLW 50 ; MOVWF VALSERVO6OUT ; CALL TRAIT595 ; MOVLW 45 ; MOVWF VALSERVO5OUT ; MOVLW 50 ; MOVWF VALSERVO6OUT ; CALL TRAIT595 ; CALL TRAIT595 BCF FLAG,1 BSF LED MOVF DATA8,W ;ces ligne serve a desactiver BTFSS STATUS,Z ;le radar qui perturbe le recepeur GOTO START01 ;il faut les enlevé sur un autre model BCF FLAG595,0 MOVFW FLAG595 MOVWF VAR595 CALL PPLOAD START01 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START01 BCF LED BCF SERVO1 START02 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START02 MOVLW 30 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START03 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START03 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO1 START11 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START11 START12 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START12 MOVLW 30 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START13 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START13 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO2 START21 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START21 START22 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START22 MOVLW 30 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START23 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START23 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO3 START31 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START31 START32 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START32 MOVLW 30 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START33 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START33 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO4 START41 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START41 START42 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START42 MOVLW 32 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START43 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START43 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO5 START51 CLRWDT CLRF TMR0 BTFSC DATAIN GOTO START51 START52 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSS DATAIN GOTO START52 MOVLW 32 ;test si tmr0 et plus grand que 20 SUBWF TMR0,W ;sinon c est un parasit BTFSC STATUS,C GOTO START ;alor retour au debut START53 CLRWDT BTFSC FLAG,1 ;test si 1 chan est plus long que 4ms GOTO START ;si oui retour au debut BTFSC DATAIN GOTO START53 MOVFW TMR0 ;inversion de la valeur du servo MOVWF VALSERVO6 CALL CORECTSERV CALL OUTSERV CALL PWMMOTEUR CALL TRAIT595 START6 GOTO START ;********************************************************************* ; routine de corection numerique * ;********************************************************************* CORECTSERV CLRF TMR0 ; GOTO CORECTSERV8 BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO1,W MOVWF VAR1 MOVFW VALSERVO1 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV2 MOVFW VALSERVO1 MOVWF OLDVALSERVO1 MOVWF VALSERVO1OUT CORECTSERV2 MOVFW OLDVALSERVO1 MOVWF VALSERVO1OUT BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO2,W MOVWF VAR1 MOVFW VALSERVO2 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV3 MOVFW VALSERVO2 MOVWF OLDVALSERVO2 MOVWF VALSERVO2OUT CORECTSERV3 MOVFW OLDVALSERVO2 MOVWF VALSERVO2OUT BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO3,W MOVWF VAR1 MOVFW VALSERVO3 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV4 MOVFW VALSERVO3 MOVWF OLDVALSERVO3 MOVWF VALSERVO3OUT CORECTSERV4 MOVFW OLDVALSERVO3 MOVWF VALSERVO3OUT BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO4,W MOVWF VAR1 MOVFW VALSERVO4 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV5 MOVFW VALSERVO4 MOVWF OLDVALSERVO4 MOVWF VALSERVO4OUT CORECTSERV5 MOVFW OLDVALSERVO4 MOVWF VALSERVO4OUT BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO5,W MOVWF VAR1 MOVFW VALSERVO5 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV6 MOVFW VALSERVO5 MOVWF OLDVALSERVO5 MOVWF VALSERVO5OUT CORECTSERV6 MOVFW OLDVALSERVO5 MOVWF VALSERVO5OUT BCF STATUS,C MOVLW 3 ADDWF OLDVALSERVO6,W MOVWF VAR1 MOVFW VALSERVO6 SUBWF VAR1,W SUBLW 6 BTFSC STATUS,C GOTO CORECTSERV7 MOVFW VALSERVO6 MOVWF OLDVALSERVO6 MOVWF VALSERVO6OUT CORECTSERV7 MOVFW OLDVALSERVO6 MOVWF VALSERVO6OUT CORECTSERV8 MOVLW 30 SUBWF VALSERVO1OUT,F MOVLW 30 SUBWF VALSERVO2OUT,F MOVLW 30 SUBWF VALSERVO3OUT,F MOVLW 30 SUBWF VALSERVO4OUT,F RETURN ;********************************************************************* ; routine de corection numerique * ;********************************************************************* TRAIT595 CLRF VAR595 MOVLW 47 SUBWF VALSERVO5OUT,W BTFSC STATUS,C GOTO TRAIT5955 MOVLW 41 SUBWF VALSERVO5OUT,W BTFSS STATUS,C GOTO TRAIT5952 BSF VAR595,0 GOTO TRAIT59510 MOVLW 1 MOVWF DATA8 TRAIT5952 MOVLW 33 SUBWF VALSERVO5OUT,W BTFSS STATUS,C GOTO TRAIT5953 BSF VAR595,1 GOTO TRAIT59510 TRAIT5953 MOVLW 22 SUBWF VALSERVO5OUT,W BTFSS STATUS,C GOTO TRAIT5954 BSF VAR595,2 GOTO TRAIT59510 TRAIT5954 MOVLW 10 SUBWF VALSERVO5OUT,W BTFSS STATUS,C GOTO TRAIT5955 BSF VAR595,3 GOTO TRAIT59510 TRAIT5955 MOVLW 47 SUBWF VALSERVO6OUT,W BTFSC STATUS,C GOTO TRAIT59511 MOVLW 41 SUBWF VALSERVO6OUT,W BTFSS STATUS,C GOTO TRAIT5956 BSF VAR595,4 GOTO TRAIT59510 TRAIT5956 MOVLW 33 SUBWF VALSERVO6OUT,W BTFSS STATUS,C GOTO TRAIT5957 BSF VAR595,5 GOTO TRAIT59510 TRAIT5957 MOVLW 22 SUBWF VALSERVO6OUT,W BTFSS STATUS,C GOTO TRAIT5958 BSF VAR595,6 GOTO TRAIT59510 TRAIT5958 MOVLW 10 SUBWF VALSERVO6OUT,W BTFSS STATUS,C GOTO TRAIT59510 BSF VAR595,7 TRAIT59510 BTFSC FLAG,5 GOTO TRAIT59512 BSF FLAG,5 RETURN TRAIT59512 BTFSC FLAG,4 ;test si deja TRAITE RETURN ;si oui rien faire BSF FLAG,4 MOVFW VAR595 XORWF FLAG595,W MOVWF VAR595 MOVWF FLAG595 CALL PPLOAD RETURN TRAIT59511 BCF FLAG,4 ;aucun bouton appuillé BCF FLAG,5 RETURN ;********************************************************************* ; routine de envoi au servo * ;********************************************************************* OUTSERV BSF SERVO1 BSF SERVO2 BSF SERVO3 BSF SERVO4 MOVLW 237 ;TEMPO .5ms MOVWF TMR0 BSF FLAG,0 OUTSERV2 CLRWDT BTFSC FLAG,0 GOTO OUTSERV2 CLRF TMR0 MOVLW B'00001111' MOVWF FLAGSERVO OUTSERV7 MOVFW TMR0 SUBWF VALSERVO1OUT,W BTFSC STATUS,C ;TEST SI SUPERIEUR GOTO OUTSERV3 BCF SERVO1 BCF FLAGSERVO,0 OUTSERV3 MOVFW TMR0 SUBWF VALSERVO2OUT,W BTFSC STATUS,C ;TEST SI SUPERIEUR GOTO OUTSERV4 BCF SERVO2 BCF FLAGSERVO,1 OUTSERV4 MOVFW TMR0 SUBWF VALSERVO3OUT,W BTFSC STATUS,C ;TEST SI SUPERIEUR GOTO OUTSERV5 BCF SERVO3 BCF FLAGSERVO,2 OUTSERV5 MOVFW TMR0 SUBWF VALSERVO4OUT,W BTFSC STATUS,C ;TEST SI SUPERIEUR GOTO OUTSERV6 BCF SERVO4 BCF FLAGSERVO,3 OUTSERV6 MOVF FLAGSERVO,W BTFSS STATUS,Z GOTO OUTSERV7 BCF SERVO1 BCF SERVO2 BCF SERVO3 BCF SERVO4 RETURN ;********************************************************************* ; TEST DU NB DE BIT * ;********************************************************************* NBBIT CLRF VAR3 MOVFW VALUART MOVWF VAR2 MOVLW 8 MOVWF VAR1 NBBIT2 RRF VAR2,F BTFSC STATUS,C INCF VAR3,F ;CONTEUR DE BIT DANS VALUART DECFSZ VAR1,F ;TEST SI OCTET COMPLET TESTE GOTO NBBIT2 MOVF VAR3,W ;TEST SI AUCUN BIT VALIDE BTFSC STATUS,Z RETURN ;ALOR OK DECF VAR3,F ;SINON VAR3 -1 RETURN ;********************************************************************* ; TEST PWM * ;********************************************************************* TESTPWM MOVLW 225 MOVWF VALSERVO1 CALL PWMMOTEUR TESTPWM2 CLRWDT BTFSC FLAG,2 GOTO TESTPWM2 RETURN ;********************************************************************* ; routine de PWM MOTEUR * ;********************************************************************* PWMMOTEUR MOVLW B'00001100' MOVWF CCP1CON ;pwm mode MOVFW VALSERVO1 MOVWF VALSERVO1OUT BANK1 MOVLW 100 MOVWF PR2 ;periode du moteur BANK0 MOVLW 65 ;test si superieur MILIEUX +20% SUBWF VALSERVO1OUT,W BTFSS STATUS,C GOTO PWMMOTEUR2 MOVLW 63 ;milieux +15% SUBWF VALSERVO1OUT,W MOVWF VAR1 BCF STATUS,C RLF VAR1,F RLF VAR1,F RLF VAR1,W ADDLW 20 ;pour atindre le maximum il faut rajouter 10 PWMMOTEUR6 MOVWF CCPR1L BSF MOTORF ;mise en marche du moteur recule BCF MOTORR BSF FLAG,2 BSF FLAG,3 ;MOTEUR MARCHE GOTO PWMMOTEUR4 PWMMOTEUR2 MOVLW 56 ;test si inferieur 127 -20% SUBWF VALSERVO1OUT,W BTFSC STATUS,C GOTO PWMMOTEUR3 MOVFW VALSERVO1OUT SUBLW 58 MOVWF VAR1 BCF STATUS,C RLF VAR1,F RLF VAR1,F RLF VAR1,W ; MOVLW 120 ; SUBWF VAR1,W PWMMOTEUR7 MOVWF CCPR1L BCF MOTORF BSF MOTORR ;mise en marche du moteur avence BSF FLAG,2 BSF FLAG,3 ;MOTEUR EN MARCHE GOTO PWMMOTEUR4 PWMMOTEUR3 ; BCF MOTORF ;stoper les machines ; BCF MOTORR CLRF CCPR1L ; BCF FLAG,2 BCF FLAG,3 ;MOTEUR STOP PWMMOTEUR4 RETURN ;********************************************************************* ; SOUS PROGRAMME 595 * ;********************************************************************* STOPPWM BTFSS FLAG,2 CLRF CCP1CON RETURN ;********************************************************************* ; SOUS PROGRAMME 595 * ;********************************************************************* PPLOAD MOVFW VAR595 MOVWF VAR2 MOVLW 8 MOVWF VAR1 PPLOAD1 BTFSS VAR2,0 GOTO PPLOAD2 BSF DATA GOTO PPLOAD3 PPLOAD2 BCF DATA PPLOAD3 BSF CLOCK BCF CLOCK RRF VAR2,F DECFSZ VAR1,F GOTO PPLOAD1 BSF PLOAD BCF PLOAD BCF DATA RETURN ;********************************************************************* ; routine tempo * ;********************************************************************* TEMPO MOVLW 2 MOVWF VTIME TEMPO2 CLRWDT MOVFW VTIME BTFSS STATUS,Z GOTO TEMPO2 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