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