Bonjour
et bien voila j' ai voulu tester la programmation de l' eeprom du 16F628 et j' ai fait ce petit programme ( si joint plus bas ) mais il ne fonctionne qu' as moitier , j' arrive bien à lire la valeur contenu à l' adresse 02 mais impossible de changer cette valeur ??
le schèma est des plus simple , oscillateur rc interne , RB0 sortie vers une led via une résistance et le - , et un bouton poussoir sur RA0 avec résistance en pull up sur le + ....
LIST p=16F628 ; Définition de processeur
#include <p16F628.inc> ; fichier include
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;***************************** ***************
; ASSIGNATIONS SYSTEME *
;***************************** ****************
; REGISTRE OPTION_REG (configuration)
; -----------------------------------
OPTIONVAL EQU B'00000000'
; REGISTRE INTCON (contrôle interruptions standard)
; -------------------------------------------------
INTCONVAL EQU B'00000000'
; REGISTRE PIE1 (contrôle interruptions périphériques)
; ----------------------------------------------------
PIE1VAL EQU B'00000000'
; REGISTRE CMCON (COMPARATEURS)
; ------------------------------------
CMCONVAL EQU B'00000111'
; DIRECTION DES PORTS I/O
; -----------------------
DIRPORTA EQU B'00000001' ; Direction PORTA (1=entrée)
DIRPORTB EQU B'00000000' ; Direction PORTB
;***************************** ******************
; MACRO *
;***************************** ******************
; Changement de banques
; ----------------------
BANK0 macro ; passer en banque0
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANK1 macro ; passer en banque1
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANK2 macro ; passer en banque2
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANK3 macro ; passer en banque3
bsf STATUS,RP0
bsf STATUS,RP1
endm
; opérations en mémoire eeprom
; -----------------------------
REEPROM macro adeeprom ; lire eeprom (adresse dans adeeprom & résultat en w)
movlw adeeprom ; charger adresse eeprom (passage de la valeur en litteral)
clrwdt ; reset watchdog
BANK1 ; passer en banque1
movwf EEADR ; pointer sur adresse eeprom
bsf EECON1,RD ; ordre de lecture
movf EEDATA,w ; charger valeur lue
BANK0 ; passer en banque0
endm
WEEPROM macro addwrite ; la donnée se trouve dans W
LOCAL loop
BANK1 ; passer en banque1
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture (passage de la valeur en litteral)
movwf EEADR ; placer dans registre
bsf EECON1 , WREN ; autoriser accès écriture
bcf INTCON , GIE ; interdire interruptions
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bsf INTCON , GIE ; réautoriser interruptions
loop
btfsc EECON1 , WR ; tester si écriture terminée
goto loop ; non, attendre
bcf EECON1 , WREN ; verrouiller prochaine écriture
BANK0 ; passer en banque0
endm
;***************************** *********
; PROGRAMME PRINCIPAL *
;***************************** **********
START
REEPROM 0x02 ; lire emplacement eeprom 0x02
movwf VIT ; placer dans VIT
DEBUT btfsc PORTA, 0 ; Test de l'état de SW1 reglage
goto BOUCLE ; si ouvert aller boucle
goto REGLAGE ; si appuie aller vers reglage
BOUCLE movlw b'00000001' ; allume led sur RB0
movwf PORTB
movf VIT,w ; tempo en fonction de VIT
call Delay
movlw b'00000000' ; eteind led sur RB0
movwf PORTB
movf VIT,w ; tempo en fonction de VIT
call Delay
goto DEBUT ; retour DEBUT
REGLAGE movlw 0x0a
WEEPROM 0x02 ; écrire à l'adresse 0x02
movlw 0x05 ; tempo de 500ms
call Delay
goto DEBUT
;***************************** ***************************
; DECLARATIONS DE LA ZONE EEPROM *
;***************************** ***************************
org 0x2100 ; adresse début zone eeprom
DE 0x00
DE 0x00
DE 0x01
END
merci pour vos lumiéres
@+++ dan
-----