Aidez-moi à résoudre un problème eeprom (code fourni)

G

garg29

Guest
Chers amis,
Je suis face à un problème très étonnant.J'ai fait un système qui contrôle la température de la pièce (à la valeur de réglage utilisateur) depuis un certain temps (l'utilisateur la valeur de consigne).J'utilise EEPROM (24c02) pour stocker les valeurs définies par l'utilisateur (seulement ces deux valeurs).La température peut être réglée de 0 à 90 degrés Celsius et le temps peut être réglé de 0 à 90 minutes.Mon problème est de doesnt travail des EEPROM correctement, ils stockent la valeur, mais l'Accord sur les ADPIC ne marche pas au système de valeurs fixées, et pour certains EEPROM (même valeur), il fonctionne très bien.Cela se produit généralement lorsque je remplacer avec une nouvelle EEPROM.
le code se présente comme suit:

Code:TEMPVAL. EQU 42H, la valeur de température réglée parutilisateur

Timeval. EQU 43H, la valeur de délai fixé par l'utilisateurEE_ADDR. EQU 55H, le transfert adresse eepromEE_DATA. EQU 56H; transfert de données EEPROM;******************* Lire les données de l'EEPROM à l'allumage****************************

READ_EEPROM:ACALL DELAYRSMOV R0, # 42H; écrit à partir de 42h le lieu des89c51 RAM

MOV EE_ADDR, # 00H; commencer à écrire à 00h emplacement deEEPROM

R3 MOV, # 02H; à lire 2-octets, 42h & 43h-dire,

; Tempval dire et timevalBACK_READ:

ACALL EE_READ

MOV @ R0, EE_DATAINC R0

INC EE_ADDRDJNZ R3, BACK_READMOV R0, # 42H

EE_ADDR MOV, # 00H

MOV R3, # 02H

RET

;************************************************* **********************************
;************************** Écrire des données dans EEPROM**********************************

WRITE_EEPROM:

MOV R0, # 42H

EE_ADDR MOV, # 00H

MOV R3, # 02H
BACK_WRITE:

EE_DATA MOV, @ R0

ACALL EE_WRITEACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNS

ACALL DELAYNSINC R0

INC EE_ADDRDJNZ R3, BACK_WRITEMOV R0, # 42H

EE_ADDR MOV, # 00H

MOV R3, # 02H

RET

;************************************************* **********************************

;************************* EEPROM**************************************************EE_WRITE: EE_START ACALL; ENVOYER UN DRAPEAU AU DEBUTEEPROM

MOV A, # 0A0H, préciser A NOTER EEPROM @ADRESSE 0H

ACALL crier; SHIFT l'adresse DISPOSITIF

WR_ABORT JC; avorter si NO ACK de l'EEPROM

MOV A, EE_ADDR; Obtenir l'adresse mémoire EEPROM

ACALL crier; MAJ OUT l'adresse mémoire

WR_ABORT JC; avorter si NO ACK de l'EEPROM

MOV A, EE_DATA; GET THE données à écrire

ACALL crier; MAJ DES DONNÉES

WR_ABORT JC;

CLR C;

WR_ABORT:

EE_STOP ACALL, d'envoyer stop condition dans l'EEPROM

, Attendez pour l'écriture HEURE DE LA24C02 () 10ms

; L'EEPROM PREND 10ms àINTERNE stocker les données.
Vous pouvez soit

; Insérer le microcontrôleur DANS UNÉtat d'attente ou de continuer à l'exécution,

; Sans oublier que LADONNÉES EEPROM n'est pas stockée pendant 10ms!RET; GO BACK TO MAIN PROGRAMME

; Lire les données EEPROM - FIRSTMANNEQUIN PERFORM «écrire»

EE_READ:

EE_DATA MOV, # 00H; Effacer OLD

ACALL EE_START; ENVOYER UN DRAPEAU START dans l'EEPROM

MOV A, # 0A0H, préciser une écriture EEPROM @ADRESSE 0H

ACALL SHOUT, effectuer des «écrire factices

RD_ABORT JC; avorter si NO ACK

MOV A, EE_ADDR; emplacement mémoire EEPROM LOAD

; À partir duquel lire

ACALL SHOUT, écrivez emplacement mémoire EEPROM

RD_ABORT JC; avorter si NO ACK

; Maintenant lire les données!

ACALL EE_START; ENVOYER UN DRAPEAU START

MOV A, # 0A1H, préciser A LIRE de l'EEPROM

ACALL crier; MAJ OUT adresse de l'EEPROM

RD_ABORT JC; avorter si NO ACK

SHIN ACALL; SHIFT dans les données de l'EEPROM

EE_DATA MOV, A; stocker les données

NAK ACALL, d'envoyer un NAK (NO ACKNOWLEDGE)AU

; EEPROM

CLR C; flag d'erreur CLEARRD_ABORT:

EE_STOP ACALL; TOUS FAIT

RET;

; EE_START BIT-Bangs DEBUTSEQUENCE l'EEPROM (SDA TRANSITION HI-TO-BAS

; HAUTE SCL).

EE_START:

SETB SDA

SCL SETB; SET deux bits

NOP; RETARD

SDA CLR; condition de démarrage; SDA HI àBAS DE TRANSITION

NOP

NOP; EEPROM DELAY TIME ACCESS

CLR SCL

CLR C; flag d'erreur CLEAR

RET, tous FAIT

; EE_STOP envoie une séquence STOPÀ l'EEPROM (SDA TRANSITION faible à HIGH

; HAUTE SCL).

EE_STOP:

CLR SDA

NOP

NOP

SETB SCL

NOP

NOP; DELAY Réglage de l'heure

SDA SETB, d'envoyer une condition d'arrêt

RET

; SHIFTS SHOUT OUT DE DONNEES AUEEPROM

Crier:

PUSH B

MOV B, n ° 8; SAVE B ET CHARGE nombre de bitsEEOUT:

RLC UN PEU MAJ; GAUCHE (RLC = ROTATIONGauche à travers

; CARRY)

MOV SDA, C; GET DATA bit de CARRY

NOP

SETB SCL; CLOCK en 1-bit

NOP; HEURE HAUT

CLR SCL; CLOCK est maintenant faible

B DJNZ, EEOUT; DO IT 8 FOIS

SDA SETB; SDA COMMUNIQUÉ DE ACK

NOP

NOP

SETB SCL; CLOCK ACK

NOP

C MOV, SDA; GET THE ACK

CLR SCL; CLEAR Le TBI CLOCK

POP B; RESTORE WHATEVER B a été

RET

; Données de déplacement Shin DE LAEEPROM

SHIN:

SDA SETB; MAKE SDA UNE ENTREE

PUSH B

MOV B, n ° 8; SAVE B et réglez bitEEIN:

NOP

SETB SCL; CLOCK SET

NOP

NOP; Temps d'accès EEPROM

SDA SETB; SET = 1 SO utilisée comme entrée

C MOV, SDA; LIRE 1-bit

RLC A; BIT SHIFT GAUCHE

CLR SCL; BIT CLOCK CLEAR

B DJNZ, EEIN; EEG bit suivant si moins de 8Bits lus

POP B

RET

; ACK envoie une EEPROMACKNOWLDEGEACK:

CLR SDA

NOP

NOP

SETB SCL; HORLOGE DU ACK

NOP

SCL CLR; abaisse CLOCK

RETNAK:; envoie un NAK ne reconnaissent

SETB SDA

NOP

NOP

SETB SCL; CLOCK les NAK

NOP

SCL CLR; abaisse CLOCK

RET

;************************************************* **************************
 
Salut, j'ai trouvé la solution, j'ai laissé une adresse vierge entre des eeprom.dire là où je l'ai écrit

Code:

INC EE_ADDR
 

Welcome to EDABoard.com

Sponsor

Back
Top