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/
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.