;************************************************************** ;** Emetteur de lélécommande.asm ** ;** PIC 12F629 ;** Emission code télécommande type UM3750 ou MM5300 sur GP0 ** ;** Code 1 si appui BP1 Port GP0 (mise à "0") ** ;** Code 2 si appui BP2 Port GP1 (mise à "0") ** ;** Choix du code automatique par appui sur BP Port GP2 ** ;************************************************************** CBLOCK h'20' ; résevation des variables en RAM TEMP1 TEMP2 CPT DECAL RAM1 ENDC ORG h'2100' ;écriture codes en EEPROM DATA DE h'07' ;LSB commun codes 1 et 2 sur 8 bits DE h'0C' ;MSB code 1 : 1100 bit b12=1 et b11=1 DE h'04' ;MSB code 2 : 0100 bit b12=0 et b11=1 ORG H'0000' GOTO PROG ;vecteur de Reset #INCLUDE "MENES629.inc" ; définition des registres du PIC #DEFINE OUT GPIO,4 ; Module Tx MIPOT #DEFINE BP1 GPIO,0 #DEFINE BP2 GPIO,1 #DEFINE BP GPIO,2 ; BP choix code #DEFINE LED GPIO,5 ; LED PROG CALL h'3FF' PAGE1 MOVWF OSCCAL BSF TRISIO,0 ; GP0 = entrée: BP du code 1 BSF TRISIO,1 ; GP1 = entrée: BP du code 2 BSF TRISIO,2 ; GP2 = entrée: BP choix code BCF TRISIO,4 ; GP4 = sortie: Module MIPOT BCF TRISIO,5 ; GP5 = sortie: LED BCF GPPU ; autorisation générale des tirages BSF WPU,0 ; tirage GP0 = BP code 1 BSF WPU,1 ; tirage GP1 = BP code 2 BSF WPU,2 ; tirage GP2 = BP choix code BCF TOCS ; Timer 0 compte Clock interne PAGE0 MOVLW h'07' MOVWF CMCON ; Port GPIO configuré en I/O BCF LED ; Led éteinte MAIN BTFSC BP ; appui sur BP ? GOTO MAIN2 ; non MOVLW h'00' ; oui CALL LECT ; lecture code en EEPROM CALL DELAI ; délai aléatoire MOVFW TMR0 ; lecture TIMER 0 CALL SAUV ; sauve valeur nouveau code en EEPROM CALL CLIGN ; fait clignoter la LED REL BTFSS BP ; BP relaché ? GOTO REL ; non MOVLW d'04' ; oui CALL DELAI ; anti rebond MAIN2 BTFSC BP1 ; BP1 appuyé? GOTO MAIN3 ; non GOTO UN ; oui, traitement de cette tache MAIN3 BTFSC BP2 ; BP2 appuyé ? GOTO MAIN ; non GOTO DEUX ; oui, traitement de cette tache UN CALL CODE1 ; émission du code1 BTFSS BP1 ; test si BP1 relaché GOTO UN ; pas relaché GOTO MAIN ; relaché DEUX CALL CODE2 ; émission du code 2 BTFSS BP2 ; test si BP2 relaché GOTO DEUX ; pas relaché GOTO MAIN ; relaché ;********************************************* ;* SP CODE1 ** ;* émission du code 1 ** ;********************************************* CODE1 BSF LED MOVLW d'8' MOVWF CPT BSF OUT CALL DEL350 ;émission start BCF OUT MOVLW h'00' ;va chercher DATA en EEPROM à l'adresse "00" CALL LECT CODEM0 RRF DECAL ;début d'émission des 8 bits de l'adresse BTFSC C ;test du bit à émettre GOTO CODEM2 CALL EM0 ;émission d'un "0" CODEM1 DECFSZ CPT ;dernier des 8 bits ? GOTO CODEM0 GOTO CODEM7 CODEM2 CALL EM1 ;émission d'un "1" GOTO CODEM1 CODEM7 MOVLW d'4' MOVWF CPT MOVLW h'01' ;va chercher DATA en EEPROM à l'adresse "01" CALL LECT CODEM4 RRF DECAL ;début émission des 4 bits MSB code 1 BTFSC C ;test du bit à émettre GOTO CODEM5 CALL EM0 ;émission d'un "0" CODEM3 DECFSZ CPT ;dernier des 4 bits à émettre GOTO CODEM4 GOTO CODEM6 CODEM5 CALL EM1 ;émission d'un "1" GOTO CODEM3 CODEM6 MOVLW d'36' MOVWF CPT CODEM8 CALL DEL350 ;délai de 350 us DECFSZ CPT ;36 fois GOTO CODEM8 BCF LED MOVLW d'50' CALL DELAI RETURN ;********************************************* ;* SP CODE2 ** ;* émission du code 2 ** ;********************************************* CODE2 BSF LED MOVLW d'8' MOVWF CPT BSF OUT CALL DEL350 ;émission start BCF OUT MOVLW h'00' ;va chercher DATA en EEPROM à l'adresse "00" CALL LECT CODED0 RRF DECAL BTFSC C GOTO CODED2 CALL EM0 CODED1 DECFSZ CPT GOTO CODED0 GOTO CODED7 CODED2 CALL EM1 GOTO CODED1 CODED7 MOVLW d'4' MOVWF CPT MOVLW h'02' ;va chercher DATA en EEPROM à l'adresse "02" CALL LECT CODED4 RRF DECAL ;début émission des 4 bits MSB du code2 BTFSC C GOTO CODED5 CALL EM0 CODED3 DECFSZ CPT GOTO CODED4 GOTO CODED6 CODED5 CALL EM1 GOTO CODED3 CODED6 MOVLW d'36' MOVWF CPT CODED8 CALL DEL350 DECFSZ CPT GOTO CODED8 BCF LED MOVLW d'50' CALL DELAI RETURN ;*********************************** ;** SP lecture EEPROM DATA ** ;** adresse à lire dans W ** ;** octet lu mis dans DECAL ** ;*********************************** LECT PAGE1 MOVWF EEADR ;positionne adresse à lire en EEPROM BSF RD ;bit RD=1 : lecture MOVFW EEDATA ;lecture EEPROM. Octet lu dans W PAGE0 MOVWF DECAL ;octet dans registre DECAL RETURN ;*********************************** ;** SP EM0 ** ;** Emission d'un "0" ** ;*********************************** EM0 BCF OUT CALL DEL350 ; out=0 pendant 350 us BSF OUT CALL DEL350 CALL DEL350 ; out=1 pendant 2 fois 350 us BCF OUT ; repos out=0 RETURN ;*********************************** ;** SP EM1 ** ;** Emission d'un "1" ** ;*********************************** EM1 BCF OUT CALL DEL350 CALL DEL350 ;out=0 pendant 2 fois 350 us BSF OUT CALL DEL350 ;out=1 pendant 350 us BCF OUT ;repos out=0 RETURN ;********************************************* ;** SP DELAI de 350 us = 1,0 T ** ;** Durée en us = (TEMP-1) x 3 + 6 ** ;********************************************* DEL350 MOVLW d'110' MOVWF TEMP1 DEL35 DECFSZ TEMP1 GOTO DEL35 RETURN ;********************************************* ;** SP DELAI de 15 ms environ ** ;** Durée = 45 fois le SP de 350 us ** ;********************************************* DEL6M MOVLW d'45' ;SP délai de 15 ms environ MOVWF TEMP2 DEL6 CALL DEL350 DECFSZ TEMP2 GOTO DEL6 RETURN ;********************************************* ;** SP SAUV ** ;** Sauve octet de RAM2 en EEPROM data ** ;** à l'adresse h'00' ** ;** C'est le nouveau code ** ;********************************************* SAUV PAGE1 MOVWF EEDATA ; valeur à programmer dans EEDATA CLRF EEADR ; adresse EEPROM est h'00' BSF WREN ; autorise écriture MOVLW h'55' MOVWF EECON2 MOVLW h'AA' MOVWF EECON2 BSF WR ; Start écriture PAFINI BTFSC WR ; attente fin cycle écriture GOTO PAFINI BCF WREN ; interdit écriture PAGE0 RETURN ;********************************************** ;** SP CLIGN ** ;** Fait clignoter la LED 5 fois ** ;** Pour signaler fin écriture EEPROM ** ;********************************************** CLIGN MOVLW d'5' MOVWF RAM1 CLIGN1 BSF LED MOVLW d'100' CALL DELAI ; SP qui dure W fois 1 ms ( inclus dans MENES629.inc) BCF LED MOVLW d'100' CALL DELAI DECFSZ RAM1 GOTO CLIGN1 RETURN END