programme de comptage 16f84 ?
Débuté par polux, juin 19 2008 01:38
37 réponses à ce sujet
#23
Posté 21 juin 2008 - 03:54
http://www.betterupload.com/fr/263070
Voici et sinon l'erreur sous mplab est du a la longeur du chemin d'acces place le dans un dossier plus proche de la racine (genre: C/projet/fichier.asm
Voici et sinon l'erreur sous mplab est du a la longeur du chemin d'acces place le dans un dossier plus proche de la racine (genre: C/projet/fichier.asm
#25
Posté 24 juin 2008 - 01:32
salut
je change mon fusil d'epaule !!
j'ais trouvé une autre solution le comptage de choc sera un 4017. mais il me faut une tempo...
quelqun peut " m'ecrire " une tempo en asm (16f84 quartz de 32khz.)
prog qui sera "integré" ds le programme principal.
avec la config suivante ?
chaque fois qu'il y aura interruption sur RB0 (entrée .. front montant) ---> sortie RA3 a "1" pendant 40 secondes quartz de 32khz.
merci
je change mon fusil d'epaule !!
j'ais trouvé une autre solution le comptage de choc sera un 4017. mais il me faut une tempo...
quelqun peut " m'ecrire " une tempo en asm (16f84 quartz de 32khz.)
prog qui sera "integré" ds le programme principal.
avec la config suivante ?
chaque fois qu'il y aura interruption sur RB0 (entrée .. front montant) ---> sortie RA3 a "1" pendant 40 secondes quartz de 32khz.
merci
#27
Posté 24 juin 2008 - 05:17
sympas , merci
mon idée est la suivante pour contourner cette "usine a gaz" de " 3 chocs "
le prmiers choc (front montant) va lancer une tempo via l'entrée RB0 du pic
sortie sur RA3 ., RA3 va mettre a la masse la broche 13 et 15 d'un cd 4017
et cela pendant 40 secondes ,pendant lesquelles on prends en compte ts chocs
venant du capteur la broche 10 du cd 4017 va lacer l'alarme via un opto
(ouverture d'un port de surveillance du pic) .
pour ce faire j'ais fait le "menage" et virer donc RB0 et RA3 du programme
principal afin qu'ils puissent etre utiliser par la suite.
voiçi
LIST p=16F84 ; Définition de processeur
#include ; Définitions des variables
; Mis en remarque à cause d'une anomalie lors de la simulation. Retirer le ; pour programmer le pic.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _LP_OSC
ERRORLEVEL -302
; '__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.
; Voici les valeurs et leurs définitions :
; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse vitesse
; _XT_OSC Oscillateur quartz moyenne vitesse
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur à réseau RC
;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************
OPTIONVAL EQU H'008F' ; Valeur registre option
; Résistance pull-up OFF
; Préscaler wdt à 128
INTERMASK EQU H'0000' ; Pas d'interruption
;*********************************************************************
; DEFINITIONS *
;*********************************************************************
#define NB_MAX_ALA .05 ; Nombre maximum d'alarmes sonores (3 fois par défaut)
#define TEMPO_INIT .60 ; Durée de mise en route en secondes (30 sec. par défaut)
#define TEMPO_PREALA .15 ; Durée de préalarme avant alarme en secondes (15 sec. par défaut)
#define TEMPO_ALA .80 ; Durée d'activation de l'alarme en secondes (60 sec. par défaut)
#define TEMPO_REL_T .01 ; Durée d'activation du relais temporisé en minutes
; en plus de la durée TEMPO_ALA.
#define TYPE_NO_NF 0x0000 ; Pour des contacts NO = 0x00, pour des contacts NF = 0x3F.
;Il doit être possible de mélanger en entrée les contacts 'NF' et NO' en plaçant dans la variable
; 'TYPE_NO_NF' un bit à 1 pour chaque entrée de type 'NF' suivant le format suivant.
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
#define PORT_LEDS PORTB
#define BIT_LED_V 0x10 ; Bit de sortie de la led verte
#define BIT_LED_O 0x20 ; Bit de sortie de la led orange + buzzer
#define BIT_LED_R 0x40 ; Bit de sortie de la led rouge
#define LED_V PORTB,4 ; Led verte
#define LED_O PORTB,5 ; Led orange + buzzer
#define LED_R PORTB,6 ; Led rouge
#define PORT_REL_F PORTA
#define PORT_REL_C PORTA
#define PORT_REL_T PORTB
#define BIT_REL_F 0x80 ; Bit de sortie du relais fixe
#define BIT_REL_T 0x02 ; Bit de sortie du relais temporisé
#define BIT_REL_C 0x01 ; Bit de sortie du relais clignotant
#define REL_C PORTA,0 ; Relais clignotant (2Hz)
#define REL_T PORTA,1 ; Relais Temporisé (5mn)
#define REL_F PORTB,7 ; Relais fixe (20 sec)
#define PORTE_P PORTA,2 ; Porte principale
#define MODE_TEST PORTA,4 ; 0 Volt = mode test
#define FENETRE_1 PORTB,1 ; Fenêtre 1
#define FENETRE_2 PORTB,2 ; Fenêtre 2
#define BOITIER PORTB,3 ; Boitier
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
#define PP 0X10 ; Bit porte principale
#define PFB 0X2F ; Bits portes fenêtres boitier
#define PPFB 0X3F ; Bits porte principale portes fenêtres boitier
#define Page0 BCF STATUS,5 ; Active le bank 0
#define Page1 BSF STATUS,5 ; Active le bank 1
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
CBLOCK 0x00C ; Début de la zone variables
Etat_in : 1 ; Etat des entrées
Etat_in2 : 1 ; Etat des entrées
Etat_in_PP : 1 ; Etat des entrées du port B,Porte Principale
Etat_in_PFB : 1 ; Etat entrées port B,Boîtier Fenêtres Portes
Nbalarme : 1 ; Nombre d'alarme encore sonores
Tempo : 1 ; Compteur de temporisation générale
Cmptenv : 1 ; Compteur en veille
Cmpt1 : 1 ; Compteur de boucles 1
Cmpt2 : 1 ; Compteur de boucles 2
Cmptt1 : 1 ; Tempo. relais temporisé 1er compteur
Cmptt2 : 1 ; Tempo. relais temporisé 2eme compteur
Nbboucle : 1 ; Nombre de boucle a effectuer (localement)
Sauvew : 1 ; Sauvegarde temporaire du registre w
compt_1 ; L'adresse est dans la directive CBLOCK, les
compt_2 ; variables se succèdent (le nb 1 signifie 1 octet
ENDC ; Fin de la zone
;*********************************************************************
; DEMARRAGE SUR RESET *
;*********************************************************************
org 0x000 ; Adresse de départ après reset
goto Init ; Adresse 0 = saut vers Init.
;*********************************************************************
; INTERRUPTION *
;*********************************************************************
org 0x004 ; Adresse d'interruption
btfsc INTCON,2 ; test si interruption par TMRO
goto temps ; si oui ----> temps
goto fin
;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
Init clrf PORTA ; Sorties portA à 0
clrf PORTB ; Sorties portB à 0
Page1 ; Sélectionner banque 1
clrf EEADR ; Permet de diminuer la consommation
movlw OPTIONVAL ; Charger masque
movwf OPTION_REG ; Initialiser registre option
movlw b'00011100' ; Port A : Bits 2+3+4 en entrées
movwf TRISA
movlw b'00001111' ; Port B : Bits 0+1+2+3 en entrées
movwf TRISB
Page0 ; Sélectionner banque 0
movlw INTERMASK ; masque interruption
movwf INTCON ; charger interrupt control
;-----------------------------------------------------------------
; Initialiser compt_1 à 10 (il faut bien lui donner une valeur)
movlw .10 ; on prend la valeur décimale 10
movwf compt_1 ; pour initialiser compt_1
; valider les interruptions timer 0 et globales
bsf INTCON, T0IE ;
bsf INTCON, GIE ;
;-----------------------------------------------------------------
call Tempo05 ; On attend 0,5 secondes pour charger les capas d'entrée
clrf Cmptt1
movlw TEMPO_REL_T
movwf Cmptt2
movlw NB_MAX_ALA
movwf Nbalarme ; Maximum d'alarmes sonores = NB_MAX_ALA
;*********************************************************************
; PROGRAMME INITIAL, TEMPORISATION POUR SORTIR *
;*********************************************************************
; On passe dans cette routine si le cavalier RA[4] est positionné à +5V.
;*********************************************************************
movlw TEMPO_INIT
addlw TEMPO_INIT
addlw TEMPO_INIT
movwf Tempo ; Tempo = 3 * TEMPO_INIT = Nb de boucle à faire
Demar1 btfsc PORTE_P ; Porte principale ouverte ?
goto Demar3 ; non
goto Demar2 ; allume la led orange + buzzer en continu
bsf LED_O
goto Demar4
Demar2 movlw BIT_LED_O ; Si oui, on change d'état led orange
xorwf PORT_LEDS,f
goto Demar4
Demar3 bcf LED_O ; Porte Principale fermée => on éteint la led orange
Demar4 call Lec_etat
andlw PFB
sublw PFB
btfsc STATUS,Z
goto Demar6
Demar6 call Tempo03 ; Tempo 300 ms
decfsz Tempo,f
goto Demar1
;*********************************************************************
; BOUCLE DE VEILLE *
;*********************************************************************
; On attend un changement d'état des contacts.
;*********************************************************************
Veille1 bcf LED_O ; Eteint la led orange
bcf REL_C ; Arrête le relais clignotant
bcf REL_F ; Arrête le relais fixe
call Lec_etat
movwf Etat_in ; Etat_in = 00XX XXXX
movwf Etat_in_PP
movwf Etat_in_PFB
movlw PP
andwf Etat_in_PP,f ; Etat_in_PP = état Porte Principale
movlw PFB
andwf Etat_in_PFB,f ; Etat_in_PFB = état Boîtier,Fenêtres,Portes
Veille2 call Lec_etat
movwf Sauvew
andlw PFB
xorwf Etat_in_PFB,w ; = "00000010" si l'entrée n°2 a bougé
btfss STATUS,Z
goto Alarme1 ; Va directement en séquence alarme
movfw Sauvew
andlw PP
xorwf Etat_in_PP,w ; = "00000001" si la porte principale a bougé
btfss STATUS,Z
goto Preala1 ; Va en séquence pré-alarme
incfsz Cmptenv,f ;
goto Veille4
;
; On passe ici une fois toute les secondes (256 * 4 ms).
;
btfss REL_T ; Relais temporisé actif ?
goto Veille4 ; non!
decfsz Cmptt1,f ; Décrémente Cmptt1,Cmptt2 = 24,TEMPO_REL_T
goto Veille4 ; Cmptt1 <> 0, oui !
decfsz Cmptt2,f
goto Veille3 ; Cmptt2 <> 0, oui !
bcf REL_T ; arrête le relais temporisé.
Veille3 movlw .18 ; Cmptt1 compte les minutes
movwf Cmptt1
Veille4 call Tempo0004 ; Tempo0004 de 4 ms + 4ms dans Veille2 = 8ms au total
goto Veille2
;*********************************************************************
; BOUCLE DE PREALARME *
;*********************************************************************
; On est entré par la porte.
; Activation de la temporisation de pré-alarme de TEMPO_PREALA secondes
; avant l'activation de l'alarme.
;*********************************************************************
Preala1 movlw TEMPO_PREALA
addlw TEMPO_PREALA
movwf Tempo ; Tempo = 2 * TEMPO_PREALA, car 0,5 sec / boucle
movfw Nbalarme ; A t'on déjà eu une alarme ?
sublw NB_MAX_ALA
btfss STATUS,Z ; Nbalarme <> NB_MAX_ALA ?
call Lec_etat
andlw PFB
movwf Etat_in_PFB ; EtatRBBFP = état Boîtier,Fenêtres,Portes
Preala2 goto Preala21 ; allume la led orange+buzzer en continu
bsf LED_O
goto Preala22
Preala21 movlw BIT_LED_O
xorwf PORT_LEDS,f ; Change l'état de la led orange
Preala22 movlw .65 ; 0,5 sec. = 65 * 4 ms + prg preala
movwf Nbboucle
Preala3 call Tempo0004 ; On boucle "Nbboucle" fois 4 milli sec.
call Lec_etat
andlw PFB
xorwf Etat_in_PFB,w ; = "00000010" si l'entrée n°2 a bougé
btfss STATUS,Z
goto Alarme1 ; Va directement en séquence alarme
decfsz Nbboucle,f ; Decrémenter Nbboucle
goto Preala3 ; Si Nbboucle <> 0, recommencer boucle
decfsz Tempo,f ; Décrémenter le temps de pré-alarme
goto Preala2 ; Si <> 0, recommencer boucle
goto Alarme1 ; Sinon on va en séquence d'alarme
;*********************************************************************
; BOUCLE D'ALARME *
;*********************************************************************
; On a ouvert le boîtier, une fenêtre ou une porte interne, ou
; on a dépasse la temporisation de pré-alarme.
;*********************************************************************
Alarme1 bcf LED_O
movlw TEMPO_ALA
addlw TEMPO_ALA
movwf Tempo ; Tempo = 2 * TEMPO_ALA, car 0,5 sec / boucle
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Nbalarme = Nombre d'alarmes sonores
goto Alarme2 ; si = 0 pas d'activation des relais
bsf REL_F ; Active les relais d'alarme fixe et
bsf REL_C ; clignotant
Alarme2 movlw TEMPO_REL_T ; Active la temporisation du relais
movwf Cmptt2 ; temporisé.
movlw .3 ; Cmptt1 compte les minutes
movwf Cmptt1
bsf REL_T ; Active le relais temporisé
btfsc REL_T ; si alarme memorisation
bsf LED_V ; memorisation par led verte
call Lec_etat
movwf Etat_in
Alarme3 call Lec_etat
andlw PPFB
xorwf Etat_in,w ; = "00000010" si l'entrée 1 a bougé
btfss STATUS,Z
goto Alarme1 ; Si ça a bougé, raz de la tempo d'alarme
call Tempo05
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Nbalarme = Nombre d'alarmes sonores
goto Alarme4 ; si = 0 pas d'activation des relais
movlw BIT_REL_C
xorwf PORT_REL_C,f ; Change d'état le relais 2 (clignotant)
Alarme4 decfsz Tempo,f ; Décrémenter le temps d'alarme
goto Alarme3 ; si <> 0, recommencer boucle
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Alarmes pas sonores ?
goto Veille1 ; Si oui, retour directement en veille
decf Nbalarme,f
bcf REL_C ; Arrêt du relais clignotant
bcf REL_F ; Arrêt du relais fixe
goto Veille1
;*********************************************************************
; temporisation *
;*********************************************************************
temps btfsc REL_T ; si relais Temporisé a 1 ,led veille allumée "fixe" -DJ-
goto fin
decfsz compt_1
goto fin
movwf Sauvew ; Sauvegarder le registre de travail car il
; est modifié dans cette routine asynchrone
movlw 5 ;
movwf compt_1
movlw BIT_LED_R ;pour basculer la LED rouge
xorwf PORTB, f ; par un OU EXCLUSIF
movfw Sauvew ; Restaurer le registre de travail car il a
; été modifié dans cette routine asynchrone
fin bcf INTCON,T0IF ; pour ne pas redéclencher la routine par erreur
RETFIE
;*********************************************************************
; PROGRAMME LED_R CLIGNOTANTE DE VEILLE *
;*********************************************************************
init bsf STATUS,5
movlw B'11000111' ; positioner registre option
movwf OPTION_REG
bcf STATUS,5
clrf PORTB
movlw compt_2
movwf compt_1
bcf STATUS,0
bsf INTCON,5
bsf INTCON,7
bsf LED_R
boucle nop
goto boucle
;*********************************************************************
; SOUS-ROUTINES DE TEMPORISATION *
;*********************************************************************
; Ces sous-routine introduisent un retard de
; Tempo0004 = 4 milli secondes (0,0004 sec.)
; Tempo001 = 10 milli secondes (0,0010 sec.)
; Tempo03 = 300 milli secondes (0,3 sec.)
; Tempo05 = 300 milli secondes (0,3 sec.)
;
; Modifie la variable = Cmpt1
; Elles ne reçoivent aucun paramètre et n'en retourne aucun.
;---------------------------------------------------------------------
Tempo0004
movlw .8 ; 4 ms = environ 8 boucles à Horloge = 32Khz
movwf Cmpt1 ; effacer compteur1
tempo_a nop ; perdre 1 cycle
decfsz Cmpt1,f ; décrémenter compteur1
goto tempo_a ; si pas 0, boucler
return
;---------------------------------------------------------------------
Tempo001
movlw .15 ; 10 ms = environ 19 boucles à Horloge = 32Khz
movwf Cmpt1 ; Effacer Cmpt1
tempo_b nop ; perdre 1 cycle
decfsz Cmpt1,f ; Décrémenter Cmpt1
goto tempo_b ; si pas 0, boucler
return
;---------------------------------------------------------------------
Tempo03 movlw .22 ; 330 ms = environ 32 boucles de 10 ms.
movwf Cmpt2
tempo_c call Tempo001
decfsz Cmpt2,f ; Décrémenter Cmpt2
goto tempo_c ;
return
;---------------------------------------------------------------------
Tempo05 movlw .40 ; 330 ms = environ 32 boucles de 10 ms.
movwf Cmpt2
tempo_d call Tempo001
decfsz Cmpt2,f ; Décrémenter Cmpt2
goto tempo_d ;
return
;*********************************************************************
; SOUS-ROUTINES DE LECTURE DES ENTREES *
;*********************************************************************
;---------------------------------------------------------------------
; Cette sous-routine lit les états des portes, boitier et fenêtres
; Elle ne reçoit pas de paramètre et retourne la valeur dans w.
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; W = 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
; Modifie la variable = Cmpt1
;---------------------------------------------------------------------
Lec_etat
movfw PORTA
andlw 0x0C
movwf Cmpt1
bcf STATUS,C
rlf Cmpt1,f
bcf STATUS,C
rlf Cmpt1,f
movfw PORTB
andlw 0x0F
iorwf Cmpt1,w ; w = 00XX XXXX = état des entrées
xorlw TYPE_NO_NF
return
END
[/code]
mon idée est la suivante pour contourner cette "usine a gaz" de " 3 chocs "
le prmiers choc (front montant) va lancer une tempo via l'entrée RB0 du pic
sortie sur RA3 ., RA3 va mettre a la masse la broche 13 et 15 d'un cd 4017
et cela pendant 40 secondes ,pendant lesquelles on prends en compte ts chocs
venant du capteur la broche 10 du cd 4017 va lacer l'alarme via un opto
(ouverture d'un port de surveillance du pic) .
pour ce faire j'ais fait le "menage" et virer donc RB0 et RA3 du programme
principal afin qu'ils puissent etre utiliser par la suite.
voiçi
**********************************************************************
LIST p=16F84 ; Définition de processeur
#include
; Mis en remarque à cause d'une anomalie lors de la simulation. Retirer le ; pour programmer le pic.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _LP_OSC
ERRORLEVEL -302
; '__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.
; Voici les valeurs et leurs définitions :
; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse vitesse
; _XT_OSC Oscillateur quartz moyenne vitesse
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur à réseau RC
;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************
OPTIONVAL EQU H'008F' ; Valeur registre option
; Résistance pull-up OFF
; Préscaler wdt à 128
INTERMASK EQU H'0000' ; Pas d'interruption
;*********************************************************************
; DEFINITIONS *
;*********************************************************************
#define NB_MAX_ALA .05 ; Nombre maximum d'alarmes sonores (3 fois par défaut)
#define TEMPO_INIT .60 ; Durée de mise en route en secondes (30 sec. par défaut)
#define TEMPO_PREALA .15 ; Durée de préalarme avant alarme en secondes (15 sec. par défaut)
#define TEMPO_ALA .80 ; Durée d'activation de l'alarme en secondes (60 sec. par défaut)
#define TEMPO_REL_T .01 ; Durée d'activation du relais temporisé en minutes
; en plus de la durée TEMPO_ALA.
#define TYPE_NO_NF 0x0000 ; Pour des contacts NO = 0x00, pour des contacts NF = 0x3F.
;Il doit être possible de mélanger en entrée les contacts 'NF' et NO' en plaçant dans la variable
; 'TYPE_NO_NF' un bit à 1 pour chaque entrée de type 'NF' suivant le format suivant.
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
#define PORT_LEDS PORTB
#define BIT_LED_V 0x10 ; Bit de sortie de la led verte
#define BIT_LED_O 0x20 ; Bit de sortie de la led orange + buzzer
#define BIT_LED_R 0x40 ; Bit de sortie de la led rouge
#define LED_V PORTB,4 ; Led verte
#define LED_O PORTB,5 ; Led orange + buzzer
#define LED_R PORTB,6 ; Led rouge
#define PORT_REL_F PORTA
#define PORT_REL_C PORTA
#define PORT_REL_T PORTB
#define BIT_REL_F 0x80 ; Bit de sortie du relais fixe
#define BIT_REL_T 0x02 ; Bit de sortie du relais temporisé
#define BIT_REL_C 0x01 ; Bit de sortie du relais clignotant
#define REL_C PORTA,0 ; Relais clignotant (2Hz)
#define REL_T PORTA,1 ; Relais Temporisé (5mn)
#define REL_F PORTB,7 ; Relais fixe (20 sec)
#define PORTE_P PORTA,2 ; Porte principale
#define MODE_TEST PORTA,4 ; 0 Volt = mode test
#define FENETRE_1 PORTB,1 ; Fenêtre 1
#define FENETRE_2 PORTB,2 ; Fenêtre 2
#define BOITIER PORTB,3 ; Boitier
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
#define PP 0X10 ; Bit porte principale
#define PFB 0X2F ; Bits portes fenêtres boitier
#define PPFB 0X3F ; Bits porte principale portes fenêtres boitier
#define Page0 BCF STATUS,5 ; Active le bank 0
#define Page1 BSF STATUS,5 ; Active le bank 1
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
CBLOCK 0x00C ; Début de la zone variables
Etat_in : 1 ; Etat des entrées
Etat_in2 : 1 ; Etat des entrées
Etat_in_PP : 1 ; Etat des entrées du port B,Porte Principale
Etat_in_PFB : 1 ; Etat entrées port B,Boîtier Fenêtres Portes
Nbalarme : 1 ; Nombre d'alarme encore sonores
Tempo : 1 ; Compteur de temporisation générale
Cmptenv : 1 ; Compteur en veille
Cmpt1 : 1 ; Compteur de boucles 1
Cmpt2 : 1 ; Compteur de boucles 2
Cmptt1 : 1 ; Tempo. relais temporisé 1er compteur
Cmptt2 : 1 ; Tempo. relais temporisé 2eme compteur
Nbboucle : 1 ; Nombre de boucle a effectuer (localement)
Sauvew : 1 ; Sauvegarde temporaire du registre w
compt_1 ; L'adresse est dans la directive CBLOCK, les
compt_2 ; variables se succèdent (le nb 1 signifie 1 octet
ENDC ; Fin de la zone
;*********************************************************************
; DEMARRAGE SUR RESET *
;*********************************************************************
org 0x000 ; Adresse de départ après reset
goto Init ; Adresse 0 = saut vers Init.
;*********************************************************************
; INTERRUPTION *
;*********************************************************************
org 0x004 ; Adresse d'interruption
btfsc INTCON,2 ; test si interruption par TMRO
goto temps ; si oui ----> temps
goto fin
;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
Init clrf PORTA ; Sorties portA à 0
clrf PORTB ; Sorties portB à 0
Page1 ; Sélectionner banque 1
clrf EEADR ; Permet de diminuer la consommation
movlw OPTIONVAL ; Charger masque
movwf OPTION_REG ; Initialiser registre option
movlw b'00011100' ; Port A : Bits 2+3+4 en entrées
movwf TRISA
movlw b'00001111' ; Port B : Bits 0+1+2+3 en entrées
movwf TRISB
Page0 ; Sélectionner banque 0
movlw INTERMASK ; masque interruption
movwf INTCON ; charger interrupt control
;-----------------------------------------------------------------
; Initialiser compt_1 à 10 (il faut bien lui donner une valeur)
movlw .10 ; on prend la valeur décimale 10
movwf compt_1 ; pour initialiser compt_1
; valider les interruptions timer 0 et globales
bsf INTCON, T0IE ;
bsf INTCON, GIE ;
;-----------------------------------------------------------------
call Tempo05 ; On attend 0,5 secondes pour charger les capas d'entrée
clrf Cmptt1
movlw TEMPO_REL_T
movwf Cmptt2
movlw NB_MAX_ALA
movwf Nbalarme ; Maximum d'alarmes sonores = NB_MAX_ALA
;*********************************************************************
; PROGRAMME INITIAL, TEMPORISATION POUR SORTIR *
;*********************************************************************
; On passe dans cette routine si le cavalier RA[4] est positionné à +5V.
;*********************************************************************
movlw TEMPO_INIT
addlw TEMPO_INIT
addlw TEMPO_INIT
movwf Tempo ; Tempo = 3 * TEMPO_INIT = Nb de boucle à faire
Demar1 btfsc PORTE_P ; Porte principale ouverte ?
goto Demar3 ; non
goto Demar2 ; allume la led orange + buzzer en continu
bsf LED_O
goto Demar4
Demar2 movlw BIT_LED_O ; Si oui, on change d'état led orange
xorwf PORT_LEDS,f
goto Demar4
Demar3 bcf LED_O ; Porte Principale fermée => on éteint la led orange
Demar4 call Lec_etat
andlw PFB
sublw PFB
btfsc STATUS,Z
goto Demar6
Demar6 call Tempo03 ; Tempo 300 ms
decfsz Tempo,f
goto Demar1
;*********************************************************************
; BOUCLE DE VEILLE *
;*********************************************************************
; On attend un changement d'état des contacts.
;*********************************************************************
Veille1 bcf LED_O ; Eteint la led orange
bcf REL_C ; Arrête le relais clignotant
bcf REL_F ; Arrête le relais fixe
call Lec_etat
movwf Etat_in ; Etat_in = 00XX XXXX
movwf Etat_in_PP
movwf Etat_in_PFB
movlw PP
andwf Etat_in_PP,f ; Etat_in_PP = état Porte Principale
movlw PFB
andwf Etat_in_PFB,f ; Etat_in_PFB = état Boîtier,Fenêtres,Portes
Veille2 call Lec_etat
movwf Sauvew
andlw PFB
xorwf Etat_in_PFB,w ; = "00000010" si l'entrée n°2 a bougé
btfss STATUS,Z
goto Alarme1 ; Va directement en séquence alarme
movfw Sauvew
andlw PP
xorwf Etat_in_PP,w ; = "00000001" si la porte principale a bougé
btfss STATUS,Z
goto Preala1 ; Va en séquence pré-alarme
incfsz Cmptenv,f ;
goto Veille4
;
; On passe ici une fois toute les secondes (256 * 4 ms).
;
btfss REL_T ; Relais temporisé actif ?
goto Veille4 ; non!
decfsz Cmptt1,f ; Décrémente Cmptt1,Cmptt2 = 24,TEMPO_REL_T
goto Veille4 ; Cmptt1 <> 0, oui !
decfsz Cmptt2,f
goto Veille3 ; Cmptt2 <> 0, oui !
bcf REL_T ; arrête le relais temporisé.
Veille3 movlw .18 ; Cmptt1 compte les minutes
movwf Cmptt1
Veille4 call Tempo0004 ; Tempo0004 de 4 ms + 4ms dans Veille2 = 8ms au total
goto Veille2
;*********************************************************************
; BOUCLE DE PREALARME *
;*********************************************************************
; On est entré par la porte.
; Activation de la temporisation de pré-alarme de TEMPO_PREALA secondes
; avant l'activation de l'alarme.
;*********************************************************************
Preala1 movlw TEMPO_PREALA
addlw TEMPO_PREALA
movwf Tempo ; Tempo = 2 * TEMPO_PREALA, car 0,5 sec / boucle
movfw Nbalarme ; A t'on déjà eu une alarme ?
sublw NB_MAX_ALA
btfss STATUS,Z ; Nbalarme <> NB_MAX_ALA ?
call Lec_etat
andlw PFB
movwf Etat_in_PFB ; EtatRBBFP = état Boîtier,Fenêtres,Portes
Preala2 goto Preala21 ; allume la led orange+buzzer en continu
bsf LED_O
goto Preala22
Preala21 movlw BIT_LED_O
xorwf PORT_LEDS,f ; Change l'état de la led orange
Preala22 movlw .65 ; 0,5 sec. = 65 * 4 ms + prg preala
movwf Nbboucle
Preala3 call Tempo0004 ; On boucle "Nbboucle" fois 4 milli sec.
call Lec_etat
andlw PFB
xorwf Etat_in_PFB,w ; = "00000010" si l'entrée n°2 a bougé
btfss STATUS,Z
goto Alarme1 ; Va directement en séquence alarme
decfsz Nbboucle,f ; Decrémenter Nbboucle
goto Preala3 ; Si Nbboucle <> 0, recommencer boucle
decfsz Tempo,f ; Décrémenter le temps de pré-alarme
goto Preala2 ; Si <> 0, recommencer boucle
goto Alarme1 ; Sinon on va en séquence d'alarme
;*********************************************************************
; BOUCLE D'ALARME *
;*********************************************************************
; On a ouvert le boîtier, une fenêtre ou une porte interne, ou
; on a dépasse la temporisation de pré-alarme.
;*********************************************************************
Alarme1 bcf LED_O
movlw TEMPO_ALA
addlw TEMPO_ALA
movwf Tempo ; Tempo = 2 * TEMPO_ALA, car 0,5 sec / boucle
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Nbalarme = Nombre d'alarmes sonores
goto Alarme2 ; si = 0 pas d'activation des relais
bsf REL_F ; Active les relais d'alarme fixe et
bsf REL_C ; clignotant
Alarme2 movlw TEMPO_REL_T ; Active la temporisation du relais
movwf Cmptt2 ; temporisé.
movlw .3 ; Cmptt1 compte les minutes
movwf Cmptt1
bsf REL_T ; Active le relais temporisé
btfsc REL_T ; si alarme memorisation
bsf LED_V ; memorisation par led verte
call Lec_etat
movwf Etat_in
Alarme3 call Lec_etat
andlw PPFB
xorwf Etat_in,w ; = "00000010" si l'entrée 1 a bougé
btfss STATUS,Z
goto Alarme1 ; Si ça a bougé, raz de la tempo d'alarme
call Tempo05
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Nbalarme = Nombre d'alarmes sonores
goto Alarme4 ; si = 0 pas d'activation des relais
movlw BIT_REL_C
xorwf PORT_REL_C,f ; Change d'état le relais 2 (clignotant)
Alarme4 decfsz Tempo,f ; Décrémenter le temps d'alarme
goto Alarme3 ; si <> 0, recommencer boucle
movfw Nbalarme
sublw 0
btfsc STATUS,Z ; Alarmes pas sonores ?
goto Veille1 ; Si oui, retour directement en veille
decf Nbalarme,f
bcf REL_C ; Arrêt du relais clignotant
bcf REL_F ; Arrêt du relais fixe
goto Veille1
;*********************************************************************
; temporisation *
;*********************************************************************
temps btfsc REL_T ; si relais Temporisé a 1 ,led veille allumée "fixe" -DJ-
goto fin
decfsz compt_1
goto fin
movwf Sauvew ; Sauvegarder le registre de travail car il
; est modifié dans cette routine asynchrone
movlw 5 ;
movwf compt_1
movlw BIT_LED_R ;pour basculer la LED rouge
xorwf PORTB, f ; par un OU EXCLUSIF
movfw Sauvew ; Restaurer le registre de travail car il a
; été modifié dans cette routine asynchrone
fin bcf INTCON,T0IF ; pour ne pas redéclencher la routine par erreur
RETFIE
;*********************************************************************
; PROGRAMME LED_R CLIGNOTANTE DE VEILLE *
;*********************************************************************
init bsf STATUS,5
movlw B'11000111' ; positioner registre option
movwf OPTION_REG
bcf STATUS,5
clrf PORTB
movlw compt_2
movwf compt_1
bcf STATUS,0
bsf INTCON,5
bsf INTCON,7
bsf LED_R
boucle nop
goto boucle
;*********************************************************************
; SOUS-ROUTINES DE TEMPORISATION *
;*********************************************************************
; Ces sous-routine introduisent un retard de
; Tempo0004 = 4 milli secondes (0,0004 sec.)
; Tempo001 = 10 milli secondes (0,0010 sec.)
; Tempo03 = 300 milli secondes (0,3 sec.)
; Tempo05 = 300 milli secondes (0,3 sec.)
;
; Modifie la variable = Cmpt1
; Elles ne reçoivent aucun paramètre et n'en retourne aucun.
;---------------------------------------------------------------------
Tempo0004
movlw .8 ; 4 ms = environ 8 boucles à Horloge = 32Khz
movwf Cmpt1 ; effacer compteur1
tempo_a nop ; perdre 1 cycle
decfsz Cmpt1,f ; décrémenter compteur1
goto tempo_a ; si pas 0, boucler
return
;---------------------------------------------------------------------
Tempo001
movlw .15 ; 10 ms = environ 19 boucles à Horloge = 32Khz
movwf Cmpt1 ; Effacer Cmpt1
tempo_b nop ; perdre 1 cycle
decfsz Cmpt1,f ; Décrémenter Cmpt1
goto tempo_b ; si pas 0, boucler
return
;---------------------------------------------------------------------
Tempo03 movlw .22 ; 330 ms = environ 32 boucles de 10 ms.
movwf Cmpt2
tempo_c call Tempo001
decfsz Cmpt2,f ; Décrémenter Cmpt2
goto tempo_c ;
return
;---------------------------------------------------------------------
Tempo05 movlw .40 ; 330 ms = environ 32 boucles de 10 ms.
movwf Cmpt2
tempo_d call Tempo001
decfsz Cmpt2,f ; Décrémenter Cmpt2
goto tempo_d ;
return
;*********************************************************************
; SOUS-ROUTINES DE LECTURE DES ENTREES *
;*********************************************************************
;---------------------------------------------------------------------
; Cette sous-routine lit les états des portes, boitier et fenêtres
; Elle ne reçoit pas de paramètre et retourne la valeur dans w.
; Format recomposé des bits d'entrée après lecture du Port A et du Port B
; W = 7 6 5 4 3 2 1 0
; - - P P B F F P
; - - 1 P O 2 1 2
; Modifie la variable = Cmpt1
;---------------------------------------------------------------------
Lec_etat
movfw PORTA
andlw 0x0C
movwf Cmpt1
bcf STATUS,C
rlf Cmpt1,f
bcf STATUS,C
rlf Cmpt1,f
movfw PORTB
andlw 0x0F
iorwf Cmpt1,w ; w = 00XX XXXX = état des entrées
xorlw TYPE_NO_NF
return
END
[/code]
#34
Posté 29 juin 2008 - 05:44
Ah... Un max232est plus compliquer que l'assembleur... Il me semble qu'avec un schéma d'application tu a tout compris...
Bigonoffe explique vraiment tout en détail je me disais qu'un tuto expliquant les bases pour ne pas décourager les débutant en ouvrant un cours de 500 pages ca serais pas mal...
Bigonoffe explique vraiment tout en détail je me disais qu'un tuto expliquant les bases pour ne pas décourager les débutant en ouvrant un cours de 500 pages ca serais pas mal...
#37
Posté 29 juin 2008 - 06:33
non mais, c'est pas la question, a mettre en oeuvre, c'est simple, mais je n'ai pas trouvé d'articles en détaillant le fonctionnement( au niveau interne ) j'ai trouvé des bribes explications de part et autres, je disais juste que c'était dommage (et en tout cas, se n'est pas la seul idée que j'ai donnée hein)
Répondre à ce sujet
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users













