;********************************************* ;** TELECOM BATEAU TX.asm ** ;** 16F876A à 20MHz ** ;********************************************* CBLOCK h'20' RAM LCD1 LCD2 PTR CAR PWM1 PWM2 SERVO KLAXON NEUTRE0 NEUTRE1 NEUTRE2 SAUVE FLAG FLAG2 VBATT TMOT1 TMOT2 DIZT1 UNIT1 DIZT2 UNIT2 UNIV DIXV HSD MSD LSD CPTRX ENDC #DEFINE E PORTC,1 #DEFINE RS PORTC,0 #DEFINE RW PORTC,2 #DEFINE FLAGSYN0 FLAG,0 #DEFINE FLAGSYN1 FLAG,1 #DEFINE FLAGSYN2 FLAG,2 #DEFINE FLAGSYN3 FLAG,3 #DEFINE FLAGSYN4 FLAG,4 #DEFINE FLRX FLAG2,0 #DEFINE FLAFF FLAG2,1 ORG h'00' GOTO PROG ORG h'04' GOTO SPIT #include "REG877HS.inc" ;************************************************* ;** ** ;** ZONE des tables ASCII ** ;** de h'1800' à h'1FFF' ** ;** en Page memoire 3 ** ;************************************************* ;************************************************* ;** SP AFTAB1 ** ;** Pour afficher CHAINE1 à CHAINE20 ** ;** qui sont dans TABLE1 ** ;** Affiche une chaine de caractères ASCII ** ;** dont l'offset par rapport au début ** ;** de la table est dans W. ** ;** La fin de la table est signalée par h'FF' ** ;************************************************* AFTAB1 MOVWF PTR AFTAB11 MOVFW PTR CALL TABLE1 MOVWF CAR MOVLW h'FF' SUBWF CAR,w BTFSS Z GOTO AFTAB12 RETURN AFTAB12 MOVFW CAR CALL ECRCAR INCF PTR GOTO AFTAB11 ;********************************************** ;** 1ere TABLE des caractéres ** ;********************************************** TABLE1 MOVWF RAM MOVLW d'10' SUBWF RAM MOVLW HIGH CHAINE1 MOVWF PCLATH MOVFW RAM ADDLW LOW CHAINE1 BTFSC C INCF PCLATH MOVWF PCL CHAINE1 DT "Patientez ",0FF CHAINE2 DT "ETALONNAGE MANCHES",0FF CHAINE3 DT "EMD 2008 ",0FF CHAINE4 DT "Temp MOTEUR 1:",0FF CHAINE5 DT "Temp MOTEUR 2:",0FF CHAINE6 DT "Tension accu:",0FF ;************************************************************** ;** ZONE PROGRAMME ** ;************************************************************** PROG PAGE1 MOVLW h'00' ; Port A en I/O analogique MOVWF ADCON1 ; et résultat justifié à gauche BCF E ; init en sortie Port C BCF RS ; pour commande LCD BCF RW ; RS, E, RW en sortie BCF TRISB,0 ; Port B0 en sortie pour D4 BCF TRISB,1 ; Port B1 en sortie pour D5 BCF TRISB,2 ; Port B2 en sortie pour D6 BCF TRISB,3 ; Port B3 en sortie pour D7 BSF TRISB,4 ; BP Phare et Klaxon en entrée BSF TRISB,5 BCF RBPU ; tirage des entrées 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 RCIE ; autorise IT de l'USART en réception BSF TMR1IE ; autorise IT du Timer 1 PAGE0 MOVLW h'31' MOVWF T1CON ; Timer 1 prédiv par 8 compte 1,6us MOVLW h'81' ; Tad=Tclk x 32 = 1,6 us MOVWF ADCON0 ; canal 0 en service et CAN = ON MOVLW d'250' ; début Init LCD en 4 bits CALL DELAI MOVLW d'250' CALL DELAI ; attente 500 ms BCF E ; E=0 BCF RS ; RS = 0 : sélecte registre instruction BCF RW ; RW=0 BCF PORTB,0 BCF PORTB,1 BCF PORTB,2 BCF PORTB,3 ; clear Data : les 4 bits du LSB PORTB BSF PORTB,0 BSF PORTB,1 ; DATA LCD = 3 : donc passage en 8 bits CALL ENAB ; fait: E=1 attente E=0 MOVLW d'15' ; envoi h'3' une 2eme fois CALL DELAI ; attente 15 ms CALL ENAB ; fait: E=1 attente E=0 MOVLW d'15' ; envoi h'3' une 3eme fois CALL DELAI ; attente 15 ms CALL ENAB ; fait: E=1 attente E=0 MOVLW d'15' CALL DELAI ; attente 15 ms BCF PORTB,0 BSF PORTB,1 ; DATA LCD = 2 : donc passage en 4 bits. CALL ENAB ; fait: E=1 attente E=0 MOVLW h'28' ; init fonction: 2 lignes / 4 bits : fonte 5x7 CALL ECRINS MOVLW h'0C' ; code display : ON/ no cursor / no clignot CALL ECRINS MOVLW h'06' ; init mode display : incrément de G à D et no scrolling. CALL ECRINS CALL CLRLCD ; Clear LCD CLRF FLAG ;RAZ de tous les flags de réception CLRF VBATT CLRF TMOT1 CLRF TMOT2 MOVLW h'00' MOVWF DIZT1 MOVWF UNIT1 MOVWF DIZT2 MOVWF UNIT2 MOVWF UNIV MOVWF DIXV BSF SPEN ; UART en service sur PC6 et PC7 BSF CREN ; réception autorisée BSF PEIE ; autorise IT des périph BSF GIE ; autorise IT ;************************************************** ;** PROG PRINCIPAL ** ;************************************************** CALL CLRLCD ; efface LCD MOVLW h'86' CALL ECRINS MOVLW CHAINE1-TABLE1 ; affiche "Patientez" CALL AFTAB1 MOVLW h'95' CALL ECRINS MOVLW CHAINE2-TABLE1 ; affiche "étalonnage manches" CALL AFTAB1 ;*********************************** ;**** Etalonnage des neutres **** ;*********************************** BSF CHS0 ; sélectionne canal 3 BSF CHS1 BCF CHS2 CALL CAN MOVWF NEUTRE0 ; position repos du PWM1 BCF CHS0 ; sélectionne canal 2 BSF CHS1 BCF CHS2 CALL CAN MOVWF NEUTRE1 ; Position repos du SERVO direction BSF CHS0 ; sélectionne canal 1 BCF CHS1 BCF CHS2 CALL CAN MOVWF NEUTRE2 ; position repos du PWM2 CALL DEL1S CALL CLRLCD MOVLW h'81' CALL ECRINS MOVLW CHAINE4-TABLE1 ; affiche CALL AFTAB1 MOVLW h'C1' CALL ECRINS MOVLW CHAINE5-TABLE1 ; affiche CALL AFTAB1 MOVLW h'95' CALL ECRINS MOVLW CHAINE6-TABLE1 ; affiche CALL AFTAB1 MOVLW h'E0' CALL ECRINS MOVLW CHAINE3-TABLE1 ; affiche "EMD 2008" CALL AFTAB1 MOVLW d'20' MOVWF CPTRX ;************* Début Conversion des valeurs des manches ******* BOU BSF CHS0 BSF CHS1 BCF CHS2 ; sélectionne canal 3 CALL CAN MOVWF PWM1 MOVFW NEUTRE0 SUBWF PWM1 ; PWM1 - NEUTRE0 ----> PWM1 BCF CHS0 BSF CHS1 BCF CHS2 ; sélectionne canal 2 CALL CAN MOVWF SERVO MOVFW NEUTRE1 SUBWF SERVO ; SERVO - NEUTRE1 ----> SERVO BSF CHS0 BCF CHS1 BCF CHS2 ; sélectionne canal 1 CALL CAN MOVWF PWM2 MOVFW NEUTRE2 SUBWF PWM2 ; PWM2 - NEUTRE2 ----> PWM2 MOVFW PORTB ANDLW h'30' ; ne garde que bits b4 et b5 MOVWF KLAXON BCF C RRF KLAXON RRF KLAXON RRF KLAXON RRF KLAXON ; état des BP Klaxon et Phare en b0 et b1 ;*************** EMISSION TRAME de Télécommande ********** MOVLW "$" CALL EMISS ; début de trame MOVLW "T" CALL EMISS MOVLW "C" CALL EMISS MOVFW PWM1 CALL EMISS MOVFW PWM2 CALL EMISS MOVFW SERVO CALL EMISS MOVFW KLAXON CALL EMISS BTFSS FLAFF ; réception marche toujours ? GOTO NOTRAME ; non CALL CONVT1 ; conversion octet TEMP1 en 2 digits ASCII CALL CONVT2 ; conversion octet TEMP2 en 2 digits ASCII CALL CONVBATT ; conversion octet Vbatt en 2 digits ASCII GOTO AFFLCD NOTRAME MOVLW "0" ; signale plus de réception MOVWF DIZT1 ; en mettant caract ASCII "0" MOVWF UNIT1 ; dans UNIT1 et DIZT1 MOVWF DIZT2 ; dans DIZT2 et UNIT2 MOVWF UNIT2 CLRF VBATT ; et en faisant VBATT=00 AFFLCD CALL AFFTMOT1 ; affichage Temp1 sur le LCD CALL AFFTMOT2 ; affichage Temp2 sur le LCD CALL AFFVBATT ; affichage VBatt sur le LCD GOTO BOU ;************************************************************ ;** ** ;** ZONE des SOUS PROGRAMMES ** ;** ** ;************************************************************ ;***************************** ;** Affiche Temp MOT1 ** ;***************************** AFFTMOT1 MOVFW DIZT1 ; teste si réception marche SUBLW h'30' ; et donc si on doit afficher BTFSS Z ; teste si DIZT1="0" donc si Z=1 GOTO AFF1_OK ; non donc affichage OK MOVFW UNIT1 ; oui, teste si UNIT1="0" donc si Z=1 SUBLW h'30' BTFSS Z GOTO AFF1_OK ; non donc affichage OK MOVLW h'90' ; oui, affichage pas OK CALL ECRINS ; efface affichage de la Temp 1 MOVLW " " ; en envoyant 3 espaces CALL ECRCAR MOVLW " " CALL ECRCAR MOVLW " " CALL ECRCAR RETURN AFF1_OK MOVLW h'90' ; affiche sur LCD Dizaine et unité CALL ECRINS ; de la température du moteur 1 MOVFW DIZT1 CALL ECRCAR MOVFW UNIT1 CALL ECRCAR MOVLW h'DF' ; affiche "°" CALL ECRCAR RETURN ;***************************** ;** Affiche Temp MOT2 ** ;***************************** AFFTMOT2 MOVFW DIZT2 ; teste si réception marche SUBLW h'30' ; et donc si on doit afficher BTFSS Z ; teste si DIZT2="0" donc si Z=1 GOTO AFF2_OK ; non donc affichage OK MOVFW UNIT2 ; oui, teste si UNIT2="0" donc si Z=1 SUBLW h'30' BTFSS Z GOTO AFF2_OK ; non donc affichage OK MOVLW h'D0' ; oui, affichage pas OK CALL ECRINS ; efface affichage de la Temp 1 MOVLW " " ; en envoyant 3 espaces CALL ECRCAR MOVLW " " CALL ECRCAR MOVLW " " CALL ECRCAR RETURN AFF2_OK MOVLW h'D0' ; affiche sur LCD Dizaine et unité CALL ECRINS ; de la température du moteur 2 MOVFW DIZT2 CALL ECRCAR MOVFW UNIT2 CALL ECRCAR MOVLW h'DF' ; affiche "°" CALL ECRCAR RETURN ;***************************** ;** Affiche Tension Batt ** ;***************************** AFFVBATT MOVFW VBATT ; réception marche pour savoir si on affiche? BTFSS Z ; VBATT=0 ? GOTO AFBAT_OK ; non donc aff OK MOVLW h'A3' ; oui, affichage pas OK CALL ECRINS ; efface affichage de VBatt MOVLW " " ; en envoyant 5 espaces CALL ECRCAR MOVLW " " CALL ECRCAR MOVLW " " CALL ECRCAR MOVLW " " CALL ECRCAR MOVLW " " CALL ECRCAR RETURN AFBAT_OK MOVLW "L" SUBWF UNIV,w ; UNIV="L" ? BTFSC Z GOTO AFFB1 ; oui MOVLW "H" ; non SUBWF UNIV,w ; UNIV="H" ? BTFSC Z GOTO AFFB2 ; oui MOVLW h'A3' ; non donc affiche sur LCD unité et dixiéme CALL ECRINS ; de la tension batterie MOVFW UNIV CALL ECRCAR MOVLW "," CALL ECRCAR MOVFW DIXV CALL ECRCAR MOVLW "V" CALL ECRCAR MOVLW " " CALL ECRCAR RETURN AFFB1 MOVLW h'A3' CALL ECRINS MOVLW "B" CALL ECRCAR MOVLW "A" CALL ECRCAR MOVLW "S" CALL ECRCAR MOVLW "S" CALL ECRCAR MOVLW "E" CALL ECRCAR RETURN AFFB2 MOVLW h'A3' CALL ECRINS MOVLW "H" CALL ECRCAR MOVLW "A" CALL ECRCAR MOVLW "U" CALL ECRCAR MOVLW "T" CALL ECRCAR MOVLW "E" CALL ECRCAR RETURN ;******************************************** ;** Conversion TMOT1 en 2 digits ASCII ** ;******************************************** CONVT1 MOVFW TMOT1 ; conversion de l'octet température du moteur 1 CALL BINBCD ; en 2 digits ASCII MOVFW MSD MOVWF DIZT1 MOVFW LSD MOVWF UNIT1 RETURN ;******************************************** ;** Conversion TMOT2 en 2 digits ASCII ** ;******************************************** CONVT2 MOVFW TMOT2 ; conversion de l'octet température du moteur 2 CALL BINBCD ; en 2 digits ASCII MOVFW MSD MOVWF DIZT2 MOVFW LSD MOVWF UNIT2 RETURN ;******************************************** ;** Conversion VBATT en 2 digits ASCII ** ;******************************************** CONVBATT MOVLW d'77' SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6V ? GOTO ALARME_B ; non donc alarme batt basse car < à 6,0V MOVLW d'78' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,1V ? GOTO V60 ; non donc Vbatt = 6,0V MOVLW d'79' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,2V ? GOTO V61 ; non donc Vbatt = 6,1V MOVLW d'81' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,3V ? GOTO V62 ; non donc Vbatt = 6,2V MOVLW d'82' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,4V ? GOTO V63 ; non donc Vbatt = 6,3V MOVLW d'83' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,5V ? GOTO V64 ; non donc Vbatt = 6,4V MOVLW d'84' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,6V ? GOTO V65 ; non donc Vbatt = 6,5V MOVLW d'86' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,7V ? GOTO V66 ; non donc Vbatt = 6,6V MOVLW d'87' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,8V ? GOTO V67 ; non donc Vbatt = 6,7V MOVLW d'88' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 6,9V ? GOTO V68 ; non donc Vbatt = 6,8V MOVLW d'90' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,0V ? GOTO V69 ; non donc Vbatt = 6,9V MOVLW d'91' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,1V ? GOTO V70 ; non donc Vbatt = 7,0V MOVLW d'92' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,2V ? GOTO V71 ; non donc Vbatt = 7,1V MOVLW d'93' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,3V ? GOTO V72 ; non donc Vbatt = 7,2V MOVLW d'95' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,4V ? GOTO V73 ; non donc Vbatt = 7,3V MOVLW d'96' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,5V ? GOTO V74 ; non donc Vbatt = 7,4V MOVLW d'97' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,6V ? GOTO V75 ; non donc Vbatt = 7,5V MOVLW d'99' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,7V ? GOTO V76 ; non donc Vbatt = 7,6V MOVLW d'100' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,8V ? GOTO V77 ; non donc Vbatt = 7,7V MOVLW d'101' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 7,9V ? GOTO V78 ; non donc Vbatt = 7,8V MOVLW d'102' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,0V ? GOTO V79 ; non donc Vbatt = 7,9V MOVLW d'104' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,1V ? GOTO V80 ; non donc Vbatt = 8,0V MOVLW d'105' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,2V ? GOTO V81 ; non donc Vbatt = 8,1V MOVLW d'106' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,3V ? GOTO V82 ; non donc Vbatt = 8,2V MOVLW d'108' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,4V ? GOTO V83 ; non donc Vbatt = 8,3V MOVLW d'109' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,5V ? GOTO V84 ; non donc Vbatt = 8,4V MOVLW d'110' ; oui SUBWF VBATT,w BTFSS C ; Vbatt > ou = à 8,6V ? GOTO V85 ; non donc Vbatt = 8,5V ALARME_H MOVLW "H" ; tension sup à 8,5V donc on écrit "HH" MOVWF UNIV MOVLW "H" MOVWF DIXV GOTO FINCONV ALARME_B MOVLW "L" ; tension inf à 6,0V donc on écrit "LL" MOVWF UNIV MOVLW "L" MOVWF DIXV GOTO FINCONV V60 MOVLW "6" MOVWF UNIV MOVLW "0" MOVWF DIXV GOTO FINCONV V61 MOVLW "6" MOVWF UNIV MOVLW "1" MOVWF DIXV GOTO FINCONV V62 MOVLW "6" MOVWF UNIV MOVLW "2" MOVWF DIXV GOTO FINCONV V63 MOVLW "6" MOVWF UNIV MOVLW "3" MOVWF DIXV GOTO FINCONV V64 MOVLW "6" MOVWF UNIV MOVLW "4" MOVWF DIXV GOTO FINCONV V65 MOVLW "6" MOVWF UNIV MOVLW "5" MOVWF DIXV GOTO FINCONV V66 MOVLW "6" MOVWF UNIV MOVLW "6" MOVWF DIXV GOTO FINCONV V67 MOVLW "6" MOVWF UNIV MOVLW "7" MOVWF DIXV GOTO FINCONV V68 MOVLW "6" MOVWF UNIV MOVLW "8" MOVWF DIXV GOTO FINCONV V69 MOVLW "6" MOVWF UNIV MOVLW "9" MOVWF DIXV GOTO FINCONV V70 MOVLW "7" MOVWF UNIV MOVLW "0" MOVWF DIXV GOTO FINCONV V71 MOVLW "7" MOVWF UNIV MOVLW "1" MOVWF DIXV GOTO FINCONV V72 MOVLW "7" MOVWF UNIV MOVLW "2" MOVWF DIXV GOTO FINCONV V73 MOVLW "7" MOVWF UNIV MOVLW "3" MOVWF DIXV GOTO FINCONV V74 MOVLW "7" MOVWF UNIV MOVLW "4" MOVWF DIXV GOTO FINCONV V75 MOVLW "7" MOVWF UNIV MOVLW "5" MOVWF DIXV GOTO FINCONV V76 MOVLW "7" MOVWF UNIV MOVLW "6" MOVWF DIXV GOTO FINCONV V77 MOVLW "7" MOVWF UNIV MOVLW "7" MOVWF DIXV GOTO FINCONV V78 MOVLW "7" MOVWF UNIV MOVLW "8" MOVWF DIXV GOTO FINCONV V79 MOVLW "7" MOVWF UNIV MOVLW "9" MOVWF DIXV GOTO FINCONV V80 MOVLW "8" MOVWF UNIV MOVLW "0" MOVWF DIXV GOTO FINCONV V81 MOVLW "8" MOVWF UNIV MOVLW "1" MOVWF DIXV GOTO FINCONV V82 MOVLW "8" MOVWF UNIV MOVLW "2" MOVWF DIXV GOTO FINCONV V83 MOVLW "8" MOVWF UNIV MOVLW "3" MOVWF DIXV GOTO FINCONV V84 MOVLW "8" MOVWF UNIV MOVLW "4" MOVWF DIXV GOTO FINCONV V85 MOVLW "8" MOVWF UNIV MOVLW "5" MOVWF DIXV GOTO FINCONV FINCONV RETURN ;************************************** ;** SP vconversion BINAIRE en BCD ** ;** entrée mot de 8 bits dans W ** ;** sortie 3 digits ASCII en ** ;** HSD pour les centaines ** ;** MSD pour les dizaines ** ;** LSD pour les unités ** ;************************************** BINBCD CLRF HSD CLRF MSD CLRF LSD MOVWF LSD BIN1 MOVLW d'100' SUBWF LSD,w BTFSS C GOTO BIN2 MOVWF LSD INCF HSD GOTO BIN1 BIN2 MOVLW d'10' SUBWF LSD,w BTFSS C GOTO BIN3 MOVWF LSD INCF MSD GOTO BIN2 BIN3 MOVLW h'30' ADDWF HSD ADDWF MSD ADDWF LSD 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 CAN ** ;** Lance la conversion analog/digital ** ;** résultat dans W sur 6 bits ** ;** canal préalablement positionné: ** ;** par bit CHS0 / CHS1 / CHS2 ** ;************************************************** CAN MOVLW d'5' 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 ;RRF ADRESH ;RRF ADRESH,w ; 1 décalage à droite pour ne garder que 7 bits ;ANDLW h'7F' ; masque le bit MSB RETURN ;************************************************************ ;** SP pour AFFICHAGE sur LCD ** ;************************************************************ ;** ;************************************************** ;** SP CLRLCD ** ;** Efface le LCD ** ;************************************************** CLRLCD MOVLW h'01' ; Clear display CALL ECRINS MOVLW d'1' ; délai min obligatoire CALL DELAI ; car autrement LCD plante RETURN ;************************************************** ;** SP ECRINS ** ;** Envoi sur 2 fois 4 bits au LCD le code ** ;** instruction passé sur 8 bits dans W ** ;************************************************** ECRINS MOVWF LCD1 ; sauve W CALL BUSY ; attente LCD libre BCF RS ; RS=0 MOVFW LCD1 ; restaure W ENV4 MOVWF LCD2 ; sauve W en LCD2 MOVWF LCD1 ; sauve W RRF LCD2 ; décalage droite de 1 bit de LCD2 RRF LCD2 ; décalage droite de 1 bit de LCD2 RRF LCD2 ; décalage droite de 1 bit de LCD2 RRF LCD2 ; décalage droite de 1 bit de LCD2 MOVFW LCD2 CALL LLSB ; écriture du MSB sur les 4 bits du LCD CALL ENAB MOVFW LCD1 ; restaure W MOVWF LCD2 ; 4 bits à écrire dans LCD2 CALL LLSB ; écriture du LSB sur les 4 bits du LCD CALL ENAB RETURN ;************************************************** ;** SP ECRCAR ** ;** Envoi sur 2 fois 4 bits au LCD le code ** ;** caratère passé sur 8 bits dans W ** ;************************************************** ECRCAR MOVWF LCD1 ; sauve W CALL BUSY ; attente LCD libre BSF RS ; RS = 1 MOVFW LCD1 ; restaure W CALL ENV4 RETURN ;********************************************* ;** SP LLSB ** ;** écriture des 4 bits LSB de LCD2 ** ;** dans 4 bits LCD donc sur LSB du PORTA ** ;** sans modifier le MSB du PORT A ** ;** bit 0 sur Port B0 = D4 ** ;** bit 1 sur Port B1 = D5 ** ;** bit 2 sur Port B2 = D6 ** ;** bit 3 sur Port B3 = D7 ** ;********************************************* LLSB BTFSC LCD2 ,0 GOTO LLSB1 BCF PORTB,0 GOTO LLSB2 LLSB1 BSF PORTB,0 LLSB2 BTFSC LCD2 ,1 GOTO LLSB3 BCF PORTB,1 GOTO LLSB4 LLSB3 BSF PORTB,1 LLSB4 BTFSC LCD2 ,2 GOTO LLSB5 BCF PORTB,2 GOTO LLSB6 LLSB5 BSF PORTB,2 LLSB6 BTFSC LCD2 ,3 GOTO LLSB7 BCF PORTB,3 GOTO LLSB8 LLSB7 BSF PORTB,3 LLSB8 RETURN ;***************************************** ;** SP ENAB ** ;** Fait E=1 délai E=0 ** ;***************************************** ENAB BSF E ; E=1 NOP NOP NOP NOP ; délai BCF E ; E=0 RETURN ;***************************************** ;** SP BUSY ** ;** Teste si LCD libre ** ;***************************************** BUSY PAGE1 BSF TRISB,0 ; Port data LCD en entrée BSF TRISB,1 BSF TRISB,2 BSF TRISB,3 PAGE0 BCF RS ; RS=0 BSF RW ; Read BSF E ; E=1 NOP ; délai MOVFW PORTB ; lecture LSB du LCD MOVWF LCD2 ; sauvegarde BCF E ; E=0 NOP ; délai BSF E ; E=1 NOP ; délai MOVFW PORTB ; lecture MSB du LCD BCF E ; E=0 NOP ; délai BTFSC LCD2,3 ; bit BF = 0 ? GOTO BUSY ; non LCD pas prêt PAGE1 ; oui LCD prêt BCF TRISB,0 ; Port data LCD en sortie BCF TRISB,1 BCF TRISB,2 BCF TRISB,3 PAGE0 BCF RW ; write RETURN ;******************************************** ;** SP pour DELAIS ** ;** DEL dure 1 ms ** ;** DEL025S dure 250 ms ** ;** DEL05S dure 500 ms ** ;** DEL1S dure 1 seconde ** ;** DELAI dure W fois 1 ms ** ;******************************************** ;******************************************** ;** SP DELAI de 1 ms ** ;** Quartz de 20 MHz ** ;** 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 DEL1S DEL05S DEL025S ** ;** SP délai de 1s ou 0,5s ou 0,25s ** ;************************************* DEL1S MOVLW d'250' ; 4 fois 0,25 s CALL DELAI MOVLW d'250' CALL DELAI DEL05S MOVLW d'250' ; 2 fois 0,25 sec CALL DELAI DEL025S MOVLW d'250' ; 1 fois 0,25 sec CALL DELAI RETURN ;**************************************** ;** INTERRUPTIONS ** ;** IT de l'USART RS232 en réception ** ;** ou IT du TIMER 1 toutes les 100ms ** ;**************************************** SPIT PUSH BTFSS TMR1IF ; IT du TIMER 1? GOTO ITRX ; non, c'est une IT de l'USART ITTMR1 BCF TMR1IF ; oui, c'est une IT du Timer 1 car TMRIF = 1: RAZ flag BTFSS FLRX ; FLRX = 1 ? GOTO COMPT ; non BCF FLRX ; oui donc on le met à "0' GOTO FINTIME ; terminé COMPT DECFSZ CPTRX ; comptage du nbre de fois ou FLRX est à "0" GOTO RETOUR ; cela ne fait pas 10 fois BCF FLAFF ; cela fait 20 fois donc réception est HS GOTO RETOUR ; il ne faut plus afficher FINTIME BSF FLAFF ; on peut afficher car réception est OK MOVLW d'20' MOVWF CPTRX GOTO RETOUR ; on recharge le compteur du nbre de réception HS ITRX BSF FLRX ; c'est une IT de l'USART 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 "S" ; non SUBWF SAUVE,w BTFSS Z ; caract reçu = "S" ? GOTO RETOUR2 ; non c'est pas le caratére "S" 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 VBATT ; sauve octet reçu : le 1er de la trame en VBATT BSF FLAGSYN3 ; monte FLAGSYN3 GOTO RETOUR TESTFL4 BTFSC FLAGSYN4 ; FLAGSYN4 = 1 ? GOTO DERNIER ; oui MOVFW SAUVE ; non MOVWF TMOT1 ; sauve octet reçu : le 2eme de la trame en TMOT1 BSF FLAGSYN4 ; monte FLAGSYN4 GOTO RETOUR DERNIER MOVFW SAUVE ; non MOVWF TMOT2 ; sauve octet reçu : le 3eme de la trame en TMOT2 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