Aller au contenu


Photo
- - - - -

programme de comptage 16f84 ?


37 réponses à ce sujet

#1 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 19 juin 2008 - 01:38

salut

je voulais "integrer" a un programme dejas existant (16f84)
un programme de comptage avec les parametres suivants
si comptage 3 impulsions en moin de 30 seconde
sur l'entrée RB3 ---> activation d'une sortie.
si 2 impulsions seulement et 30 secondes "passées"
retour a zero en attendant prochain comptage.
c'est compliqué ? quelqun peut le faire ?
j'ais le programme asm d'origine a dispo si besoin.
merci

#2 Maïck

Maïck

    Habitué

  • Membres
  • PipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 19 juin 2008 - 02:07

Je veut bien regarder mais après mardi prochain (répète d'exam...)
Si quelqu'un veut le faire entre temps, ça serais bien de mettre le programme d'origine...

Ce n'est pas vraiment difficile, mais comme un autre programme tourne il faut utiliser les interrupts... Tu a quel niveau en programmation de uP ??

#3 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 19 juin 2008 - 05:30

salut
niveau debutant
voila le fichier auquel , (si quelqun le peut)
rajouter les fonctions decrites plus haut avec cette precision ---->
3 chocs en moin de 30 secondes = alarme immediate.(sans préalarme)
2 chocs , 30 secondes "passées"...retour en attente d'eventuels chocs.
le fichier
http://www.betterupload.com/fr/747227
merci

#4 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 19 juin 2008 - 05:44

mais tu a essayer d'implémenté cette fonction toi meme?

#5 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 19 juin 2008 - 06:59

oui avec l'aide d'un contact (autre forum ) , sans resultat.

#6 Sink

Sink

    Nouveau membre

  • Membres
  • 30 messages

Posté 20 juin 2008 - 06:08

Le quartz est un 32KHz? et quelle sortie


Essai sa garantie pas pas trop eu le temps de me plonger dedans :D

#7 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 20 juin 2008 - 09:59

salut Sink (essaie negatif)

oui 32khz pr le quartz
pr le fonctionnement , je voulais la chose suivante
(comme expliqué plus haut)
3 choc en moin de 30 secondes..( pas critique...40 secondes ok aussi )
donc si 3 chocs en moin de 30/40 secondes activation de soit RB1 soit RB2
autrement dit alarme immediate si 3 chocs en 30/40 secondes
si 2 chocs seulement et 30/40 secondes écoulées....
retour a la surveillance de...3 chocs .....

plus d'une personne a dejas "tenter" la modif sans resultat !
si tu y arrive.....chapeau !!!
merci

http://www.betterupload.com/fr/747227

#8 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 20 juin 2008 - 10:22

en C, c'est relativement simple, et je pense que c'est faisable a la bourrin relativement facilement en assembleur;
il serais bien que tu nous donne le code source directement admissible (soit sur un site de paste soit ici entre les balise dédier), parce que j'ai franchement la flegme de le téléchargé.

#9 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 20 juin 2008 - 10:47

pas de probléme le voila , je precise que ce fichier fonctionne parfaitement
je l'ais "alléger" de certaines fonctions (test) dont je n'avais pas
l'utilité et j'ais rajouter une memorisation qu'une alarme a eu lieu
au moin une fois d'origine ça ne fonctionnait pas.
le fichier original est dispo sur le site de bigonof alarme pour habitation
il est en fin de page "montages" (3894)
http://www.abcelectronique.com/bigonoff/realisations.php?par=dbb65
il ne me manque aue cette modif "choc" car je destine cette alarme a un vehicule
j'ais fais un typon et la platine est terminée et fonctionelle en attendant cette modif
je posterais le typon si ça interresse....

;**********************************************************************
; Programme de surveillance de contact pour alarme *
; *
; NOM: AL16F84.ASM *
; Date: 10/01/2008 *
; Version: 2.0 à contact NO pour une plus faible consommation. *
; Auteur: FF *
; *
; Les entrées sont toutes à contacts normalement ouverts pour *
; consommer moins. *
; *
; Il est possible que les entrées soient toutes à contacts *
; normalement fermés pour une consommation supérieure. Modifier *
; la variable TYPE_NO_NF. *
; *
; *
; Les temporisations sont données pour un résonateur à 32,768Khz. *
; Une instruction = 125 µ secondes. *
; Vive le logiciel libre de droit, de taxe, de drm,... *
; *
;---------------------------------------------------------------------*
; Fichier requis pour la compilation : P16F84.inc *
;---------------------------------------------------------------------*
;
; Les signalisations externe au boitier sont : Leds Verte, Orange+Buzzer en //, Rouge
;
; Indications en face avant, à la mise en route le montage :
; Led verte = Allumé le temps de sortir (variable TEMPO_INIT).
; Led orange + buzzer = Clignotent si la porte principale est ouverte (variable TEMPO_PREALA).
; = Allumé en continu si en plus la led rouge est allumée.
; Led rouge = Allumé si une un contact est actif. (défaut des boucles).
;
;
; Indications en face avant, à l'ouverture de la porte principale.
; Led verte = Eteinte.
; Led orange + buzzer = Clignotent pour avertissement avant alarme.
; = Allumé en continu si en plus la led rouge est allumée.
; Led rouge = Il y a déjà eu une alarme détectée.
;
; Indications en face avant, à l'ouverture d'un autre contact.
; Leds eteintes pour rester discret, pour éviter que l'on casse inutilement ce coffret déporté.
;
;------------------------------------------------------------------------------*
;
; Au bout d'un certain nombre d'alarme sonore (NB_ALARME = variable interne
; au programme) le montage fonctionne encore, mais n'active plus les
; relais fixe et clignotant. Le montage n'est donc plus sonore pour éviter
; de faire du bruit indéfiniment (le reste du montage et le relais
; temporisé fonctionne encore).
;
; Le relais temporisé (relais tempo.) sert à activer un magnétophone ou
; autre appareil enregistreur. Il est activé sur alarme pendant une période
; de TEMPO_REL_T minutes (typiquement 5 mn).
; (TEMPO_REL_T = variable interne au programme).
;
;
;------------------------------------------------------------------------------*
;
; Fonctionnement de cette alarme
;
; Mise sous tension de l'alarme
; On est en mode normal, le cavalier de test à + 5 Volts
;
; On passe en mode initialisation.
; Démarrage de la temporisation d'initialisation de l'alarme.
; - La led verte est allumée.
; - La led orange + buzzer clignotent, si la porte principale est ouverte.
; Allumé en continu si en plus la led rouge est allumée.
; - La led rouge est allumée, si un des contacts, boîtier, fenêtres ou
; portes (sauf porte principale) est ouverte.(c'est peut être un défaut).
; Au bout de TEMPO_INIT secondes, le montage passe en veille.
;
; On passe en mode veille.
; Les 3 leds s'éteignent.
; - S'il on ouvre la porte pripale, on passe en mode préalarme.
; - S'il on change l'état d'un contact autre que celui de la porte principale,
; (ouverture ou fermeture), on passe immédiatement en mode alarme.
; Sinon on boucle en mode veille.
;
;
; Ici on est en mode préalarme.
; - La led orange + buzzer clignotent.
; Allumé en continu si la led rouge est allumée.
; - s'il y a déjà eu une alarme, La led rouge s'allume. Ceci pour signaler que
; l'alarme à déjà fonctionnée, (intrusion ou faux contact).
; - S'il on change l'état d'un contact autre que celui de la porte principale,
; (ouverture ou fermeture), on passe immédiatement en mode alarme.
; - Au bout de TEMPO_PRE_ALA secondes, le montage passe automatiquement
; en mode alarme, (TEMPO_PRE_ALA = variable interne au programme).
; Sinon on boucle en mode préalarme.
;
;
; Ici on est en mode alarme.
; - On active les 3 relais.
; - Les 3 leds s'éteignent, (pour rester discret sur le panneau d'alarme).
; - S'il on change l'état un contact (ouvre ou ferme un contact),
; la tempo TEMPO_ALA est remise à zéro.
; - Au bout de TEMPO_ALA secondes, le montage repasse en mode veille,
; (TEMPO_ALA = variable interne au programme)
; Sinon on boucle en mode alarme.
; Le port RB4 est utilisé par l'interrupteur de test, car cette entrée consomme plus que les autres.
;
;------------------------------------------------------------------------------*
;
; Utilisation des broches du circuit :
; ____ _____
; contact porte principale RA2 [1 U 18] RA1 relais tempo
; contact porte 1 RA3 [2 17] RA0 relais clignotant
; contact entrée de test RA4/TOCKI [3 16] OSC1/CLKIN résonateur
; reset MCLR [4 PIC 15] OSC2/CLKOUT 32 kHz
; masse Masse [5 16] VDD +5 Volts
; contact porte 2 RB0/INT [6 16F84 13] RB7 relais fixe
; contact ouverture fenêtre 1 RB1 [7 12] RB6 led rouge
; contact ouverture fenêtre 2 RB2 [8 11] RB5 led orange
; contact ouverture boitier RB3 [9_______10] RB4 led verte
;
;------------------------------------------------------------------------------*
;
; Led verte :
; - Pendant la mise en route de l'alarme, cette led s'allume.
; La mise en route de l'alarme dure TEMPO_INIT secondes.
; - En mode veille, la led verte est éteinte.
; - En mode préalarme, la led verte est éteinte.
; - En mode alarme, la led vert est éteinte.
;
; Led orange + buzzer en parallèle :
; - Pendant la mise en route de l'alarme, si un la porte principale est
; ouverte, la led orange clignote, sinon elle reste éteinte.
; Allumé en continu si la led rouge est allumée.
; - En mode veille, la led orange est éteinte.
; - En mode préalarme, la led orange clignote.
; Allumé en continu si la led rouge est allumée.
; - En mode alarme, la led orange est éteinte.
;
; Led rouge :
; - Pendant la mise en route de l'alarme, si un des contacts, boîtier,
; fenêtres ou portes (sauf porte principale) est ouvert, cette led s'allume.
; - En mode veille cette led clignote faiblement (un bref flash toutes
; les secondes).
; - En mode préalarme, la led rouge s'allume s'il a déjà eu une alarme depuis
; la mise sous tension. (Intrusion ou faux contacts).
; - En mode alarme, la led rouge est éteinte.
;
;
; Entrée de test :
; Si cette entrée est au reliée à la masse, 0 volts (cavalier), on est en mode test.
; On passe donc dans une routine spéciale, si le cavalier RA[4] est positionné à +5V.
; Le programme reste en mode test indéfiniment, jusqu'au prochain reset.
; Dans cette séquence, on émet un certain nombre de bips buzzer à chaque
; ouverture ou fermeture de contact. Pas d'alarme sonore.
; De plus, la led verte s'allume si le contact est maintenant fermé,
; la led rouge s'allume si le contact est maintenant ouvert.
;
; Si l'on ferme ou ouvre la porte principale : 1 bip buzzer
; // la porte 1 : 2 bips buzzer
; // la porte 2 : 3 bips buzzer
; // la fenêtre 1 : 4 bips buzzer
; // la fenêtre 2 : 5 bips buzzer
; // le boîtier : 6 bips buzzer
;
; Contact porte principale :
; - En mode alarme, l'ouverture de la porte principale provoque
; l'état préalarme.
; Au bout de TEMPO_PRE_ALA secondes, l'alarme se met en route pendant
; TEMPO_ALA secondes.
;
; Contact ouverture boitier :
; - L'ouverture ou la fermeture du boitier met en route l'alarme immédiatement.
;
; Contact ouverture fenêtre 1 ou contact ouverture fenêtre 2 :
; - L'ouverture ou la fermeture d'une fenêtre met en route l'alarme immédiatement.
;
; Contact porte 1 ou contact porte 2 :
; - L'ouverture ou la fermeture d'une porte met en route l'alarme immédiatement.
;
; Relais fixe et relais clignotant :
; - Ces relais servent à activer une sirène et des avertisseurs lumineux.
; - Pendant la période d'alarme, les relais fixe et clignotant sont activés.
; - Le relais clignotant à une période de 2 secondes.
;
; Relais tempo :
; - Ce relais peut activer un magnétophone ou autre appareil enregistreur.
; - Pendant la période d'alarme, le relais temporisé est activé sur
; une période de TEMPO_REL_T minutes (typiquement 5 mn).
;
; Résonateur 32 kHz :
; - Résonateur faible consommation pour obtenir les temporisations souhaitées.
;
;**********************************************************************

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 (5 fois par défaut)
#define TEMPO_INIT .30 ; 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 .60 ; Durée d'activation de l'alarme en secondes (60 sec. par défaut)
#define TEMPO_REL_T .05 ; Durée d'activation du relais temporisé en minutes (5 par défaut)
; 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 PORTE_1 PORTA,3 ; Porte 1
#define MODE_TEST PORTA,4 ; 0 Volt = mode test
#define PORTE_2 PORTB,0 ; Porte 2
#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
ENDC ; Fin de la zone

;*********************************************************************
; DEMARRAGE SUR RESET *
;*********************************************************************
org 0x000 ; Adresse de départ après reset
goto Init ; Adresse 0 = saut vers Init.
org 0x004 ; Adresse de départ après interruption
goto Init ; Adresse 0 = saut vers Init.

;*********************************************************************
; 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
call Tempo05 ; On attend 0,5 secondes pour charger les capas d'entrée
btfss MODE_TEST ; Mode = mode test (par cavalier externe) ?
Goto Test1 ; oui
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.
;*********************************************************************

bsf LED_V ; Allume la led verte
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
btfss LED_R ; Si la led rouge est allumée, alors on
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 Demar5
bsf LED_R ; Portes1ou2,fenêtres ou boitier ouvert => On allume la led rouge
goto Demar6
Demar5 bcf LED_R ; Eteint la led rouge

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_V ; Eteint la led verte
bcf LED_O ; Eteint la led orange
bcf LED_R ; Eteint la led rouge
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 .24 ; 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 ?
bsf LED_R ; Si oui, allume la led rouge
call Lec_etat
andlw PFB
movwf Etat_in_PFB ; EtatRBBFP = état Boîtier,Fenêtres,Portes

Preala2 btfss LED_R ; Si la led rouge est allumée, alors on
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_V ; Eteint les 3 leds pour rester discret
bcf LED_O
bcf LED_R
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 .24 ; Cmptt1 compte les minutes
movwf Cmptt1
bsf REL_T ; Active le relais temporisé

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

;*********************************************************************
; PROGRAMME DE TEST *
;*********************************************************************
; On passe dans cette routine, si le cavalier RA[4] est positionné à 0V.
; Le programme reste indéfiniment en mode test, jusqu'au prochain reset.
; Dans cette séquence, on émet un certain nombre de bips buzzer à chaque
; ouverture ou fermeture de contact.
; De plus - si le contact est maintenant fermé, la led verte s'allume.
; - si le contact est maintenant ouvert, la led rouge s'allume.
;
; Si l'on ferme ou ouvre la porte principale : 1 bip buzzer
; // la porte 1 : 2 bips buzzer
; // la porte 2 : 3 bips buzzer
; // la fenêtre 1 : 4 bips buzzer
; // la fenêtre 2 : 5 bips buzzer
; // le boitier : 6 bips buzzer
;*********************************************************************

Test1 call Lec_etat
movwf Etat_in

Test2 call Lec_etat
movwf Etat_in2
xorwf Etat_in,w ; w = "00000010" si l'entrée X a bougé
btfsc STATUS,Z
goto Test2
;
; Si un contact est fermé alors ?
; Une entrée a bougé. Nbboucle = Nb de sonnerie à éffectuer.
; Exemple : W = "00000010" si l'entrée n°1 a bougé.
;
movwf Etat_in ; Etat_in = "00000010" si l'entrée n°2 a bougé
movfw Etat_in2
andwf Etat_in,w ; W = 0 ou <> 0 suivant l'état de l'entrée
btfsc STATUS,Z ; Contact fermé = Rb[x] ? : W = 0 ?
goto Test3
bsf LED_V ; Contact fermé : Allume la led verte
nop ; 'nop' entre 2 écritures successives
bcf LED_R ; Contact fermé : Eteint la led rouge
goto Test4
Test3 bcf LED_V ; Contact ouvert : Eteint la led verte
nop ; 'nop' entre 2 écritures successives
bsf LED_R ; Contact ouvert : Allume la led rouge

Test4 btfsc Etat_in,4
movlw .1 ; Porte principale ouverte? : Si oui, 1 boucle
btfsc Etat_in,5
movlw .2 ; Porte 1 ouverte ? : Si oui, 2 boucles
btfsc Etat_in,0
movlw .3 ; Porte 2 ouverte ? : Si oui, 3 boucles
btfsc Etat_in,1
movlw .4 ; Fenêtre 1 ouverte ? : Si oui, 4 boucles
btfsc Etat_in,2
movlw .5 ; Fenêtre 2 ouverte ? : Si oui, 5 boucles
btfsc Etat_in,3
movlw .6 ; Boîtier ouvert ? : Si oui, 6 boucles
movwf Nbboucle
goto Test6

Test5 call Tempo05
Test6 bsf LED_O ; Allume la led orange + buzzer
call Tempo05 ; pendant 0,5 seconde
bcf LED_O ; Eteint la led orange + buzzer
decfsz Nbboucle,f
goto Test5 ; Nbboucle <>0 Si oui, on reboucle en Test5
goto Test1

;*********************************************************************
; 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 = 500 milli secondes (0,5 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 .19 ; 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 .32 ; 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 .48 ; 500 ms = environ 48 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]

#10 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 20 juin 2008 - 11:54

se soir je n'ai pas le temps de regardé (en détails, le code), mais sur le plan algorithmique (bas niveau), la methode qui me semble la meilleur(a adapté selon le capteur, on vas dire ici que c'est une capteur tout ou rien qui lors qu'un choc crée une impulsion)
une méthode bourrin, c'est trois boucle incrusté les une dans les autres, ta première boucle qui répéteras pendant 30 seconde s'active lors d'une impulsion sur l'entrée du capteur, ensuite, elle met un temps d'attente (qui correspond au temps de retour a l'etas intiale du capteur) et continue a verifier a chaque tour de boucle l'etas du capteur, si il retrourne a l'etas haut, ton systeme saute dans une dexieme boucle, et sinon, il retourne a la permière boucle d'attente.
la deuxième boucle fonctionnerais selon le même principe, et "régréssant" d'une boucle toutes les trentes secondes, tu obtiendras le temps qu'il te faut

une methode un peu plus complexe a mettre en oeuvre car il faut géré une intéruption et une variable est la suivant:
plutot que de mettre plusieur boucle, tu en met une qui est là en permanance, mais qui regarde le capteur, lorsqu'elle detecte une impulsion, tu incrémente ta variable. tu met une interruption toutes les 30 secondes, qui décrémente la variable en question si elle n'est pas a 0. et tu declenche si la variable recoit une demande d'incrémentation alors qu'elle est egale a deux.

il y a d'autre methodes, mais ces deux la ne me semble pas trop mal. ensuite, tout depend de ton niveau pour reussir a les implémenté, si tu a des question précise (autre que, "qui pour codé le tout?") je serais ravis d'y repondre.

#11 Sink

Sink

    Nouveau membre

  • Membres
  • 30 messages

Posté 21 juin 2008 - 12:25

Tes idee sont bonne mais le pic doit pouvoir faire d'autre chose en meme temps et si tu l'enferme dans une boucle i ne fera que sa :)

A vrai dire ninos je prefererai presque re-ecrire le programme que de modifier celui la :(

#12 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 21 juin 2008 - 09:38

non, mais pour faire du semis temps réel il faut utilisé un RTOS, et puis, il peut mettre des routine dans sa boucle pour faire autre choses, ou programmé d'autre interruptions (enfin bon je sais pas si le pic en question en a assez).

il est vrais qu'il peut aussi mettre une interruption a chaque laps de temps inférieure au temps de retour du capteur, et a se moment la géré sa variable et d'éventuelles déclenchement(c'est sans doute d'ailleurs la meilleur méthode).

#13 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 21 juin 2008 - 12:00

webshinra , je n'ais pas les compétences pour cela.

Sink , réecrire le programme est une tres bonne solution , tu pourrais ?
si oui , tu as la configuration ds le programme (supprimer mode test)
pr ce qui est
des entrées/sorties , reserver le contact de choc sur RB3 par exemple (NO)
les autres portes garderons la configue anterieure (platine dejas faite)
merci

#14 Sink

Sink

    Nouveau membre

  • Membres
  • 30 messages

Posté 21 juin 2008 - 01:01

Tien essai sa normallement c'est bon du moin en simulation :D


; Programme de surveillance de contact pour alarme *

; *

; NOM: AL16F84.ASM *

; Date: 10/01/2008 *

; Version: 2.0 à contact NO pour une plus faible consommation. *

; Auteur: FF *

; *

; Les entrées sont toutes à contacts normalement ouverts pour *

; consommer moins. *

; *

; Il est possible que les entrées soient toutes à contacts *

; normalement fermés pour une consommation supérieure. Modifier *

; la variable TYPE_NO_NF. *

; *

; *

; Les temporisations sont données pour un résonateur à 32,768Khz. *

; Une instruction = 125 µ secondes. *

; Vive le logiciel libre de droit, de taxe, de drm,... *

; *

;---------------------------------------------------------------------*

; Fichier requis pour la compilation : P16F84.inc *

;---------------------------------------------------------------------*

;

; Les signalisations externe au boitier sont : Leds Verte, Orange+Buzzer en //, Rouge

;

; Indications en face avant, à la mise en route le montage :

; Led verte = Allumé le temps de sortir (variable TEMPO_INIT).

; Led orange + buzzer = Clignotent si la porte principale est ouverte (variable TEMPO_PREALA).

; = Allumé en continu si en plus la led rouge est allumée.

; Led rouge = Allumé si une un contact est actif. (défaut des boucles).

;

;

; Indications en face avant, à l'ouverture de la porte principale.

; Led verte = Eteinte.

; Led orange + buzzer = Clignotent pour avertissement avant alarme.

; = Allumé en continu si en plus la led rouge est allumée.

; Led rouge = Il y a déjà eu une alarme détectée.

;

; Indications en face avant, à l'ouverture d'un autre contact.

; Leds eteintes pour rester discret, pour éviter que l'on casse inutilement ce coffret déporté.

;

;------------------------------------------------------------------------------*

;

; Au bout d'un certain nombre d'alarme sonore (NB_ALARME = variable interne

; au programme) le montage fonctionne encore, mais n'active plus les

; relais fixe et clignotant. Le montage n'est donc plus sonore pour éviter

; de faire du bruit indéfiniment (le reste du montage et le relais

; temporisé fonctionne encore).

;

; Le relais temporisé (relais tempo.) sert à activer un magnétophone ou

; autre appareil enregistreur. Il est activé sur alarme pendant une période

; de TEMPO_REL_T minutes (typiquement 5 mn).

; (TEMPO_REL_T = variable interne au programme).

;

;

;------------------------------------------------------------------------------*

;

; Fonctionnement de cette alarme

;

; Mise sous tension de l'alarme

; On est en mode normal, le cavalier de test à + 5 Volts

;

; On passe en mode initialisation.

; Démarrage de la temporisation d'initialisation de l'alarme.

; - La led verte est allumée.

; - La led orange + buzzer clignotent, si la porte principale est ouverte.

; Allumé en continu si en plus la led rouge est allumée.

; - La led rouge est allumée, si un des contacts, boîtier, fenêtres ou

; portes (sauf porte principale) est ouverte.(c'est peut être un défaut).

; Au bout de TEMPO_INIT secondes, le montage passe en veille.

;

; On passe en mode veille.

; Les 3 leds s'éteignent.

; - S'il on ouvre la porte pripale, on passe en mode préalarme.

; - S'il on change l'état d'un contact autre que celui de la porte principale,

; (ouverture ou fermeture), on passe immédiatement en mode alarme.

; Sinon on boucle en mode veille.

;

;

; Ici on est en mode préalarme.

; - La led orange + buzzer clignotent.

; Allumé en continu si la led rouge est allumée.

; - s'il y a déjà eu une alarme, La led rouge s'allume. Ceci pour signaler que

; l'alarme à déjà fonctionnée, (intrusion ou faux contact).

; - S'il on change l'état d'un contact autre que celui de la porte principale,

; (ouverture ou fermeture), on passe immédiatement en mode alarme.

; - Au bout de TEMPO_PRE_ALA secondes, le montage passe automatiquement

; en mode alarme, (TEMPO_PRE_ALA = variable interne au programme).

; Sinon on boucle en mode préalarme.

;

;

; Ici on est en mode alarme.

; - On active les 3 relais.

; - Les 3 leds s'éteignent, (pour rester discret sur le panneau d'alarme).

; - S'il on change l'état un contact (ouvre ou ferme un contact),

; la tempo TEMPO_ALA est remise à zéro.

; - Au bout de TEMPO_ALA secondes, le montage repasse en mode veille,

; (TEMPO_ALA = variable interne au programme)

; Sinon on boucle en mode alarme.

; Le port RB4 est utilisé par l'interrupteur de test, car cette entrée consomme plus que les autres.

;

;------------------------------------------------------------------------------*

;

; Utilisation des broches du circuit :

; ____ _____

; contact porte principale RA2 [1 U 18] RA1 relais tempo

; contact porte 1 RA3 [2 17] RA0 relais clignotant

; contact entrée de test RA4/TOCKI [3 16] OSC1/CLKIN résonateur

; reset MCLR [4 PIC 15] OSC2/CLKOUT 32 kHz

; masse Masse [5 16] VDD +5 Volts

; contact porte 2 RB0/INT [6 16F84 13] RB7 relais fixe

; contact ouverture fenêtre 1 RB1 [7 12] RB6 led rouge

; contact ouverture fenêtre 2 RB2 [8 11] RB5 led orange

; contact ouverture boitier RB3 [9_______10] RB4 led verte

;

;------------------------------------------------------------------------------*

;

; Led verte :

; - Pendant la mise en route de l'alarme, cette led s'allume.

; La mise en route de l'alarme dure TEMPO_INIT secondes.

; - En mode veille, la led verte est éteinte.

; - En mode préalarme, la led verte est éteinte.

; - En mode alarme, la led vert est éteinte.

;

; Led orange + buzzer en parallèle :

; - Pendant la mise en route de l'alarme, si un la porte principale est

; ouverte, la led orange clignote, sinon elle reste éteinte.

; Allumé en continu si la led rouge est allumée.

; - En mode veille, la led orange est éteinte.

; - En mode préalarme, la led orange clignote.

; Allumé en continu si la led rouge est allumée.

; - En mode alarme, la led orange est éteinte.

;

; Led rouge :

; - Pendant la mise en route de l'alarme, si un des contacts, boîtier,

; fenêtres ou portes (sauf porte principale) est ouvert, cette led s'allume.

; - En mode veille cette led clignote faiblement (un bref flash toutes

; les secondes).

; - En mode préalarme, la led rouge s'allume s'il a déjà eu une alarme depuis

; la mise sous tension. (Intrusion ou faux contacts).

; - En mode alarme, la led rouge est éteinte.

;

;

; Entrée de test :

; Si cette entrée est au reliée à la masse, 0 volts (cavalier), on est en mode test.

; On passe donc dans une routine spéciale, si le cavalier RA[4] est positionné à +5V.

; Le programme reste en mode test indéfiniment, jusqu'au prochain reset.

; Dans cette séquence, on émet un certain nombre de bips buzzer à chaque

; ouverture ou fermeture de contact. Pas d'alarme sonore.

; De plus, la led verte s'allume si le contact est maintenant fermé,

; la led rouge s'allume si le contact est maintenant ouvert.

;

; Si l'on ferme ou ouvre la porte principale : 1 bip buzzer

; // la porte 1 : 2 bips buzzer

; // la porte 2 : 3 bips buzzer

; // la fenêtre 1 : 4 bips buzzer

; // la fenêtre 2 : 5 bips buzzer

; // le boîtier : 6 bips buzzer

;

; Contact porte principale :

; - En mode alarme, l'ouverture de la porte principale provoque

; l'état préalarme.

; Au bout de TEMPO_PRE_ALA secondes, l'alarme se met en route pendant

; TEMPO_ALA secondes.

;

; Contact ouverture boitier :

; - L'ouverture ou la fermeture du boitier met en route l'alarme immédiatement.

;

; Contact ouverture fenêtre 1 ou contact ouverture fenêtre 2 :

; - L'ouverture ou la fermeture d'une fenêtre met en route l'alarme immédiatement.

;

; Contact porte 1 ou contact porte 2 :

; - L'ouverture ou la fermeture d'une porte met en route l'alarme immédiatement.

;

; Relais fixe et relais clignotant :

; - Ces relais servent à activer une sirène et des avertisseurs lumineux.

; - Pendant la période d'alarme, les relais fixe et clignotant sont activés.

; - Le relais clignotant à une période de 2 secondes.

;

; Relais tempo :

; - Ce relais peut activer un magnétophone ou autre appareil enregistreur.

; - Pendant la période d'alarme, le relais temporisé est activé sur

; une période de TEMPO_REL_T minutes (typiquement 5 mn).

;

; Résonateur 32 kHz :

; - Résonateur faible consommation pour obtenir les temporisations souhaitées.

;

;**********************************************************************



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'00A0' ; Interruptions tmro





;*********************************************************************

; DEFINITIONS *

;*********************************************************************

#define NB_MAX_ALA .05 ; Nombre maximum d'alarmes sonores (5 fois par défaut)

#define TEMPO_INIT .30 ; 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 .60 ; Durée d'activation de l'alarme en secondes (60 sec. par défaut)

#define TEMPO_REL_T .05 ; Durée d'activation du relais temporisé en minutes (5 par défaut)

; en plus de la durée TEMPO_ALA.

#define TYPE_NO_NF 0x00 ; 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 PORTE_1 PORTA,3 ; Porte 1

#define MODE_TEST PORTA,4 ; 0 Volt = mode test

#define PORTE_2 PORTB,0 ; Porte 2

#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

cmptmr0 : 1 ; compteur tmr0

cmptmr02 : 1 ; compteur tmr0

w_temp : 1

status_temp : 1

cmpt_boitier : 1

flag_entree : 1

ENDC ; Fin de la zone



;*********************************************************************

; DEMARRAGE SUR RESET *

;*********************************************************************

org 0x000 ; Adresse de départ après reset

goto Init ; Adresse 0 = saut vers Init.



;**********************************************************************

; ROUTINE INTERRUPTION *

;**********************************************************************



;sauvegarder registres

;---------------------

org 0x004 ; adresse d'interruption

movwf w_temp ; sauver registre W

swapf STATUS,w ; swap status avec résultat dans w

movwf status_temp ; sauver status swappé





btfss INTCON,T0IF ; tester si interrupt timer en cours

goto restorereg ; non test suivant

call inttimer ; oui, traiter interrupt timer

movlw 0x08 ; recharge cmptmr0

movwf cmptmr0 ; valeur cmpt0

bcf INTCON,T0IF ; effacer flag interrupt timer et fin d'interruption





;restaurer registres

;-------------------

restorereg

swapf status_temp,w ; swap ancien status, résultat dans w

movwf STATUS ; restaurer status

swapf w_temp,f ; Inversion L et H de l'ancien W

; sans modifier Z

swapf w_temp,w ; Réinversion de L et H dans W

; W restauré sans modifier status

retfie ; return from interrupt



;**********************************************************************

; INTERRUPTION TIMER 0 *

;**********************************************************************

inttimer



decfsz cmptmr0,f ; décrémenter compteur de passages

return ; pas 0, on ne fait rien

decfsz cmptmr02,f ; décrémenter deuxieme compteur

return ; pas 0, on ne fait rien

movf cmpt_boitier , f

btfss STATUS , Z

decf cmpt_boitier ; efface cmpt

movlw 0x75

movwf cmptmr02 ; valeur cmpt02

return ; fin d'interruption timer



;*********************************************************************

; 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

call Tempo05 ; On attend 0,5 secondes pour charger les capas d'entrée

btfss MODE_TEST ; Mode = mode test (par cavalier externe) ?

Goto Test1 ; oui

clrf Cmptt1

clrf cmpt_boitier

clrf flag_entree

bsf flag_entree , 0

movlw TEMPO_REL_T

movwf Cmptt2

movlw NB_MAX_ALA

movwf Nbalarme ; Maximum d'alarmes sonores = NB_MAX_ALA

movlw 0x08

movwf cmptmr0 ; valeur cmpt0

movlw 0x75

movwf cmptmr02 ; valeur cmpt02



;*********************************************************************

; PROGRAMME INITIAL, TEMPORISATION POUR SORTIR *

;*********************************************************************

; On passe dans cette routine si le cavalier RA[4] est positionné à +5V.

;*********************************************************************



bsf LED_V ; Allume la led verte

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

btfss LED_R ; Si la led rouge est allumée, alors on

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 Demar5

bsf LED_R ; Portes1ou2,fenêtres ou boitier ouvert => On allume la led rouge

goto Demar6

Demar5 bcf LED_R ; Eteint la led rouge



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_V ; Eteint la led verte

bcf LED_O ; Eteint la led orange

bcf LED_R ; Eteint la led rouge

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 0x08

btfss STATUS , Z

goto suite2

btfsc flag_entree , 0

goto suite

bsf Sauvew , 3

bsf flag_entree , 0

incf cmpt_boitier , f

movf cmpt_boitier , w

addlw -.3

btfsc STATUS , Z

bcf Sauvew , 3

goto suite3



suite2

bcf flag_entree , 0

suite

bsf Sauvew , 3

suite3

bsf Etat_in_PFB , 3 ; deja pris en compte plus haut

movfw 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 .24 ; 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 ?

bsf LED_R ; Si oui, allume la led rouge

call Lec_etat

andlw PFB

movwf Etat_in_PFB ; EtatRBBFP = état Boîtier,Fenêtres,Portes



Preala2 btfss LED_R ; Si la led rouge est allumée, alors on

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_V ; Eteint les 3 leds pour rester discret

bcf LED_O

bcf LED_R

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 .24 ; Cmptt1 compte les minutes

movwf Cmptt1

bsf REL_T ; Active le relais temporisé



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



;*********************************************************************

; PROGRAMME DE TEST *

;*********************************************************************

; On passe dans cette routine, si le cavalier RA[4] est positionné à 0V.

; Le programme reste indéfiniment en mode test, jusqu'au prochain reset.

; Dans cette séquence, on émet un certain nombre de bips buzzer à chaque

; ouverture ou fermeture de contact.

; De plus - si le contact est maintenant fermé, la led verte s'allume.

; - si le contact est maintenant ouvert, la led rouge s'allume.

;

; Si l'on ferme ou ouvre la porte principale : 1 bip buzzer

; // la porte 1 : 2 bips buzzer

; // la porte 2 : 3 bips buzzer

; // la fenêtre 1 : 4 bips buzzer

; // la fenêtre 2 : 5 bips buzzer

; // le boitier : 6 bips buzzer

;*********************************************************************



Test1 call Lec_etat

movwf Etat_in



Test2 call Lec_etat

movwf Etat_in2

xorwf Etat_in,w ; w = "00000010" si l'entrée X a bougé

btfsc STATUS,Z

goto Test2

;

; Si un contact est fermé alors ?

; Une entrée a bougé. Nbboucle = Nb de sonnerie à éffectuer.

; Exemple : W = "00000010" si l'entrée n°1 a bougé.

;

movwf Etat_in ; Etat_in = "00000010" si l'entrée n°2 a bougé

movfw Etat_in2

andwf Etat_in,w ; W = 0 ou <> 0 suivant l'état de l'entrée

btfsc STATUS,Z ; Contact fermé = Rb[x] ? : W = 0 ?

goto Test3

bsf LED_V ; Contact fermé : Allume la led verte

nop ; 'nop' entre 2 écritures successives

bcf LED_R ; Contact fermé : Eteint la led rouge

goto Test4

Test3 bcf LED_V ; Contact ouvert : Eteint la led verte

nop ; 'nop' entre 2 écritures successives

bsf LED_R ; Contact ouvert : Allume la led rouge



Test4 btfsc Etat_in,4

movlw .1 ; Porte principale ouverte? : Si oui, 1 boucle

btfsc Etat_in,5

movlw .2 ; Porte 1 ouverte ? : Si oui, 2 boucles

btfsc Etat_in,0

movlw .3 ; Porte 2 ouverte ? : Si oui, 3 boucles

btfsc Etat_in,1

movlw .4 ; Fenêtre 1 ouverte ? : Si oui, 4 boucles

btfsc Etat_in,2

movlw .5 ; Fenêtre 2 ouverte ? : Si oui, 5 boucles

btfsc Etat_in,3

movlw .6 ; Boîtier ouvert ? : Si oui, 6 boucles

movwf Nbboucle

goto Test6



Test5 call Tempo05

Test6 bsf LED_O ; Allume la led orange + buzzer

call Tempo05 ; pendant 0,5 seconde

bcf LED_O ; Eteint la led orange + buzzer

decfsz Nbboucle,f

goto Test5 ; Nbboucle <>0 Si oui, on reboucle en Test5

goto Test1



;*********************************************************************

; 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 = 500 milli secondes (0,5 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 .19 ; 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 .32 ; 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 .48 ; 500 ms = environ 48 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

iorwf Cmpt1,w ; w = 00XX XXXX = état des entrées

xorlw TYPE_NO_NF

return



END[/code]

Sa serai possible d'avoir l'etat par defaut des capteur

#15 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 21 juin 2008 - 01:30

ts les contacts sont NF sauf le contact de choc sur RB3 qui est en NO

ps; j'ais des difficultées a copier collé ton fichier asm....ne passe pas
sur mplab ? syntaxe problématique sur le forum ? ou ?...

#16 Sink

Sink

    Nouveau membre

  • Membres
  • 30 messages

Posté 21 juin 2008 - 01:34

essai avec le lien alors

http://www.betterupload.com/fr/351958

et sinon l'etat ces 0 ou 1 en entree :)

#17 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 21 juin 2008 - 01:42

oups..tu as été plus rapide que moi
voila le message d'erreure sur l'asm pris sur le post.
http://www.monsterup.com/image.php?url=upload/1214051776.jpg

j'essaie avec le lien et te tiens au courant de suite

voila le schéma que j'ais adapté

shema (NB pour les entrées ...masse )
http://www.monsterup.com/image.php?url=upload/1214051953.jpg

#18 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 21 juin 2008 - 01:50


avec ce fichier (telecharger) erreure 305 et 173 ds mplab ?

#19 Sink

Sink

    Nouveau membre

  • Membres
  • 30 messages

Posté 21 juin 2008 - 02:20

et a dise quoi les erreur

#20 polux

polux

    Nouveau membre

  • Membres
  • 33 messages

Posté 21 juin 2008 - 02:25

gros probléme avec mplab8 il me semble , peut etre que ton fichier fonctionne
car j'ais les memes erreures avec un asm qui lui etait bon y'a quelques temps..?
je désinstal mplab8 et je vais réinstaller une vielle version
tes simulations sont bonnes ?
j'te tiens au courant
tu en as tenu compte pr les contacts NF sur le fichier que tu me propose ?
merci



Répondre à ce sujet



  


1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users