Led clignotante avec timer0 et utilisation de l'eeprom

Contenu du snippet

Démonstration de l'utilisation des données en eepromLa base de temps de clignotement est contenue dansl'eeprom.

Source / Exemple :


;**********************************************************************
;                                                                     *
; Fait clignoter une LED à une fréquence dépendant d'une valeur en    *
; eeprom                                                              *
;                                                                     *
;**********************************************************************
;                                                                     *
;    NOM: LED CLIGNOTANTE AVEC TIMER0 et utilisation de l'eeprom      *
;    Date: 18/02/2001                                                 *
;    Version: 1.0                                                     *
;    Circuit: Platine d'essai                                         *
;    Auteur: Bigonoff                                                 *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Fichier requis: P16F84.inc                                       *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: Démonstration de l'utilisation des données en eeprom      *
;           La base de temps de clignotement est contenue dans        *
;           l'eeprom.                                                 *
;                                                                     *
;**********************************************************************

	LIST      p=16F84            ; Définition de processeur
	#include <p16F84.inc>        ; Définitions des constantes

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; '__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'0087'	; Valeur registre option
                                ; Résistance pull-up OFF
                                ; Préscaler timer à 256

INTERMASK	EQU	H'00A0' ; Interruptions sur tmr0

;*********************************************************************
;                             DEFINE                                 *
;*********************************************************************

#DEFINE LED		PORTA,2		; LED 

;*********************************************************************
;                             MACRO                                  *
;*********************************************************************

BANK0	macro
	bcf	STATUS , RP0	; passer banque0
	endm

BANK1	macro
	bsf	STATUS , RP0	; passer banque1
	endm

READEE	macro	adeeprom	; macro avec paramètre
	movlw	adeeprom	; charger adresse eeprom
	movwf	EEADR		; adresse à lire dans registre EEADR
	bsf	STATUS , RP0	; passer en banque1
	bsf	EECON1 , RD	; lancer la lecture EEPROM
	bcf	STATUS , RP0	; repasser en banque0
	movf	EEDATA , w	; charger valeur lue dans W
	endm			; fin de la macro

WRITEE	macro	addwrite	; la donnée se trouve dans W
	LOCAL	loop		; étiquette locale
	movwf	EEDATA		; placer data dans registre
	movlw	addwrite	; charger adresse d'écriture
	movwf	EEADR		; placer dans registre
loop
	bcf	INTCON , GIE	; interdire interruptions
	btfsc	INTCON , GIE	; tester si GIE bien à 0
	goto	loop		; non, recommencer
	bsf	STATUS , RP0	; passer en banque1
	bcf	EECON1 , EEIF	; effacer flag de fin d'écriture
	bsf	EECON1 , WREN	; autoriser accès écriture
	movlw	0x55		; charger 0x55
	movwf	EECON2		; envoyer commande
	movlw	0xAA		; charger 0xAA
	movwf	EECON2		; envoyer commande
	bsf	EECON1 , WR	; lancer cycle d'écriture
	bcf	EECON1 , WREN	; verrouiller prochaine écriture
	bsf	INTCON , GIE	; réautoriser interruptions
	bcf	STATUS , RP0	; repasser en banque0
	endm

;*********************************************************************
;                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************

;exemples
;---------
	CBLOCK 0x00C   		; début de la zone variables
	w_temp :1		; Sauvegarde du registre W
	status_temp : 1		; Sauvegarde du registre STATUS
	cmpt : 1		; compteur de passage
	reload : 1		; valeur à recharger dans compteur
	cmpt2 : 1		; compteur de passages 2
        ENDC			; Fin de la zone                        

;*********************************************************************
;                   DECLARATIONS DE LA ZONE EEPROM                   *
;*********************************************************************
	org 0x2100		; adresse début zone eeprom
	DE	0x07		; valeur de recharge du compteur

#DEFINE	eereload	0x00	; adresse eeprom de eereload

;**********************************************************************
;                      DEMARRAGE SUR RESET                            *
;**********************************************************************

	org 0x000 		; Adresse de départ après reset
  	goto    init		; Adresse 0: initialiser

;**********************************************************************
;                     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é

			; switch vers différentes interrupts
			; inverser ordre pour modifier priorités
			;----------------------------------------
	
	btfsc	INTCON,T0IE	; tester si interrupt timer autorisée
	btfss	INTCON,T0IF	; oui, tester si interrupt timer en cours
	goto 	intsw1		; non test suivant
	call	inttimer	; oui, traiter interrupt timer
	bcf	INTCON,T0IF	; effacer flag interrupt timer
	goto	restorereg	; et fin d'interruption
				; SUPPRIMER CETTE LIGNE POUR
				; TRAITER PLUSIEURS INTERRUPT
				; EN 1 SEULE FOIS

intsw1
	btfsc	INTCON,INTE	; tester si interrupt RB0 autorisée
	btfss	INTCON,INTF	; oui, tester si interrupt RB0 en cours
	goto 	intsw2		; non sauter au test suivant
	call	intrb0		; oui, traiter interrupt RB0
	bcf	INTCON,INTF	; effacer flag interupt RB0
	goto	restorereg	; et fin d'interruption
				; SUPPRIMER CETTE LIGNE POUR
				; TRAITER PLUSIEURS INTERRUPT
				; EN 1 SEULE FOIS

intsw2
	btfsc	INTCON,RBIE	; tester si interrupt RB4/7 autorisée
	btfss	INTCON,RBIF	; oui, tester si interrupt RB4/7 en cours
	goto 	intsw3		; non sauter
	call	intrb4		; oui, traiter interrupt RB4/7
	bcf	INTCON,RBIF	; effacer flag interupt RB4/7
	goto	restorereg	; et fin d'interrupt
				; SUPPRIMER CETTE LIGNE POUR
				; TRAITER PLUSIEURS INTERRUPT
				; EN 1 SEULE FOIS

intsw3
	BANK1			; passer banque1
	btfsc	INTCON,EEIE	; tester si interrupt EEPROM autorisée
	btfss	EECON1,EEIF	; oui,tester si interrupt EEPROM
	goto 	restorereg	; non sauter
	call	inteep		; traiter interruption eeprom

	
			;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
			; tester compteur de passages
			; --------------------------
	decfsz	cmpt , f	; décrémenter compteur de passages
	return			; pas 0, on ne fait rien

 			; inverser LED
			; ------------
	BANK0			; par précaution
	movlw	b'00000100'	; sélectionner bit à inverser
	xorwf	PORTA , f	; inverser LED

			; recharger compteur de passages
			; ------------------------------
	movf	reload , w	; charger valeur contenue dans reload
	movwf	cmpt		; dans compteur de passages

			; incrémenter compteur de passages 2
			; ----------------------------------
	incf	cmpt2 , f	; incrémenter compteur de passages2
	return			; fin d'interruption timer

;**********************************************************************
;                     INTERRUPTION RB0/INT                            *
;**********************************************************************
intrb0
	return			; fin d'interruption RB0/INT
				; peut être remplacé par 
				; retlw pour retour code d'erreur

;**********************************************************************
;                     INTERRUPTION RB0/RB4                            *
;**********************************************************************
intrb4
	return			; fin d'interruption RB0/RB4
				; peut être remplacé par 
				; retlw pour retour code d'erreur

;**********************************************************************
;                     INTERRUPTION EEPROM                             *
;**********************************************************************
inteep
	return			; fin d'interruption eeprom
				; peut être remplacé par 
				; retlw pour retour code d'erreur

;*********************************************************************
;                       INITIALISATIONS                              *
;*********************************************************************

init
	clrf	PORTA		; Sorties portA à 0
	clrf	PORTB		; sorties portB à 0
	BANK1			; passer banque1
	clrf	EEADR		; permet de diminuer la consommation
	movlw	OPTIONVAL	; charger masque
	movwf	OPTION_REG	; initialiser registre option

			; Effacer RAM
			; ------------
	movlw	0x0c		; initialisation pointeur
	movwf	FSR		; pointeur d'adressage indirect
init1
	clrf	INDF		; effacer ram
	incf	FSR,f		; pointer sur suivant
	btfss	FSR,6		; tester si fin zone atteinte (>=40)
	goto	init1		; non, boucler
	btfss	FSR,4		; tester si fin zone atteinte (>=50)
	goto	init1		; non, boucler

			; initialiser ports
			; -----------------

	bcf	LED		; passer LED en sortie
	BANK0			; passer banque0

		; initialisations variables
		; -------------------------
	READEE	eereload	; lire emplacement eeprom 0x00
	movwf	reload		; placer dans reload
	movwf	cmpt		; et initialiser compteur de passages
	movlw	INTERMASK	; masque interruption
	movwf	INTCON		; charger interrupt control
	goto	start		; sauter programme principal

;*********************************************************************
;                      PROGRAMME PRINCIPAL                           *
;*********************************************************************

start
			; tester si 16 inversions de LED
			; ------------------------------
	btfss	cmpt2 , 5	; tester si 32 passages
	goto	start		; non, attendre
	clrf	cmpt2		; oui, effacer compteur2

			; incrémenter reload
			; ------------------
	incf	reload , f	; incrémenter reload
	incf	reload , f	; incrémenter 2 fois c'est plus visible
	
		; Tester si écriture précédente eeprom terminée
		; ---------------------------------------------
				; facultatif ici, car le temps écoulé
				; est largement suffisant
	BANK1			; passer banque1
wait
	btfsc	EECON1 , WR	; tester si écriture en cours
	goto	wait		; oui, attendre
	BANK0			; repasser en banque 0

		; écrire contenu de reload en eeprom
		; ----------------------------------
	movf	reload , w	; charger reload
	WRITEE	eereload	; écrire à l'adresse 0x00
	goto start		; boucler

	END 			; directive fin de programme

Conclusion :


Ce code en effet n'est pas de moi mais j'ai trouver sympa de le mettre dans ce nouveau forum dédié a la programation en ASM.
Merci de bien vouloir visité le site de l'auteur (qui est très complet): http://www.aurelienr.com/electronique/

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.