0/5 (6 avis)
Snippet vu 14 955 fois - Téléchargée 29 fois
;********************************************************************** ; * ; 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
11 juin 2002 à 07:25
11 juin 2002 à 07:26
8 juin 2003 à 11:03
Le site du célèbre auteur : http://www.abcelectronique.com/bigonoff/
12 juin 2003 à 18:49
-------
Merci Cyberdevil, d'avoir rectifié mon URL :)
D'autant que ce n'est qu'un code destiné à illustrer un chapitre du cours, et qui donc, pris seul, ne sert strictement à rien.
A+
Bigonoff
12 juin 2003 à 19:08
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.