;********************************************************************** ; Automatisation du fonctionnement d'une pompe d'arrosage ; mise en * ; marche sur interrupteur M/A et si le détecteur d'humidité indique * ; un manque d'eau dans le sol ; régulation sur contact haut et bas * ; * ; tableau de vérité * ; ----------------- * ; (manque humidité) * ; Contact1 (humid=RB4) F F F F O O O O * ; Contact2 (bas=RB5) F F O O F F O O * ; Contact3 (haut=RB6) F O F O F O F O * ; --------------------------------------- * ; 1 2 3 4 5 6 7 8 * ; * ; 1 = marche * ; 2 = contact haut découvert --> attendre remplissage complet * ; 3 = contact bas découvert/contact haut couvert --> impossible * ; 4 = pas d'eau * ; 5 = assez d'humidité + réservoir plein * ; 6 = assez d'humidité + contact haut découvert * ; 7 = assez d'humidité + défaut * ; 8 = assez d'humidité + pas d'eau * ; * ; on utilisera le PORTB avec les résistances de pull-up (attention * ; les signaux seront inversés, uniquement sur PORTB).Les pattes * ; RB1,RB2,RB3 sont configurées en sorties et on envoie 5v dessus ; * ; les pattes RB4, RB5 et RB6 sont configurées en entrées pour * ; réceptionner ces 5v si les contacts sont fermées par le niveau * ; de l'eau. Pour que la pompe démarre, il faut que : * ; 1)- le contact qui détermine le degré d'humidité * ; du sol soit fermé (RB4). * ; 2)- le contact bas soit fermé (RB5) * ; 3)- le contact haut soit fermé (RB6) * ; * ; Quand la pompe a démarré, on teste : * ; - le contact bas. Tant qu'il est fermé, la pompe tourne * ; - le contact d'humidité. Tant qu'il est fermé, la pompe tourne * ; ; Pour éviter les redémarrages intempestifs, on arrête la pompe à * ; la première coupure et on ne la redémarre que lorsque le contact * ; haut est à nouveau fermé (le niveau d'eau est remonté). * ; Le mode sleep (économie) et le watchdog (plantage)ont été * ; intégrés. * ; Le PORTA est utilisé comme suit : * ; - RA0=commande moteur * ; - RA1=LED verte = démarrage moteur * ; - RA2=LED jaune = manque d'eau ; le contact haut n'est * ; pas couvert * ; - RA3=défaut ; le contact bas n'est pas couvert et le * ; contact haut l'est * ; - RB0= LED verte = humidité suffisante * ; * ; Date : 5/8/07 * ; Auteur : Briola * ;********************************************************************** ; Fichier requis: P16F84a.inc * ;********************************************************************** LIST p=16F84a ; Définition de processeur #include ; Définitions des constantes __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_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. ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power-on en service ; _WDT_ON Watch-dog en service ; _XT_OSC Oscillateur quartz moyenne vitesse ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; début de la zone variables tempo_1 : 1 ; tempo_11 : 1 ; tempo_111 : 1 ; ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* ; initialisation et configuration du PORTB init bsf STATUS,RP0 ; passer banque1 movlw b'01110000' ; RB4, RB5 et RB6 en entrées movwf TRISB ; le reste du PORTB en sorties movlw b'00000000' ; configuration du PORTA movwf TRISA ; en sorties ; mise en service des resistances de pull-up movlw b'00001111' ; RB7=0 --> resistances de pull-up en service movwf OPTION_REG ; RB6=0 --> interruption sur transition de 1 à 0 ; RB3=1 --> prédiviseur sur watchdog ; RB2/RB0=1 prédiviseur à 128 ; initialisation des interruptions bcf STATUS,RP0 ; bank0 movlw b'00000000' ; pas d'interruptions movwf INTCON ; goto start ; ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start ; attention dans tout ce paasage on est en logique ; inverse clrwdt ; clrf PORTA ; efface le PORTA clrf PORTB ; efface le PORTB bcf PORTB,1 ; on envoie 5v sur RB1 bcf PORTB,2 ; on envoie 5v sur RB2 bcf PORTB,3 ; on envoie 5v sur RB3 sommeil sleep ; passe en mode sleep ; quand il y adébordement du watchdog ; le programme continue simplement à l'instruction suivante bcf PORTB,0 ; éteindre la LED verte témoin d'humidité btfsc PORTB,4 ; on teste le contact d'humidité RB4 goto humidite ; si humidité suffisante allumer LED et retour au mode sleep btfsc PORTB,6 ; sinon on teste le contact haut goto manque ; si ouvert retour sur mode sleep btfsc PORTB,5 ; si fermé, on teste le contact bas RB5 goto defaut ; si le contact bas est ouvert : impossible-->defaut bsf PORTA,0 ; si toujours fermé, démarrer pompe bsf PORTA,1 ; allumer LED témoin verte clrwdt ; btfsc PORTB,4 ; tester le contact d'humidité RB4 goto humidite ; si humidité suffisante allumer LED et retour au mode sleep btfss PORTB,5 ; tester le contact bas RB5 goto $-4 ; si toujours fermé, boucler sur le test bcf PORTA,0 ; si ouvert, arrêter pompe bcf PORTA,1 ; éteindre LED témoin goto start ; arrêt defaut bsf PORTA,3 ; allumer LED "défaut" call delai_1 ; goto fin ; humidite bcf PORTA,0 ; arrêter le moteur bcf PORTA,1 ; éteindre LED témoin verte bsf PORTB,0 ; allumer LED "humidité" ; attention, RB0 étant utilisé ; en sortie, il n'y a pas de résistance de pull-up d'où 'bsf' ; pourquoi n'avoir pas utilisée la dernière sortie du PORTA ; parce qu'elle fonctionne en drain ouvert et n'est pas ; utilisable. call delai_1 ; temporise 1s goto sommeil manque bsf PORTA,2 ; allumer LED "manque" call delai_1 ; temporise 1s goto sommeil ;--------------------o------------------------------------------------ ; temporisation de 1s (avec quartz 4Mhz) delai_1 movlw d'100' ; movwf tempo_1 ; delai_11 movlw d'50' ; movwf tempo_11 ; delai_111 movlw d'50' ; movwf tempo_111 ; delai_1111 clrwdt decfsz tempo_111,f ; goto delai_1111 ; decfsz tempo_11,f ; goto delai_111 ; decfsz tempo_1,f ; goto delai_11 ; return fin nop END ; directive fin de programme