begin process at 2012 05 25 06:04:07
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 11 janvier 2011 à 18:33:09 | comment adapter un .asm de 16F84A sur un 16F628A

dox59

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 <p16F628A.inc>
__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 <p16F84.inc> ; 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
    mercredi 12 janvier 2011 à 19:50:36 | Re : comment adapter un .asm de 16F84A sur un 16F628A

    dox59

    Toujours personne pour m aider a mon probleme
    dimanche 16 janvier 2011 à 14:00:31 | Re : comment adapter un .asm de 16F84A sur un 16F628A


    Cette discussion est classée dans : port, tempo, led, porte, alarme


    Répondre à ce message

    Sujets en rapport avec ce message

    piloter port serie sous VCpp [ par orchis ] Bjr a tous, je voudrais pouvoir controler le port serie de mon PC sous VCpp.pourriez vous m'aider ?merci d'avance !c Urgent !! 512 bps port serial [ par abarbu ] est il possible sous Windows (9x ou XP) que je programme le 8253 timer pour obtenir 512 Hz e user ce frequence pour le port serialle (RS232) ?Sous DO problème avec le port 0x60 qui fait des faire des beeps [ par prunkdump ] voilà lorsque j'utilise le port I\O 0x60 pour voir l'etat du clavier d'abord tout fonctionne bien puis au bout d'un moment le pc fait des beeps, comme liaison rs232 avec pic16f84a [ par Lastar ] Bonjour à tous, voila je voudrais allumer et éteindre une led à partir du clavier d'un PC. J'ai donc pour cela mis un MAX232CPE avec le pic. Le prob Creation commande port série [ par hypotamtam ] Bonjours, je suis novice dans l'electronique et je voudrais savoir si quelqu'un pourrais m'aide ou me donner des liens internet.Je souhaiterai juste s Afficheur à l'aide de LED pour PIC16F84 [ par Terry911 ] HelloJe suis étudiant et je débute dans la programmation de PIC. J'ai reçu comme projet pour la fin de cette année scolaire-ci, de réaliser un affiche help me [ par theyoupione ] j'ai écri un ptit prog dont voici un extrait permettant d'envoyer un octet vers liaison série mais j'ai un pb lors de la compilation avec mplabl'erreu Help! port série/clavier [ par projectman ] Voilà je dois réaliser un driver claiver pour pc en C++ et je ne sais pas trop comment faire et surtout par où commencer.Donc je dispose d'un clavier problème gestion port serie [ par chfauve59 ] Bonjour, j'aimerai savoir comment faire pour géré le port série sous windows NT avec Builder ou VC++ sans avoir a utiliser les commandes API de window Port serie et parallele // Portail electrique [ par sayone ] Salut a tous,Je suis etudiant en electronique et kom je ne mi conné pa tro sur les portails electriques j'orai aimé savoir si il été possible de branc


    Nos sponsors


    Sondage...

    CalendriCode

    Mai 2012
    LMMJVSD
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   

    Consulter la suite du CalendriCode

    A découvrir



     
    Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
    CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
    CodeS-SourceS.com© est une marque déposée tous droits réservés

    Google Coop CodeS-SourceS Google Coop CodeS-SourceS
    Temps d'éxécution de la page : 0,374 sec (4)

    Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales