; "Télérupteur" ; Fabrice Sincère (C) novembre 2006 ; version 1.03 ; microcontrôleur PIC 16F84A ; développé avec Microchip MPLAB IDE List p=16F84A ; processeur utilisé #include __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;bits de configuration : ;code protect OFF ;watchdog timer OFF ;power up timer ON ;oscillateur HS (quartz à grande fréquence : 20 MHz) ;xxxxxx ; macro ;xxxxxx bank1 macro ; passage en banque 1 bsf STATUS,RP0 endm bank0 macro ; passage en banque 0 bcf STATUS,RP0 endm ;xxxxxxxxxxxxxxxxxxxxxxxxx ; déclaration de variables ;xxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK H'00C' ; début de la zone des registres d'usage général mem0 : 1 ; mémorisation de l'état du port B (état antérieur) mem1 : 1 ; mémorisation de l'état du port B (état actuel) detection : 1 ; détection d'un front descendant (bouton poussoir appuyé) compteur1 : 1 ; variable de le boucle de temporisation compteur2 : 1 ; variable de le boucle de temporisation compteur3 : 1 ; variable de le boucle de temporisation ENDC ;xxxxxxxxxxxxxxxxxxxx ; demarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org H'0000' goto initialisation ;xxxxxxxxxxxxxxx ; initialisation ;xxxxxxxxxxxxxxx initialisation bank0 clrf PORTA ; mise à 0 des sorties du port A clrf PORTB ; mise à 0 des sorties du port B bank1 movlw B'00000000' movwf OPTION_REG ; bit 7 = 0 : activation des résistances de pull-up du port B ; (cela permet de faire l'économie de 8 résistances externes) ; bits 0 à 6 : ici, options non utilisées (on les met à 0, par exemple) movlw B'00011110' movwf TRISA ; bit 0 du port A (RA0) = 0 : configuration en sortie (commande du relais). ; bits 1 à 4 du port A (RA1 à RA4) = 1 : non utilisées ; (configuration en entrées, par exemple) movlw B'11111111' movwf TRISB ; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton poussoir 0) ; bit 1 du port B (RB1) = 1 : configuration en entrée (bouton poussoir 1) ; bit 2 du port B (RB2) = 1 : configuration en entrée (bouton poussoir 2) ; bit 3 du port B (RB3) = 1 : configuration en entrée (bouton poussoir 3) ; bit 4 du port B (RB4) = 1 : configuration en entrée (bouton poussoir 4) ; bit 5 du port B (RB5) = 1 : configuration en entrée (bouton poussoir 5) ; bit 6 du port B (RB6) = 1 : configuration en entrée (bouton poussoir 6) ; bit 7 du port B (RB7) = 1 : configuration en entrée (bouton poussoir 7) bank0 movlw B'00000000' movwf PORTA ; sortie RA0 au niveau bas movlw B'11111111' movwf mem1 ; initialisation mem1 ;xxxxxxxxxxxxxxxxxxxxx ; programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme movf mem1, W movwf mem0 ; copie de (mem1) dans (mem0) movf PORTB, W ; lecture du port B movwf mem1 ; mémorisation ; test de l'état du port B : movf mem1, W subwf mem0, W ; comparaison de (mem0) et (mem1) btfsc STATUS,Z ; test du bit Z goto debut_programme; Z=1 : (mem1) est égale à (mem0) : l'état des boutons poussoirs est inchangé ; Z=0 : (mem1) est différent de (mem0): comf mem1 , W ; complément logique de (mem1) andwf mem0, W ; et logique movwf detection ; (detection) = (mem0) et (non(mem1)) ; (detection) égal à H'00' : aucun bouton poussoir n'a été appuyé ; (detection) différent de H'00' : au moins un bouton poussoir a été appuyé movf detection, f ; on test si (detection) est nul btfsc STATUS, Z ; test du bit Z goto temporisation ; Z=1 : (detection) est nul ; Z=0 : (detection) différent de H'00' : comf PORTA, f ; inversion de l'état de la sortie RA0 goto temporisation ; xxx temporisation d'environ 400 ms ;(2 millions de cycles avec un quartz de 20 MHz) ; résout le problème des rebonds des boutons poussoirs temporisation movlw H'00' ; initialisation des compteurs movwf compteur1 movwf compteur2 movlw H'0A' ; pour un quartz 20 MHz ; movlw H'02' pour un quartz 4 MHz movwf compteur3 debut1 ; 3 boucles imbriquées (256*256*10 boucles *3 cycles) decfsz compteur1, f ; décrémente (compteur1) et compare avec 0 goto debut1 ; (compteur1) différent de 0 ;(compteur1) égal à 0 : decfsz compteur2, f ; décrémente (compteur2) et compare avec 0 goto debut1 decfsz compteur3, f ; décrémente (compteur3) et compare avec 0 goto debut1 ; xxx fin de le temporisation goto debut_programme END