السلام عليكم و رحمة الله و بركته
اولا اشكر جميع المهندسين في هذا السرح العظيم على كل الجهود التي يقدمونها لخدمة الاعضاء
كما هو موضح في العنوان اريد عمل télérupteur اي اني اريد التحكم في مصباح واحد عن طريق عدة ازرار بحيث كلما اضغط زر ينطفيئ اذا كان مشتعل و يشتعل اذا كان منطفيئ
الادوات المستعملة
pic16f84a
mikroc
ارجو ان تكون الصورة واضحة
كما اني اتمنى ان تكون مساعدة حتى لو كانت تلميحا او تمهيد لاكمال البرنامج
للعلم لديا سورس بالاسمبلي لكيني لم افهمه جيدا
ملف
protues+HEX
http://www.mediafire.com/download/r3...3e/Desktop.rar
وشكرا مسبقا
كود:
; "Télérupteur"
; Fabrice Sincère (C) novembre 2006
; version 1.03
; microcontrôleur PIC 16F84A
; développé avec Microchip MPLAB IDE
List p=16F84A ; processeur utilisé
#include <p16F84A.inc>
__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;bits de configuration :
;code protect OFF
;watchdog timer OFF
;power up timer ON
;oscillateur HS (quartz à grande fréquence : 20 MHz)
;xxxxxx
; macro
;xxxxxx
bank1 macro ; passage en banque 1
bsf STATUS,RP0
endm
bank0 macro ; passage en banque 0
bcf STATUS,RP0
endm
;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx
CBLOCK H'00C' ; début de la zone des registres d'usage général
mem0 : 1 ; mémorisation de l'état du port B (état antérieur)
mem1 : 1 ; mémorisation de l'état du port B (état actuel)
detection : 1 ; détection d'un front descendant (bouton poussoir appuyé)
compteur1 : 1 ; variable de le boucle de temporisation
compteur2 : 1 ; variable de le boucle de temporisation
compteur3 : 1 ; variable de le boucle de temporisation
ENDC
;xxxxxxxxxxxxxxxxxxxx
; demarrage sur reset
;xxxxxxxxxxxxxxxxxxxx
org H'0000'
goto initialisation
;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx
initialisation
bank0
clrf PORTA ; mise à 0 des sorties du port A
clrf PORTB ; mise à 0 des sorties du port B
bank1
movlw B'00000000'
movwf OPTION_REG
; bit 7 = 0 : activation des résistances de pull-up du port B
; (cela permet de faire l'économie de 8 résistances externes)
; bits 0 à 6 : ici, options non utilisées (on les met à 0, par exemple)
movlw B'00011110'
movwf TRISA
; bit 0 du port A (RA0) = 0 : configuration en sortie (commande du relais).
; bits 1 à 4 du port A (RA1 à RA4) = 1 : non utilisées
; (configuration en entrées, par exemple)
movlw B'11111111'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton poussoir 0)
; bit 1 du port B (RB1) = 1 : configuration en entrée (bouton poussoir 1)
; bit 2 du port B (RB2) = 1 : configuration en entrée (bouton poussoir 2)
; bit 3 du port B (RB3) = 1 : configuration en entrée (bouton poussoir 3)
; bit 4 du port B (RB4) = 1 : configuration en entrée (bouton poussoir 4)
; bit 5 du port B (RB5) = 1 : configuration en entrée (bouton poussoir 5)
; bit 6 du port B (RB6) = 1 : configuration en entrée (bouton poussoir 6)
; bit 7 du port B (RB7) = 1 : configuration en entrée (bouton poussoir 7)
bank0
movlw B'00000000'
movwf PORTA ; sortie RA0 au niveau bas
movlw B'11111111'
movwf mem1 ; initialisation mem1
;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx
debut_programme
movf mem1, W
movwf mem0 ; copie de (mem1) dans (mem0)
movf PORTB, W ; lecture du port B
movwf mem1 ; mémorisation
; test de l'état du port B :
movf mem1, W
subwf mem0, W ; comparaison de (mem0) et (mem1)
btfsc STATUS,Z ; test du bit Z
goto debut_programme; Z=1 : (mem1) est égale à (mem0) : l'état des boutons poussoirs est inchangé
; Z=0 : (mem1) est différent de (mem0):
comf mem1 , W ; complément logique de (mem1)
andwf mem0, W ; et logique
movwf detection ; (detection) = (mem0) et (non(mem1))
; (detection) égal à H'00' : aucun bouton poussoir n'a été appuyé
; (detection) différent de H'00' : au moins un bouton poussoir a été appuyé
movf detection, f ; on test si (detection) est nul
btfsc STATUS, Z ; test du bit Z
goto temporisation ; Z=1 : (detection) est nul
; Z=0 : (detection) différent de H'00' :
comf PORTA, f ; inversion de l'état de la sortie RA0
goto temporisation
; xxx temporisation d'environ 400 ms
;(2 millions de cycles avec un quartz de 20 MHz)
; résout le problème des rebonds des boutons poussoirs
temporisation
movlw H'00' ; initialisation des compteurs
movwf compteur1
movwf compteur2
movlw H'0A' ; pour un quartz 20 MHz
; movlw H'02' pour un quartz 4 MHz
movwf compteur3
debut1 ; 3 boucles imbriquées (256*256*10 boucles *3 cycles)
decfsz compteur1, f ; décrémente (compteur1) et compare avec 0
goto debut1 ; (compteur1) différent de 0
;(compteur1) égal à 0 :
decfsz compteur2, f ; décrémente (compteur2) et compare avec 0
goto debut1
decfsz compteur3, f ; décrémente (compteur3) et compare avec 0
goto debut1
; xxx fin de le temporisation
goto debut_programme
END