Comment adapter un .asm de 16F84A sur un 16F628A

dox59 Messages postés 3 Date d'inscription jeudi 29 octobre 2009 Statut Membre Dernière intervention 16 janvier 2011 - 11 janv. 2011 à 18:33
dox59 Messages postés 3 Date d'inscription jeudi 29 octobre 2009 Statut Membre Dernière intervention 16 janvier 2011 - 16 janv. 2011 à 14:00
Bonjour à tous
quelqu'un aurait-il une idée ?
Je voudrais adapter un .asm de 16F84A qui fonctionne très bien, sur un 16F628A plus abordable.
Pour commencer j'ai modifié à voir les trois fonctionnalités qui diffère soit disant :
en 1>
LIST p=16F628A
#include
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_OFF & _LP_OSC
en 2>
CBLOCK 0x20 ; début de la zone variable pour le 16f628A (16f84A 0x00C)
en 3>
movlw 0x07
movlw CMCON ; on désactive les comparateurs

mais MPLAB IDEv8.6 me déclare qu'il y a des erreurs:

Error[118] D:\X\X\AL16F628A.ASM 86 : Overwriting previous address contents (0000)


le problème vient-il de org 0x000 ; Adresse de départ après reset

que doige faire ? Merci d'avance.

***voici le programme 16F84A***[*] [*] [list]

;**********************************************************************
; Programme de surveillance de contact pour alarme 16f84
;---------------------------------------------------------------------*
;
;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 (15 secondes).
; Led orange + buzzer = Clignotent si la porte principale est ouverte.
; = Allumé en continu si en plus la led rouge est allumée.
; Led rouge = Allumé si un contact est mal fermé. (défaut).
;
;
; 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.
;
;------------------------------------------------------------------------------*
;
; 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 TEPO_REL_T * 30 secondes (typiquement 5 mn).
; (TEPO_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 est à + 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 principale, 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, (TEPO_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,
; (TEPO_ALA = variable interne au programme)
; Sinon on boucle en mode alarme.
;
;------------------------------------------------------------------------------*
;
; Utilisation des broches du circuit :
;
; led rouge RA2 <1 18> RA1 led orange
; relais tempo. RA3 <2 17> RA0 led verte
; entrée de test RA4/TOCKI <3 16> OSC1/CLKIN résonateur
; MCLR <4 PIC 15> OSC2/CLKOUT 32 kHz
; Masse <5 16 VDD (+ 2 à 5 Volts)
; contact porte principale RB0/INT <6 16F84 13> RB7 relais clignotant
; contact ouverture coffret RB1 <7 12> RB6 relais fixe
; contact ouverture fenêtre 1 RB2 <8 11> RB5 contact porte 1
; contact ouverture fenêtre 2 RB3 <9 10> RB4 contact porte 2
;
;------------------------------------------------------------------------------*
;
; 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.
; 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
; // le boîtier : 2 bips buzzer
; // la fenêtre 1 : 3 bips buzzer
; // la fenêtre 2 : 4 bips buzzer
; // la porte 1 : 5 bips buzzer
; // la porte 2 : 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 coffret :
; - L'ouverture ou la fermeture du coffret 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 TEPO_REL_T * 30 secondes (typiquement 5 mn).
;
; Résonateur 32 kHz :
; - Résonateur faible consommation pour obtenir les temporisations souhaitées.
; Les temporisations sont données pour un résonateur à 32Khz.
; Une instruction = 125 µ secondes.
;
;*********************************************************************


LIST p=16F84 ; Définition de processeur
#include ; Définitions des variables

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _LP_OSC
ERRORLEVEL -302

;---------------------------------------------------------------------
; '__CONFIG' précise les 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'000F' ; Valeur registre option
; Résistance pull-up ON
; Préscaler wdt à 128

;*********************************************************************
; DEFINITIONS *
;*********************************************************************

#define NB_MAX_ALA .5 ; Nombre maximum d'alarmes sonores
#define TEMPO_INIT .20 ; Tempo de mise en route en secondes
#define TEMPO_PREALA .15 ; Tempo de préalarme avant alarme en secondes
#define TEMPO_ALA .30 ; Tempo d'activation de l'alarme en secondes
#define TEMPO_REL_T .2 ; Tempo du relais temporisé en 1/2 minutes
; (exemple .10 = 5 minutes)
#define PORT_LEDS PORTA ; Port des leds V, O+buzzer, R
#define PORT_SURV PORTB ; Port des contacts à surveiller
#define PORT_RELT PORTA ; Port du relais temporisé
#define PORT_REL_FC PORTB ; Port des relais fixe et clignotant

#define BIT_LED_V 0x01 ; Bit de sortie de la led verte
#define BIT_LED_O 0x02 ; Bit de sortie de la led orange + buzzer
#define BIT_LED_R 0x04 ; Bit de sortie de la led rouge
#define BIT_REL_T 0x08 ; Bit de sortie du relais temporisé
#define BIT_REL_F 0x40 ; Bit de sortie du relais fixe
#define BIT_REL_C 0x80 ; Bit de sortie du relais clignotant

#define LED_V PORTA,0 ; Led verte
#define LED_O PORTA,1 ; Led orange + buzzer
#define LED_R PORTA,2 ; Led rouge
#define REL_T PORTA,3 ; Relais Temporisé
#define MODE_TEST PORTA,4 ; + 5 Volts = mode test

#define PORTE_P PORTB,0 ; Porte principale
#define BOITIER PORTB,1 ; Boîtier
#define FENETRE_1 PORTB,2 ; Fenêtre 1
#define FENETRE_2 PORTB,3 ; Fenêtre 2
#define PORTE_1 PORTB,4 ; Porte 1
#define PORTE_2 PORTB,5 ; Porte 2
#define REL_F PORTB,6 ; Relais fixe
#define REL_C PORTB,7 ; Relais clignotant

#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
EtatRB : 1 ; Etat des entrées du port B
EtatRBPP : 1 ; Etat des entrées du port B,Porte Principale
EtatRBBFP : 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 *
;*********************************************************************
; Port RA[0] = Out = Led verte de mise sous tension.
; Port RA[1] = Out = Led orange+ buzzer de pré-alarme.
; Port RA[2] = Out = Led rouge de témoin de fonctionnement, et
; alarme ayant déjà fonctionnée.
; Port RA[3] = Out = Relais temporisé.
; Port RA[4] = In = + 5 volts si test.
;
; Port RB[0] = In = Contact porte principale, al.temporisée.
; Port RB[1] = In = Contact ouverture coffret, al.immédiate
; Port RB[2] = In = Contact ouverture fenêtre 1, al.immédiate
; Port RB[3] = In = Contact ouverture fenêtre 2, al.immédiate
; Port RB[4] = In = Contact ouverture porte 1, al.immédiate
; Port RB[5] = In = Contact ouverture porte 2, al.immédiate
; Port RB[6] = Out = Relais fixe.
; Port RB[7] = Out = Relais clignotant (2 Hz).
;*********************************************************************

Init Page0 ; Sélectionner banque 0
clrf PORT_LEDS ; Sorties portA à 0
clrf PORT_REL_FC ; Sorties portB à 0
clrf EEADR ; Permet de diminuer la consommation
movlw OPTIONVAL ; Charger masque
movwf OPTION_REG ; Initialiser registre option
Page1 ; Sélectionner banque 1
movlw b'00010000' ; Port A : Bit 4 en entrées
movwf TRISA
movlw b'00111111' ; Port B : Bits 0 à 5 en entrées
movwf TRISB
Page0 ; Sélectionner banque 0

btfss MODE_TEST ; Mode = mode test (par cavalier externe) ?
Goto Test1 ; oui
clrf Cmptenv
clrf Cmptt1
clrf 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é à +0V. *
;*****************************************************************************

bsf LED_V ; Allume la led verte
movlw TEMPO_INIT
addlw TEMPO_INIT
movwf Tempo ; Tempo = 2 * TEMPO_INIT, car 0,5 sec / boucle

Dem1 btfss PORTE_P ; Porte principale ouverte ?
goto Dem2

btfss LED_R ; Si la led rouge est allumée, alors on
goto Dem11 ; allume la led orange+buzzer en continu
bsf LED_O
goto Dem3

Dem11 movlw BIT_LED_O ; Si oui, on change d'état led orange
xorwf PORT_LEDS,f
goto Dem3

Dem2 bcf LED_O ; Si non, on éteint la led orange

Dem3 movlw .90
movwf Cmpt2

Dem4 btfsc BOITIER ; Boîtier ouvert ?
goto Dem5 ; oui
btfsc FENETRE_1 ; Fenêtre 1 ouverte ?
goto Dem5 ; oui
btfsc FENETRE_2 ; Fenêtre 2 ouverte ?
goto Dem5 ; oui
btfsc PORTE_1 ; Porte 1 ouverte ?
Goto Dem5 ; oui
btfsc PORTE_2 ; Porte 2 ouverte ?
goto Dem5 ; oui
bcf LED_R ; Eteint la led rouge
goto Dem6

Dem5 bsf LED_R ; Allume la led rouge
goto Dem7

Dem6 bcf LED_R ; Eteint la led rouge

Dem7 call Tempo0004
decfsz Cmpt2,f
goto Dem4

decfsz Tempo,f
goto Dem1

;****************************************************************************
; BOUCLE DE VEILLE *
;****************************************************************************
; On attend un changement d'état des contacts. *
;****************************************************************************

Enveille1 movlw BIT_REL_T ; Ne change pas l'état du relais temporisé
andwf PORT_LEDS,f ; Eteint les trois leds
movfw PORT_REL_FC
andlw b'00111111'
movwf PORT_REL_FC ; Arrête les relais fixe et clignotant

movfw PORT_SURV
movwf EtatRB ; Initialise EtatRB = état du port B
movwf EtatRBPP
movwf EtatRBBFP

movlw 0x01
andwf EtatRBPP,f ; EtatRBPP = état Porte Principale
movlw 0x3E
andwf EtatRBBFP,f ; EtatRBBFP = état Boîtier,Fenêtres,Portes

Enveille2 movfw PORT_SURV
movwf Sauvew
andlw 0x3E
xorwf EtatRBBFP,w ; = "00000010" si l'entrée n°2 a bougé
btfss STATUS,Z
goto Alarme1 ; Va directement en séquence alarme

movfw Sauvew
andlw 0x01
xorwf EtatRBPP,w ; = "00000001" si la porte principale a bougé
btfss STATUS,Z
goto Preala1 ; Va en séquence pré-alarme

incfsz Cmptenv,f ; Pour faire clignoter faiblement la led rouge
goto Enveille4

;****************************************************************************
; On passe ici une fois toute les secondes (256 * 4 ms). *
;****************************************************************************

btfss REL_T ; Relais temporisé actif ?
goto Enveille3 ; oui
decfsz Cmptt1,f
goto Enveille3
decfsz Cmptt2,f
bcf REL_T ; arrête le relais temporisé.
movlw .30 ; Cmptt1 compte les 1/2 minutes
movwf Cmptt1

Enveille3 bsf LED_R ; Allume la led rouge 1 fois sur 255
nop
bcf LED_R ; Eteint la led rouge

Enveille4 call Tempo0004 ; Tempo de 4 ms
goto Enveille2

;****************************************************************************
; 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
movfw PORT_SURV
andlw 0x3E
movwf EtatRBBFP ; 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 .118 ; 0,5 sec. = 118 * 4 ms
movwf Nbboucle

Preala3 call Tempo0004 ; On boucle "Nbboucle" fois 4 milli sec.
movfw PORT_SURV
andlw 0x3E
xorwf EtatRBBFP,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 movlw BIT_REL_T ; Eteint les trois leds mais pas le
andwf PORT_LEDS,f ; le relais temporisé
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
movfw PORT_REL_FC
iorlw b'11000000'
movwf PORT_REL_FC ; Active les relais d'alarme

Alarme2 movlw TEMPO_REL_T ; Active la temporisation du relais
movwf Cmptt2 ; temporisé.
movlw .30 ; Cmptt1 compte les 1/2 minutes
movwf Cmptt1
bsf REL_T ; Active le relais temporisé
movfw PORT_SURV ; Initialise EtatRB = état du port B
andlw 0X3F
movwf EtatRB

Alarme3 movf PORT_SURV,w
andlw 0x3F
xorwf EtatRB,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_FC,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 Enveille1 ; Si oui, retour directement en veille

decf Nbalarme,f
movfw PORT_REL_FC ; Active les relais d'alarme
andlw b'00111111'
movwf PORT_REL_FC ; Arrêt du relais fixe et clignotant
goto Enveille1

;****************************************************************************
; PROGRAMME DE TEST *
;****************************************************************************
; On passe dans cette routine, 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. *
; 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 *
; // le boitier : 2 bips buzzer *
; // la fenêtre 1 : 3 bips buzzer *
; // la fenêtre 2 : 4 bips buzzer *
; // la porte 1 : 5 bips buzzer *
; // la porte 2 : 6 bips buzzer *
;****************************************************************************

Test1 movfw PORT_SURV ; Initialise EtatRB = Etat du port RB
andlw 0X3F
movwf EtatRB

Test2 movfw PORT_SURV
andlw 0x3F
xorwf EtatRB,w ; EtatRB = "00000010" si l'entrée n°2 a bougé
btfsc STATUS,Z
goto Test2

;****************************************************************************
; Si un contact est fermé alors RB[x] = 0. *
; Une entrée a bougé. Nbboucle = Nb de sonnerie à éffectuer. *
; Exemple : W = "00000010" si l'entrée n°1 a bougé. *
;****************************************************************************

movwf EtatRB ; EtatRB = "00000010" si l'entrée n°2 a bougé
movfw PORT_SURV
andlw 0x3F ; W = "00----X-" suivant état de l'entrée
andwf EtatRB,w ; W = 0 ou <> 0 suivant l'état de l'entrée
btfss 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 EtatRB,0
movlw .1 ; Porte principale ouverte? : Si oui, 1 boucle
btfsc EtatRB,1
movlw .2 ; Boîtier ouvert ? : Si oui, 2 boucles
btfsc EtatRB,2
movlw .3 ; Fenêtre 1 ouverte ? : Si oui, 3 boucles
btfsc EtatRB,3
movlw .4 ; Fenêtre 2 ouverte ? : Si oui, 4 boucles
btfsc EtatRB,4
movlw .5 ; Porte 1 ouverte ? : Si oui, 5 boucles
btfsc EtatRB,5
movlw .6 ; Porte 2 ouverte ? : Si oui, 6 boucles
movwf Nbboucle
goto Test6

Test5 call Tempo03

Test6 bsf LED_O ; Allume la led orange + buzzer
call Tempo03 ; pendant 0,3 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. *
; Tempo05 = 500 milli secondes (0.5 sec.). *
; *
; Elles ne reçoivent aucun paramètre et n'en retourne aucun. *
;---------------------------------------------------------------------------*

Tempo0004 movlw .8 ; 4 ms 8 boucles à Horloge 32Khz
movwf Cmpt1 ; effacer compteur1
Boucle41 nop ; perdre 1 cycle
decfsz Cmpt1,f ; décrémenter compteur1
goto Boucle41 ; si pas 0, boucler
return

Tempo03 movlw .70 ; pour 70*15 boucles
goto TempoIn ;

Tempo05 movlw .118 ; pour 118*15 boucles
TempoIn movwf Cmpt2 ; initialiser compteur 2
Boucle51 movlw .8 ; 4 ms 8 boucles à Horloge 32Khz
movwf Cmpt1 ; effacer compteur1
Boucle52 nop ; perdre 1 cycle
decfsz Cmpt1,f ; décrémenter compteur1
goto Boucle52 ; si pas 0, boucler
decfsz Cmpt2,f ; si 0, décrémenter compteur 2
goto Boucle51 ; si cmpt2 pas 0, recommencer Boucle51
return ; retour de la sous-routine

END
A voir également:

2 réponses

dox59 Messages postés 3 Date d'inscription jeudi 29 octobre 2009 Statut Membre Dernière intervention 16 janvier 2011
12 janv. 2011 à 19:50
Toujours personne pour m aider a mon probleme
0
dox59 Messages postés 3 Date d'inscription jeudi 29 octobre 2009 Statut Membre Dernière intervention 16 janvier 2011
16 janv. 2011 à 14:00
[^^sad1]
0
Rejoignez-nous