Etape 7: maintenant pour la partie la plus délicate.
Ce pic est le produit final. Je vous laisse l’électronique comme un exercice pour l’élève.
Voici le code pour le 12F675 Micro PIC :
;*****************************************************************************
; Nom du fichier : Flatulant_Boss
; Processeur : 12F675
; Auteur : Alan Mollick (alanmollick.com)
; Mode : Interruption sur l’évolution du GP2
;
; ~ ENREGISTRE LA GPIO ~
; GP0 = entrée--n/c
; GP1 = sortie--relais
; GP2 = entrée--High = mouvement détecté
; GP3 = entrée--n/c
; GP4 = sortie--LED rouge
;*****************************************************************************
liste p = 12F675 ; directive de la liste pour définir le processeur
#include < p12f675.inc > ; définitions de variables spécifiques processeur
ERRORLEVEL-302 ; supprimer message 302 du fichier de la liste
CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; ~ Variables ~
w_temp EQU 0 x 20 ; variable utilisée pour l’enregistrement de contexte
status_temp EQU 0 x 21 ; variable utilisée pour l’enregistrement de contexte
hiB EQU 0 x 21 ; MSByte
lowB EQU 0 x 22 ; LSByte
Temp EQU 0 x 23
rechange EQU 0 x 24
Temp1 EQU 0 x 25 ; gâchette interrupt flag
Temp2 EQU 0 x 26
retard EQU 0 x 27 ; temps de retard
broches EQU 0 x 28 ; État de la broche
spare1 EQU 0 x 29
spare2 EQU 0x2a
comte EQU 0x2b ; nombre de boucles
count1 EQU 0x2c ; comte de boucle externe
count2 EQU 0x2d ; comte de boucle externe
D1 EQU 0x2e ; compteur de retard
D2 EQU 0x2f ; compteur de retard
D3 EQU 0 x 30 ; compteur de retard
D4 EQU 0 x 31 ; compteur de retard
;**********************************************************************
RESET_VECTOR ORG 0X000 ; processeur vectoriel de réinitialisation
Goto principal ; aller au début du programme
INT_VECTOR ORG 0X004 ; Interrupt vecteur position
movwf w_temp ; enregistrer hors cours W contenu du Registre
movf statut, w ; déplacer le registre d’État dans le registre W
movwf status_temp ; économiser sur le contenu du registre d’État
; code de l’ISR
appel motion_detect ; Envoyer des signaux d’alarme
banksel INTCON
BCF INTCON, INTF ; Pavillon Claire GP2/INT
movf status_temp, w ; récupérer la copie du registre d’État
movwf statut ; restauration pre-isr statut contenu de la caisse enregistreuse
swapf w_temp, f
swapf w_temp, w ; restaurer le contenu de la caisse enregistreuse W pre-isr
retfie ; retour d’interruption
;****************************************************************
principal: ; programme principal
; Ces 4 premières instructions ne sont pas nécessaires si l’oscillateur interne n’est pas utilisé
appel 0x3FF ; récupérer la valeur de calibrage d’usine
BSF STATUS, RP0 ; Banque de fichier registre la valeur 1
movwf OSCCAL ; mise à jour de Registre avec la valeur d’usine cal
BCF STATUS, RP0 ; Banque de fichier registre la valeur 0
;***********************************
; * Initialisation *
;***********************************
; GP0 = non utilisé, GP1 = sortie relais, GP2 = input (détecteur de mouvement),
; GP3 = entrée pour cntrl/urgence coupure, GP4 = sortie à voyant,
; GP5 = non utilisé
; mettre en place la direction des broches e/s
banksel TRISIO
movlw b « 00000101 »
; XX---non implémenté
; --0---0 = output, GP5 = n/c
; ---0---0 = output, GP4 = LED
; ---x---ne pas utilisé, GP3, dédié à MCLR
; ---1--1 = entrée, GP2 mouvement détecté
; ---0-0 = output, GP1 = électrovanne
; ---1 1 = entrée GP0 = A/D
movwf TRISIO
; mettre en place le convertisseur A/D
banksel ANSEL
b movlw « 00010000 »
; x---non implémenté
; -001---001 = Focs/8 Conversion horloge
; ---0---0 = e/s numériques, GP4, clockout Fosc/4 à des fins de débogage.
; ---0--0 = e/s numériques, GP2
; ---0-0 = e/s numériques, GP1, relais/etc.
; ---0 0 = e/s numériques, 1 = GP0 analogiques
movwf ANSEL
banksel ADCON0
movlw b "00000000"
; 0---1 = résultat justifiée à droite
; -0---0 = Vdd est la référence de tension
; --xx---non implémenté
; ---00--00 = sélectionner le canal 0 (GP0)
; ---0-0 0 0/D conversion ne pas démarrée
; ---0 0 = A/D converter module est éteint
movwf ADCON0
; initialiser les broches de sortie
init
banksel GPIO
movlw b "00000000"
movwf GPIO
; initialiser les interruptions
banksel INTCON
movlw b "00000000"
; 0---0 = globales interruptions désactivées
; -0---1 = activer les interruptions périphériques
; --0---0 = désactiver TMR0 débordement interruption
; ---1---1 = enable GP2/INT interruption externe
; ---0---0 = désactiver GPIO port changement interruption
; ---0--0 ne = aucun dépassement de capacité sur TMR0
; ------0- 1=
; ---0 0 = aucun changement de port GPIO
movwf INTCON
; initialiser l’interruption sur le changement de NIP GP2
banksel IOC
movlw b « 00000100 »
; x---non implémenté
; -x---non implémenté
; --0---0 = désactiver GP5
; ---0---0 = désactiver GP4
; ---0---0 = désactiver GP3
; ---1--1 = activer GP2/INTR ***
; ---0-0 = désactiver GP1
; ---0 0 = désactiver GP0
movwf IOC
banksel PIE1
movlw b "00000000"
; 0---0 = désactiver EE écrire interruption complète
; -0---0 = désactiver convertisseur A/D interruption
; --xx---non implémenté
; ---0---0 = interruption comparateur désactivée
; ---xx-non implémenté
; ---0 1 = enable TMR1 débordement interruption
movwf PIE1
banksel PIR1
movlw b "00000000"
; 0---0 ne = aucune écriture EE complet
; -0---0 ne = aucune conversion A/D complete
; --xx---non implémenté
; ---0---0 ne = aucune interruption de comparateur
; ---xx-non implémenté
; ---0 0 ne = aucun débordement TMR1
movwf PIR1
;**********************************************************
; GP1 = sortie à relais
; GP4 = sortie à LED
;**********************************************************
banksel INTCON
BSF INTCON, INTE ; activer les interruptions de GP2
BSF INTCON, GIE
Main_Loop :
; Si GP2 = 1 et sorties de signaux d’alarme sur la GP1, GP4 via interruption
sommeil
NOP
Goto Main_Loop
;**********************************************************
; Gestionnaire d’interruption de détection mouvement
;
; GP1 = sortie à relais, GP4 = sortie à LED
;**********************************************************
motion_detect :
BSF GPIO, 1 ; dynamiser les relais pour 100 msec
appel pause_100ms
BCF GPIO, 1 ; désactiver le relais
BSF GPIO, 4 ; activer les LED de 0,5 sec.
appel pause_500ms
BCF GPIO, 4
retour
;**********************************************************
; Générateur de Code en ligne retard
; http://massmind.org/techref/piclist/CodeGen/Delay.htm
;**********************************************************
pause_100msec :
; Retard = 0,1 secondes
; Fréquence d’horloge = 4 MHz
movlw 0x1F ; 99998 cycles
movwf d1
movlw 0x4F
movwf d2
Delay_100
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto Delay_100
GoTo $+ 1; 2 cycles
retour
pause_500msec :
; Retard = 0,5 secondes
; Fréquence d’horloge = 4 MHz
movlw 0 x 03 ; 499994 cycles
movwf d1
movlw 0 x 18
movwf d2
movlw 0 x 02
movwf d3
Delay_500
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto $+ 2
decfsz d3, f
Goto Delay_500
GoTo $+ 1; 6 cycles
GoTo $+ 1
GoTo $+ 1
retour
pause_1sec
; Retard = 1 secondes
; Fréquence d’horloge = 4 MHz
movlw 0 x 08 ; 999997 cycles
movwf d1
movlw 0x2F
movwf d2
movlw 0 x 03
movwf d3
Delay_1sec
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto $+ 2
decfsz d3, f
Goto Delay_1sec
GoTo $+ 1; 3 cycles
NOP
retour
;*****************************************************************************