;********************************************* ;** TELECOM BATEAU RX.asm ** ;** 16F876A à 20MHz ** ;********************************************* CBLOCK h'20' SAUVE FLAG SENS PWM1 DUREPWM1 PWM2 DUREPWM2 SERVO DURESERV CPTDURE CPTPER COMMANDE CONST VBATT TMOT1 TMOT2 CPTIT1 CPTIT2 CPT SAUV RAM1 RAM2 RAM3 MSBT LSBT TEST ENDC ORG h'00' GOTO PROG ORG h'04' GOTO SPIT #DEFINE FLAGSYN0 FLAG,0 #DEFINE FLAGSYN1 FLAG,1 #DEFINE FLAGSYN2 FLAG,2 #DEFINE FLAGSYN3 FLAG,3 #DEFINE FLAGSYN4 FLAG,4 #DEFINE FLAGSYN5 FLAG,5 #DEFINE FLRX FLAG,6 #DEFINE IT2 FLAG,7 #DEFINE SENSMOT1 SENS,0 ; Flag à "1" en AV et à "0" en AR pour MOTEUR 1 #DEFINE SENSMOT2 SENS,1 ; Flag à "1" en AV et à "0" en AR pour MOTEUR 2 #DEFINE DEMCPT1 SENS,2 #DEFINE DEMCPT2 SENS,3 #DEFINE TOP1 SENS,4 ; compte 2 IT de 20 ms du Timer1 pour MOTEUR 1 #DEFINE TOP2 SENS,5 ; compte 2 IT de 20 ms du Timer1 pour MOTEUR 2 #DEFINE OUTSERVO PORTB,5 #DEFINE A1 PORTC,4 #DEFINE B1 PORTC,3 #DEFINE A2 PORTC,0 #DEFINE B2 PORTB,3 #DEFINE PHARE PORTB,2 #DEFINE KLAXON PORTC,5 #DEFINE SENS1W1 PORTB,1 #DEFINE BUS1W1 PORTB,1 #DEFINE SENS1W2 PORTB,0 #DEFINE BUS1W2 PORTB,0 #include "REG877HS.inc" PROG PAGE1 MOVLW h'00' ; Port A en I/O analogique MOVWF ADCON1 ; et résultat justifié à gauche MOVLW B'11000011' ; Port B2 à B5 en sortie MOVWF TRISB ; B0 et B1 en entrée CLRF TRISC ; Port C en sortie MOVLW h'08' ; init Timer 0:pas de prédiv et clk à 200 ns MOVWF OPTIONS ; IT Timer 0 toutes les 200ns x 255 = 51 us MOVLW d'129' ; vitesse: 129=9600 bauds MOVWF SPBRG ; 64=19200 bauds 31=38400 bauds BCF SYNC ; mode assynchrone BSF BRGH ; vitesse haute BSF TXEN ; autorise émission BSF TMR1IE ; autorise IT du Timer 1 BSF RCIE ; autorise IT de l'USART en réception PAGE0 BSF T0IE ; autorise IT du Timer 0 MOVLW h'00' MOVWF SERVO ; init durée servo MOVLW h'00' MOVWF PWM1 MOVWF PWM2 ; init PWM1 et PWM2 MOVLW h'03' MOVWF COMMANDE ; Phare et Klaxon OFF BCF PHARE BCF KLAXON MOVLW h'31' MOVWF T1CON ; Timer 1 prédiv par 8 compte 1,6us MOVLW h'CF' MOVWF TMR1H MOVLW h'2B' MOVWF TMR1L ; init Timer 1 à h'CF2B' soit 53035: IT toutes les 20ms MOVLW h'81' ; Tad=Tclk x 32 = 1,6 us MOVWF ADCON0 ; canal 0 en service et CAN = ON BSF SPEN ; UART en service sur PC6 et PC7 BSF CREN ; réception autorisée BSF PEIE ; autorise IT des périph PAGE1 MOVLW d'60' ; PR2=60 donc T=60x16x0,2us=192us soit 5,2KHz MOVWF PR2 ; PR2=120 donc T=120x16x0,2us=384us soit 2,6KHz BCF TRISC,1 ; PR2=255 donc T=255x16x0,2us=816us soit 1,2 KHz BCF TRISC,2 BSF TRISC,7 ; Port C7 en entrée pour Rx RS232 PAGE0 CALL STOP1 ; Arret moteur 1 et moteur 2 CALL STOP2 MOVFW PWM1 MOVWF CCPR1L ; init durée sortie PWM 1 à 0 MOVFW PWM2 MOVWF CCPR2L ; init durée sortie PWM 2 à 0 MOVLW h'07' MOVWF T2CON ; Timer 2: ON et prédiv par 16 donc compte 3,2us MOVLW h'0F' MOVWF CCP1CON ; mode PWM pour module CCP 1 MOVWF CCP2CON ; mode PWM pour module CCP 2 BCF OUTSERVO ; sortie SERVO à "0" CLRF FLAG ; RAZ de tous les flags CLRF SENS MOVLW d'5' ; init comptage IT de 20 ms à 5 pour avoir 100ms MOVWF CPTIT1 ; entre passage marche AV et marche AR sur les 2 moteurs MOVWF CPTIT2 BSF GIE ; autorise IT CALL INIT1W1 ; init des 2 liaisons 1 wire CALL INIT1W2 ;************************************************** ;** PROG PRINCIPAL ** ;************************************************** ;************************************************** ;** Envoi par XBee des télémesures ** ;** Temp MOTEUR 1 Temp MOTEUR 2 et VBATT ** ;************************************************** ENVTS MOVLW d'255' CALL DELAI CALL LECT1W2 ; lecture température 2 sur bus 1 wire n°2 CALL CAN ; mesure tension batterie CALL LECT1W1 ; lecture température 1 sur bus 1 wire n°1 MOVLW "$" ; emission trame: CALL EMISS ; $TS octet Vbatt,octet Temp 1, octet Temp 2 MOVLW "T" CALL EMISS MOVLW "S" CALL EMISS MOVFW VBATT CALL EMISS MOVFW TMOT1 CALL EMISS MOVFW TMOT2 CALL EMISS ;************************************************* ;** TRAITEMENT des COMMANDES ** ;** Phares et Klaxon ** ;************************************************* TESTKL BCF GIE BTFSS COMMANDE,0 ; bit b0 = 0 ? GOTO KLAX ; oui donc KLAXON marche BCF KLAXON ; non donc stop Klaxon TESTKL1 BTFSS COMMANDE,1 ; bit b1 = 0 ? GOTO PHAR ; oui donc PHARE marche BCF PHARE ; non donc stop PHARE BSF GIE GOTO ENVTS ; terminé on boucle KLAX BSF KLAXON ; KLAXON marche GOTO TESTKL1 PHAR BSF PHARE ; PHARE marche BSF GIE GOTO ENVTS ; boucle principale du programme ;********************************************************** ;** ZONE des Sous Programmes ** ;********************************************************** ;************************************************** ;** SP MOTEURS ** ;************************************************** ;** STOP1 ** ;** Stoppe MOTEUR 1 en faisant A1 et B1 = 0 ** ;************************************************** STOP1 MOVLW h'00' MOVWF CCP1CON ; stoppe PWM 1 BCF A1 BCF B1 RETURN ;************************************************** ;** STOP2 ** ;** Stoppe MOTEUR 2 en faisant A2 et B2 = 0 ** ;************************************************** STOP2 MOVLW h'00' MOVWF CCP2CON ; stoppe PWM 2 BCF A2 BCF B2 RETURN ;************************************************** ;** AV1 ** ;** MOTEUR 1 en marche avant: A1=1 et B1=0 ** ;************************************************** AV1 BTFSC SENSMOT1 GOTO OKAV1 BTFSS TOP1 GOTO FINAV1 BCF TOP1 BSF SENSMOT1 OKAV1 BCF B1 MOVLW h'0F' MOVWF CCP1CON ; PWM1 marche BSF A1 RETURN FINAV1 BSF DEMCPT1 CALL STOP1 RETURN ;************************************************** ;** AV2 ** ;** MOTEUR 2 en marche avant: A2=1 et B2=0 ** ;************************************************** AV2 BTFSC SENSMOT2 GOTO OKAV2 BTFSS TOP2 GOTO FINAV2 BCF TOP2 BSF SENSMOT2 OKAV2 BCF B2 MOVLW h'0F' MOVWF CCP2CON ; PWM2 marche BSF A2 RETURN FINAV2 BSF DEMCPT2 CALL STOP2 RETURN ;************************************************** ;** AR1 ** ;** MOTEUR 1 en marche arriere: A1=0 et B1=1 ** ;************************************************** AR1 BTFSS SENSMOT1 ; AV ou AR ? GOTO OKAR1 ; AR BTFSS TOP1 ; Top de 40 ms arrivé GOTO FINAR1 ; non BCF TOP1 ; oui BCF SENSMOT1 ; Flag marche AR OKAR1 BCF A1 ; mise en marche AR MOVLW h'0F' MOVWF CCP1CON ; PWM1 marche BSF B1 RETURN FINAR1 BSF DEMCPT1 CALL STOP1 RETURN ;************************************************** ;** AR2 ** ;** MOTEUR 2 en marche arriere: A2=0 et B2=1 ** ;************************************************** AR2 BTFSS SENSMOT2 ; AV ou AR ? GOTO OKAR2 ; AR BTFSS TOP2 ; Top de 40 ms arrivé GOTO FINAR2 ; non BCF TOP2 ; oui BCF SENSMOT2 ; Flag marche AR OKAR2 BCF A2 ; mise en marche AR MOVLW h'0F' MOVWF CCP2CON ; PWM2 marche BSF B2 RETURN FINAR2 BSF DEMCPT2 CALL STOP2 RETURN ;************************************************** ;** SP CAN ** ;** Lance la conversion analog/digital ** ;** résultat dans W sur 7 bits ** ;** et dans VBATT ** ;************************************************** CAN MOVLW d'1' CALL DELAI ; attente 1 ms que condo soit chargé BSF GO ; lance la conversion CONV BTFSC GO ; conversion terminée ? GOTO CONV ; non MOVFW ADRESH ; oui, lecture résultat MOVWF VBATT RRF VBATT,w ; 1 décalage à droite pour ne garder que 7 bits ANDLW h'7F' ; masque le bit MSB MOVWF VBATT RETURN ;************************************************** ;** EMISS ** ;** SP Emission USART ** ;** L'octet dans W est émis par l'USART ** ;************************************************** EMISS BTFSS TXIF ; teste TXIF: registre emission vide ? GOTO EMISS ; TXIF = 0 donc Registre plein MOVWF TXREG ; octet à emettre mis dans USART RETURN ;******************************************** ;** SP DELAI de 1 ms ** ;** utilise 2 cases RAM en h'7B' et h'7C' ** ;******************************************** DEL MOVLW d'10' MOVWF h'7B' DECFSZ h'7B' GOTO $ + 2 GOTO $ + 6 MOVLW d'182' MOVWF h'7C' DECFSZ h'7C' GOTO $ - 1 GOTO $ - 7 RETURN ;******************************************** ;** SP DELAI de W fois 1 ms ** ;** utilise 1 case RAM en h'7D' ** ;******************************************** DELAI MOVWF h'7D' INCF h'7D' DECFSZ h'7D' GOTO $ + 2 GOTO $ + 3 CALL DEL GOTO $ - 4 RETURN ;************************************************** ;** SP 1 WIRE ** ;************************************************** ;** SP RESET et détect Esclave BUS 1 et 2 ** ;************************************************** DETECT1 PAGE1 BCF SENS1W1 ; Port en sortie PAGE0 BCF BUS1W1 ; Bus à "0" CALL DEL480 ; attente 480 us PAGE1 BSF SENS1W1 ; Port en entrée PAGE0 CALL DEL60 ; attente 60 us MOVLW d'01' ; b0 de W à "1" BTFSC BUS1W1 ; teste si Bus est à "0" MOVLW d'00' ; non donc b0 de W à "0" MOVWF SAUV ; sauve valeur CALL DEL60 ; attente 60 us MOVFW SAUV ; restitue valeur de W RETURN DETECT2 PAGE1 BCF SENS1W2 ; Port en sortie PAGE0 BCF BUS1W2 ; Bus à "0" CALL DEL480 ; attente 480 us PAGE1 BSF SENS1W2 ; Port en entrée PAGE0 CALL DEL60 ; attente 60 us MOVLW d'01' ; b0 de W à "1" BTFSC BUS1W2 ; teste si Bus est à "0" MOVLW d'00' ; non donc b0 de W à "0" MOVWF SAUV ; sauve valeur CALL DEL60 ; attente 60 us MOVFW SAUV ; restitue valeur de W RETURN ;******************************************** ;** SP EMISSION 1 bit BUS 1 et 2 ** ;******************************************** ENVBIT1 PAGE1 BCF SENS1W1 ; Port en sortie PAGE0 BCF BUS1W1 ; Bus à "0" CALL DEL1US ; attente 1 us MOVWF SAUV BTFSC SAUV,0 ; teste si bit 0 de W est à "0" BSF BUS1W1 ; non donc BUS à "1" tout de suite CALL DEL60 ; attente 60 us BSF BUS1W1 ; oui donc Bus à "1" aprés 60 us CALL DEL60 ; attente 60 us MOVFW SAUV PAGE1 BSF SENS1W1 ; Port en entrée PAGE0 ; donc tiré à "1" RETURN ; émission a duré 120 us ENVBIT2 PAGE1 BCF SENS1W2 ; Port en sortie PAGE0 BCF BUS1W2 ; Bus à "0" CALL DEL1US ; attente 1 us MOVWF SAUV BTFSC SAUV,0 ; teste si bit 0 de W est à "0" BSF BUS1W2 ; non donc BUS à "1" tout de suite CALL DEL60 ; attente 60 us BSF BUS1W2 ; oui donc Bus à "1" aprés 60 us CALL DEL60 ; attente 60 us MOVFW SAUV PAGE1 BSF SENS1W2 ; Port en entrée PAGE0 ; donc tiré à "1" RETURN ; émission a duré 120 us ;******************************************** ;** SP EMISSION 1 OCTET BUS 1 et 2 ** ;******************************************** ENVBYT1 MOVWF SAUV MOVLW d'08' MOVWF CPT ; CPT=8 MOVFW SAUV ENV1 CALL ENVBIT1 ; envoi le bit en b0 de W MOVWF SAUV RRF SAUV MOVFW SAUV ANDLW h'7F' BTFSC C ADDLW h'80' DECFSZ CPT GOTO ENV1 RETURN ENVBYT2 MOVWF SAUV MOVLW d'08' MOVWF CPT ; CPT=8 MOVFW SAUV ENV2 CALL ENVBIT2 ; envoi le bit en b0 de W MOVWF SAUV RRF SAUV MOVFW SAUV ANDLW h'7F' BTFSC C ADDLW h'80' DECFSZ CPT GOTO ENV2 RETURN ;******************************************** ;** SP réception d'un bit BUS 1 ** ;** Le bit lu est mis en bo de W ** ;******************************************** RECBIT1 PAGE1 BCF SENS1W1 ; Port en sortie PAGE0 BCF BUS1W1 ; Bus à "0" CALL DEL1US ; attente 1 us PAGE1 BSF SENS1W1 ; Port en entrée PAGE0 ANDLW h'FE' ; b0 à "0" les autres bits inchangés ADDLW h'01' ; bo de W mis à "1" BTFSS BUS1W1 ; teste si Bus est à "1" ANDLW h'FE' ; non donc b0 de W mis à "0" MOVWF SAUV ; sauve valeur de W CALL DEL60 CALL DEL60 ; attend 120 us MOVFW SAUV ; restitue valeur de W RETURN ; la reception a duré 120 us ;******************************************** ;** SP réception d'un bit BUS 2 ** ;** Le bit lu est mis en bo de W ** ;******************************************** RECBIT2 PAGE1 BCF SENS1W2 ; Port en sortie PAGE0 BCF BUS1W2 ; Bus à "0" CALL DEL1US ; attente 1 us PAGE1 BSF SENS1W2 ; Port en entrée PAGE0 ANDLW h'FE' ; b0 à "0" les autres bits inchangés ADDLW h'01' ; bo de W mis à "1" BTFSS BUS1W2 ; teste si Bus est à "1" ANDLW h'FE' ; non donc b0 de W mis à "0" MOVWF SAUV ; sauve valeur de W CALL DEL60 CALL DEL60 ; attend 120 us MOVFW SAUV ; restitue valeur de W RETURN ; la reception a duré 120 us ;******************************************** ;** SP Réception d'un octet BUS 1 ** ;** Octet reçu mis dans W ** ;******************************************** RECBYT1 MOVWF SAUV MOVLW d'08' MOVWF CPT ; CPT=8 MOVFW SAUV REC1 CALL RECBIT1 MOVWF SAUV RRF SAUV MOVFW SAUV ANDLW h'7F' BTFSC C ADDLW h'80' DECFSZ CPT GOTO REC1 RETURN ;******************************************** ;** SP Réception d'un octet BUS 2 ** ;** Octet reçu mis dans W ** ;******************************************** RECBYT2 MOVWF SAUV MOVLW d'08' MOVWF CPT ; CPT=8 MOVFW SAUV REC2 CALL RECBIT2 MOVWF SAUV RRF SAUV MOVFW SAUV ANDLW h'7F' BTFSC C ADDLW h'80' DECFSZ CPT GOTO REC2 RETURN ;******************************************** ;** SP attente 1 us ** ;******************************************** DEL1US NOP NOP NOP NOP NOP RETURN ;******************************************** ;** SP attente 15 us ** ;******************************************** DEL15 MOVLW d'25' MOVWF RAM1 DEC1 DECFSZ RAM1 GOTO DEC1 RETURN ;******************************************** ;** SP attente 60 us ** ;******************************************** DEL60 MOVLW d'100' MOVWF RAM2 DEC2 DECFSZ RAM2 GOTO DEC2 RETURN ;******************************************** ;** SP attente 480 us ** ;******************************************** DEL480 MOVLW d'09' MOVWF RAM3 DEC3 DECFSZ RAM3 GOTO SUIT RETURN SUIT CALL DEL60 GOTO DEC3 ;******************************************** ;** SP INIT BUS 1 Wire 1 et 2 ** ;******************************************** INIT1W1 CALL DETECT1 ; reset sur bus 1 wire n°1 MOVLW h'CC' CALL ENVBYT1 ; envoi commande "appel général" MOVLW h'4E' CALL ENVBYT1 ; envoi commande "écriture" MOVLW h'00' CALL ENVBYT1 ; Seuil alarme Haut MOVLW h'00' CALL ENVBYT1 ; Seuil alarme Bas MOVLW h'00' CALL ENVBYT1 ; config: résolution sur 9 bits CALL DETECT1 RETURN INIT1W2 CALL DETECT2 ; reset sur bus 1 wire n°2 MOVLW h'CC' CALL ENVBYT2 ; envoi commande "appel général" MOVLW h'4E' CALL ENVBYT2 ; envoi commande "écriture" MOVLW h'00' CALL ENVBYT2 ; Seuil alarme Haut MOVLW h'00' CALL ENVBYT2 ; Seuil alarme Bas MOVLW h'00' CALL ENVBYT2 ; config: résolution sur 9 bits CALL DETECT2 RETURN ;*********************************************** ;** SP LECTURE T° Bus 1 Wire 1 et 2 ** ;** résultat dans TMOT1 et TMOT2 ** ;*********************************************** LECT1W1 CALL DETECT1 ; reset sur bus 1 wire n°1 MOVLW h'CC' CALL ENVBYT1 ; envoi commande "appel général" MOVLW h'44' CALL ENVBYT1 ; envoi commande "Début conversion" MOVLW d'100' CALL DELAI ; attente 100 ms fin de conversion CALL DETECT1 ; oui conversion terminée, reset bus 1 wire MOVLW h'CC' CALL ENVBYT1 ; envoi commande "appel général" MOVLW h'BE' CALL ENVBYT1 ; envoi commande "lecture" CALL RECBYT1 ; réception octet LSB température 1 MOVWF LSBT ; sauve LSB en RAM CALL RECBYT1 ; réception octet MSB température 1 MOVWF MSBT ; sauve MSB en RAM CALL DETECT1 ; reset bus 1 wire CALL CONVTEMP ; conversion temp dans LSBT et MSBT en 1 octet dans W MOVWF TMOT1 ; sauve octet température dans TEMP1 RETURN LECT1W2 CALL DETECT2 ; reset sur bus 1 wire n°2 MOVLW h'CC' CALL ENVBYT2 ; envoi commande "appel général" MOVLW h'44' CALL ENVBYT2 ; envoi commande "Début conversion" MOVLW d'100' CALL DELAI ; attente 100 ms fin de conversion CALL DETECT2 ; oui conversion terminée, reset bus 1 wire MOVLW h'CC' CALL ENVBYT2 ; envoi commande "appel général" MOVLW h'BE' CALL ENVBYT2 ; envoi commande "lecture" CALL RECBYT2 ; réception octet LSB température 2 MOVWF LSBT ; sauve LSB en RAM CALL RECBYT2 ; réception octet MSB température 2 MOVWF MSBT ; sauve MSB en RAM CALL DETECT2 ; reset bus 1 wire CALL CONVTEMP ; conversion temp dans LSBT et MSBT en 1 octet dans W MOVWF TMOT2 ; sauve octet température dans TEMP2 RETURN ;*************************************************************** ;** SP CONVTEMP ** ;** Température dans MSBT et LSBT rendue sur 1 octet dans W ** ;*************************************************************** CONVTEMP BCF C RRF LSBT RRF LSBT RRF LSBT RRF LSBT MOVLW h'0F' ANDWF LSBT,F BCF C RLF MSBT RLF MSBT RLF MSBT RLF MSBT MOVLW h'F0' ANDWF MSBT,F MOVFW LSBT XORWF MSBT,W RETURN ;************************************************** ;** SP IT ** ;** IT RS232 si caractére reçu ** ;** ou IT TIMER0 toutes les 51 us ** ;** ou IT TIMER1 toutes les 20 ms ** ;************************************************** SPIT PUSH PAGE0 BTFSC TMR1IF ; IT du TIMER 0 ou TIMER 1 GOTO ITTMR1 ; c'est une IT du Timer 1 car TMRIF = 1 BTFSC T0IF ; IT du Timer 0 ? GOTO ITTMR0 ; c'est une IT du Timer 0 car T0IF = 1 BTFSC RCIF ; IT RX 232 ? GOTO ITRX ; oui c'est un caractère reçu par USART GOTO RETOUR ; pas IT ni du Timer 0 ni du Timer 1 ni de l'USART ;************************************ ;** IT du TIMER 1 ** ;** toutes les 20 ms ** ;************************************ ITTMR1 MOVLW h'CF' ; IT du Timer 1 MOVWF TMR1H ; Rechargement Timer 1 à h'CF2B' soit 53035: IT toutes les 20ms MOVLW h'2B' MOVWF TMR1L BCF TMR1IF ; RAZ des flags Timer 0 et 1 ;******************************************************** ;** Comptage de 5 IT de 20ms soit 100 ms ** ;** demandé par prog principal pour Moteur 2 ** ;** Timing pour passer de AV en AR ou de AR en AV ** ;** obligatoire pour éviter un C/C dans le pont en H ** ;******************************************************** BTFSS DEMCPT2 ; demande de comptage du nbre d'IT de 20 ms ? MOTEUR 2 GOTO TESTCPT1 ; non DECFSZ CPTIT2 ; oui, cela fait il 5 IT ? soit 100 ms GOTO CPT2NN ; non BSF TOP2 ; oui donc on le signale en montant le flag TOP2 MOVLW d'5' MOVWF CPTIT2 ; on recharge le compteur d'IT à 5 BCF DEMCPT2 ; on RAZ la demande de comptage GOTO TESTCPT1 ; on continu en séquence CPT2NN BCF TOP2 ; flag TOP2 maintenu à "0" ;****************************************************** ;** Comptage de 5 IT de 20ms soit 100 ms ** ;** demandé par prog principal pour Moteur 1 ** ;** Timing pour passer de AV en AR ou de AR en AV ** ;** obligatoire pour éviter un C/C dans le pont en H ** ;****************************************************** TESTCPT1 BTFSS DEMCPT1 ; idem demande de comptage MOTEUR 1 GOTO RETOUR DECFSZ CPTIT1 GOTO CPT1NN BSF TOP1 MOVLW d'5' MOVWF CPTIT1 BCF DEMCPT1 GOTO RETOUR CPT1NN BCF TOP1 GOTO RETOUR ;************************************ ;** IT du TIMER 0 ** ;** toutes les 51 us (PWM servo) ** ;************************************ ITTMR0 DECF CPTDURE BTFSC Z BCF OUTSERVO DECFSZ CPTPER GOTO FINIT0 BSF OUTSERVO MOVLW d'255' MOVWF CPTPER MOVFW DURESERV MOVWF CPTDURE FINIT0 BCF T0IF ; RAZ du flag IT de TMR0 GOTO RETOUR ;************************************* ;** IT de l'USART ** ;** Caractére reçu par RS232 ** ;************************************* ITRX MOVFW RCREG ; lecture caractère MOVWF SAUVE ; sauve en RAM BTFSC FLAGSYN0 ; FLAGSYN0 = 1 ? GOTO TESTFL1 ; oui MOVLW "$" ; non SUBWF SAUVE,w BTFSS Z ; caract reçu = "$" ? GOTO RETOUR ; non c'est pas le début de trame BSF FLAGSYN0 ; oui donc on monte FLAGSYN0 GOTO RETOUR TESTFL1 BTFSC FLAGSYN1 ; FLAGSYN1 = 1 ? GOTO TESTFL2 ; oui MOVLW "T" ; non SUBWF SAUVE,w BTFSS Z ; caract reçu = "T" ? GOTO RETOUR1 ; non c'est pas le caratére "T" aprés un "$" BSF FLAGSYN1 ; oui donc on monte FLAGSYN1 GOTO RETOUR TESTFL2 BTFSC FLAGSYN2 ; FLAGSYN2 = 1 ? GOTO TESTFL3 ; oui MOVLW "C" ; non SUBWF SAUVE,w BTFSS Z ; caract reçu = "C" ? GOTO RETOUR2 ; non c'est pas le caratére "C" aprés un "T" BSF FLAGSYN2 ; oui donc on monte FLAGSYN2 GOTO RETOUR TESTFL3 BTFSC FLAGSYN3 ; FLAGSYN3 = 1 ? GOTO TESTFL4 ; oui MOVFW SAUVE ; non MOVWF PWM1 ; sauve octet reçu : le 1er de la trame en PWM1 BSF FLAGSYN3 ; monte FLAGSYN3 GOTO RETOUR TESTFL4 BTFSC FLAGSYN4 ; FLAGSYN4 = 1 ? GOTO TESTFL5 ; oui MOVFW SAUVE ; non MOVWF PWM2 ; sauve octet reçu : le 2eme de la trame en PWM2 BSF FLAGSYN4 ; monte FLAGSYN4 GOTO RETOUR TESTFL5 BTFSC FLAGSYN5 ; FLAGSYN5 = 1 ? GOTO DERNIER ; oui MOVFW SAUVE ; non MOVWF SERVO ; sauve octet reçu : le 3eme de la trame en SERVO BSF FLAGSYN5 ; monte FLAGSYN5 GOTO RETOUR DERNIER MOVFW SAUVE MOVWF COMMANDE ; sauve octet reçu : le 4eme de la trame en COMMANDE ;************************************* ;** Traitement valeur SERVO ** ;************************************* TRSERVO MOVLW d'00' SUBWF SERVO,w BTFSC Z GOTO SERNUL ; SERVO = 0 BTFSS SERVO,7 GOTO SERSUP ; SERVO > 0 MOVFW SERVO ; SERVO < 0 MOVWF DURESERV COMF DURESERV MOVFW DURESERV ; complémente à "2" ADDLW d'01' ; nbre négatif devient positif MOVWF DURESERV ; DURESERV contient valeur absolue de SERVO BCF C RRF DURESERV ; division par 2 MOVFW DURESERV ADDLW d'30' ; on ajoute d'30' MOVWF DURESERV GOTO SUITE1 SERNUL MOVLW d'30' MOVWF DURESERV GOTO SUITE1 ; DUREE SERVO = 30 soit 1,5 ms = repos SERSUP MOVFW SERVO MOVWF DURESERV BCF C RRF DURESERV ; div par 2 MOVLW d'30' MOVWF CONST MOVFW DURESERV SUBWF CONST,W ; F-W donc RAM-DURESERV donc 30-SERVO SUITE1 MOVWF DURESERV ;*********************************************** ;** Traitement des valeurs de PWM1 et PWM2 ** ;*********************************************** MOVLW d'00' SUBWF PWM1,w BTFSC Z GOTO PWM1NUL ; PWM1 est nul BTFSS PWM1,7 ; teste b7 donc si nbre négatif GOTO PWM1SUP ; PWM1 > 0 MOVFW PWM1 ; PWM1 < 0 MOVWF DUREPWM1 COMF DUREPWM1 MOVFW DUREPWM1 ADDLW d'01' ; complément à "2" MOVWF DUREPWM1 BCF C RLF DUREPWM1 ; mult par 2 RLF DUREPWM1 ; mult par 4 ;RLF DUREPWM1 ; mult par 8 MOVFW DUREPWM1 MOVWF CCPR1L ; init durée PWM 1 CALL AR1 ; moteur 1 en marche arriere GOTO TESTPWM2 PWM1NUL CLRF CCPR1L ; durée PWM 1 à "0" CALL STOP1 ; stoppe moteur 1 GOTO TESTPWM2 PWM1SUP MOVFW PWM1 MOVWF DUREPWM1 BCF C RLF DUREPWM1 ; mult par 2 RLF DUREPWM1 ; mult par 4 ;RLF DUREPWM1 ; mult par 8 MOVFW DUREPWM1 MOVWF CCPR1L ; init durée PWM1 MOVWF PORTD CALL AV1 ; moteur 1 en marche avant ;************************************************** ;** Traitement durée PWM2 ** ;************************************************** TESTPWM2 MOVLW d'00' SUBWF PWM2,w BTFSC Z GOTO PWM2NUL ; PWM2 est nul BTFSS PWM2,7 ; teste b7 donc si nbre négatif GOTO PWM2SUP ; PWM2 > 0 MOVFW PWM2 ; PWM2 < 0 MOVWF DUREPWM2 COMF DUREPWM2 MOVFW DUREPWM2 ADDLW d'01' MOVWF DUREPWM2 BCF C RLF DUREPWM2 ; mult par 2 RLF DUREPWM2 ; mult par 4 ;RLF DUREPWM2 ; mult par 8 MOVFW DUREPWM2 MOVWF CCPR2L ; durée PWM 2 CALL AR2 ; moteur 2 en marche arriere GOTO FINTRAIT PWM2NUL CLRF CCPR2L ; durée PWM 2 à "0" CALL STOP2 ; stoppe moteur 2 GOTO FINTRAIT PWM2SUP MOVFW PWM2 MOVWF DUREPWM2 BCF C RLF DUREPWM2 ; mult par 2 RLF DUREPWM2 ; mult par 4 ;RLF DUREPWM2 ; mult par 8 MOVFW DUREPWM2 MOVWF CCPR2L ; init durée PWM2 CALL AV2 ; moteur 2 en marche avant FINTRAIT BCF FLAGSYN5 ; RAZ du Flag FLAGSYN5 BCF FLAGSYN4 ; RAZ du Flag FLAGSYN4 BCF FLAGSYN3 ; RAZ du Flag FLAGSYN3 BCF FLAGSYN2 ; RAZ du Flag FLAGSYN2 RETOUR2 BCF FLAGSYN1 ; RAZ du flag FLAGSYN1 RETOUR1 BCF FLAGSYN0 ; RAZ du flag FLAGSYN0 RETOUR POP RETFIE END