DS1307 og Port 0

T

Toyib

Guest
HAI ALLE ....

Jeg ønsker at vise VAERDIEN AF ANDET VAERDI AF DS1307 til havnen 0 med denne kodeks (. ASM) ....

Code:SCL BIT P1.0

SDA BIT P1.1

DS1307W DATA 0D0H

DS1307R DATA 0D1H

FLAG DATA 20H

LASTREAD BIT FLAGS.0

ACK BIT FLAGS.5

BUS_FLT BIT FLAGS.6

_2W_BUSY BIT FLAGS.7

BITCNT DATA 21H; ************************************************* *********

; START PROGRAM

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

LOOP:

ACALL READ_CLOCK

MOV P0, A

SJMP LOOP

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

SEND_START:

SETB _2W_BUSY

CLR ACK

CLR BUS_FLT

JNB SCL, FAULT

JNB SDA, FAULT

SETB SDA

LCALL SCL_HIGH

CLR SDA

ACALL DELAY

CLR SCL

RET

Fejl:

SETB BUS_FLT

RET

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

SEND_STOP:

CLR SDA

LCALL SCL_HIGH

SETB SDA

CLR _2W_BUSY

RET

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

DELAY: NOP

RET

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

SCL_HIGH:

SETB SCL

JNB SCL, $

RET

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

SEND_BYTE:

MOV BITCNT, # 08H

SB_LOOP:

JNB ACC.7, NOTONE

SETB SDA

JMP ONE

NOTONE:

CLR SDA

ONE:

LCALL SCL_HIGH

RL A

CLR SCL

DJNZ BITCNT, SB_LOOP

SETB SDA

LCALL SCL_HIGH

CLR ACK

JNB SDA, SB_EX

SETB ACK

SB_EX:

ACALL DELAY

CLR SCL

ACALL DELAY

RET

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

READ_BYTE:

MOV BITCNT, # 08H

MOV A, # 00H

SETB SDA

READ_BITS:

LCALL SCL_HIGH

MOV C, SDA

RLC A

CLR SCL

DJNZ BITCNT, READ_BITS

JB LASTREAD, ACKN

CLR SDA

ACKN:

LCALL SCL_HIGH

CLR      SCL
RET

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

READ_CLOCK:

CLR LASTREAD

ACALL SEND_START

MOV A, # DS1307W

ACALL SEND_BYTE

MOV A, # 00H

ACALL SEND_BYTE

ACALL SEND_STOP

ACALL SEND_START

MOV A, # DS1307R

ACALL SEND_BYTE

ACALL READ_BYTE

ACALL SEND_STOP

RET

SLUT
 
Hi Toyib,
hvilken slags på microcontroller du bruger?
Jeg har brug for mere info abouth din hardware,
hilsen

 
Hej,
Generelt kodningen ser ud til at være ok.Men,

1.Du er nødt til at skrive D7 smule reg.00 lavt til at starte oscillator, som betyder, at du er nødt til at skrive en data byte efter reg.00 udvælgelse.Så er du nødt til at opsige skrive med et stopsignal og genudstede de skrive / læse sekvens du allerede har gjort.

2.DS 1307 er en meget langsom enhed, er du nødt til at indføre mere forsinkelser på ca 5usec til klokkepulser Hi / Lo perioder samt start, stop og tomgang stater.

3.Det appers, en NAK er ikke udstedes efter læse, men kan ikke sagen på grund af STOP?, Men det er altid en god idé at følge de specifikationer.

Hilsen,
Laktronics

 
Mit forslag til Toyib,
programmering i ASM er virkelig hårdt, i dag, du har mange choises at ændre ASM.
Jeg tror du skal bruge nogle bedre programmering sprog,
Jeg ved ikke, hvad microcontroller du bruger, men ser på www.mikroe.com,
hi udvikle mange let nyttige sprog for at bruge med mange microcontrollers,
Poll det bedste for dig,
for eksempel ved hjælp af RTC DS1307 i MICROBASIC udvikling for PIC-micro er meget nemt, du ikke har brug for meget store erfaringer med programmering,
hilsen

 
pls hjælp mig ..................
her er min hardware

AT89S51

Crystal 11,0592 Mhz

DS1307

Crystal 32,768 KHz (CL = 6pF)

2Pcs R 10 K 0,25 watther er min kode
Code:; ************* DS1307 RTC rutiner ********************************* ********

; *** RTC DS1307 PINS & ADRESSE ***SCLPIN BIT P1.0

SDAPIN BIT P1.1DS1307W EQU 0D0H; SLAVE ADRESSE 1101 000 0 AT SKRIVE

DS1307R EQU 0D1H; SLAVE ADRESSE 1101 000 1 Hvis du vil læse

EEDATA EQU 08HORG 0HSTART:

LCALL EE_START; SEND 2-tråds START BETINGELSE

MOV A, # DS1307W; SEND 1307 WRITE COMMAND

LCALL SH_OUT

JC RD_ABORT

MOV A, # 00H; SET DATA pointer REGISTRERINGSPLIGTEN 00H OM DS1307 (andet register)

LCALL SH_OUT

JC RD_ABORT

MOV A, # 00H

LCALL SH_OUT

LCALL EE_STOP; ALL DONE ..

READ_SECOND:

LCALL EE_START; SEND 2-tråds START BETINGELSE

MOV A, # DS1307W; SEND 1307 WRITE COMMAND

LCALL SH_OUT

JC RD_ABORT

MOV A, # 00H; SET DATA pointer REGISTRERINGSPLIGTEN 00H OM DS1307 (andet register)

LCALL SH_OUT

JC RD_ABORT

LCALL EE_STOP; ALL DONE ..

LCALL EE_START; sende en START FLAG ..

MOV A, # DS1307R; angive en READ FRA RTC ..

LCALL SH_OUT; SHIFT OUT RTC ADRESSE ..

JC RD_ABORT; ABORT IF NO ACK ..

LCALL SH_IN; skift i data fra RTC ..

MOV EEDATA, A; lagre data ..

LCALL NAK; sende en NAK (NO ANERKENDER) til RTC ..

CLR C; CLEAR ERROR FLAG ..

RD_ABORT:

LCALL EE_STOP; ALL DONE ..

MOV P0, EEDATA; DISPLAY den anden værdi af RTC I HAVN 1

CALL DELAY_10MS; DELAY 10 MS

SJMP READ_SECOND;================================================= ================================================== ======================

;--------------- KIRIM DATA ---------------------

EE_START:

SETB SDAPIN

SETB SCLPIN; indstille både BITS ..

NOP; DELAY ..

CLR SDAPIN; START BETINGELSE - SDA HI til lave OVERGANGSINSTRUMENTERNE ..

NOP

NOP; RTC ADGANG tidsforsinkelse ..

CLR SCLPIN

CLR C; CLEAR ERROR FLAG ..

RET; ALL DONE ..

;--------------- EE_STOP sendes et stopsignal SEQUENCE TIL EEPROM (lav-til-høj SDA overgang med SCL HIGH) ..

EE_STOP:

CLR SDAPIN

NOP

NOP

SETB SCLPIN

NOP

NOP; SETUP tidsforsinkelse ..

SETB SDAPIN; sende en STOP BETINGELSE ..

RET;--------------- SH_OUT SKIFTEHOLDSARBEJDE DATA ud til EEPROM ---------------------

SH_OUT:

PUSH B

MOV B, # 8; Save B og belastning BIT COUNT ..

EE_OUT:

RLC A; SHIFT BIT venstre (RLC = Rotér til venstre GENNEM BEFORDRE) ..

MOV SDAPIN, C; GET DATA BIT af fremførte ..

NOP

SETB SCLPIN; uret i 1-BIT ..

NOP; CLOCK høje tid ..

CLR SCLPIN; CLOCK er nu LOW ..

DJNZ B, EE_OUT; DO IT 8 gange ..

SETB SDAPIN; RELEASE SDA FOR ACK ..

NOP

NOP

SETB SCLPIN; ACK CLOCK ..

NOP

MOV C, SDAPIN; FÅ DET ACK ..

CLR SCLPIN; rydde CLOCK BIT ..

POP B; GENOPRETNING UANSET B var ..

RET;--------------- SH_IN SHIFT DATA ind fra EEPROM -----------------------

SH_IN:

SETB SDAPIN; FORETAG SDA et input ..

PUSH B

MOV B, # 8; Save B OG SET BIT BEKÆMPELSE ..

EE_IN:

NOP

SETB SCLPIN; SET CLOCK ..

NOP

NOP; EEPROM ADGANG TIME ..

SETB SDAPIN; SET = 1 SO bruges som input ..

MOV C, SDAPIN; READ 1-BIT ..

RLC A; SHIFT BIT LEFT ..

CLR SCLPIN; CLEAR CLOCK BIT ..

DJNZ B, EE_IN; GET NEXT BIT hvis den er mindre end 8 bits LÆS ..

POP B

RET;--------------- ACK sender en EEPROM ACKNOWLDEGE ----------------------

ACK:

CLR SDAPIN

NOP

NOP

SETB SCLPIN; CLOCK DEN ACK ..

NOP

CLR SCLPIN; SAETTE CLOCK LOW ..

RET;--------------- NAK sender en NO ANERKENDER ----------------------------

NAK:

SETB SDAPIN

NOP

NOP

SETB SCLPIN; CLOCK DEN NAK ..

NOP

CLR SCLPIN; SAETTE CLOCK LOW ..

RETDELAY_10MS:; MEMBUTUHKAN WAKTU DELAY ~ 10ms

MOV R1, # 50

DELAY1_10MS:

MOV R2, # 112

DJNZ R2, $

DJNZ R1, DELAY1_10MS

RET

SLUT

 
øge forsinkelsen i stedet for NOP kalde en forsinkelse delrutinen forvandleTil for 1ms, mange gang Thats problemet, og jeg foretrækker at bruge 3.3k som pull up modstand
efter EE_stop give 10ms straks derefter kalder EE_start

 
Hej,
Det ser ud til OK nu, bortset fra som Amol har nævnt, I2C forsinkelser er ikke nok.Det er ikke nødvendigt at have 10 msec.delay, men du bør bruge en 5ľsec straks for CLK lav, CLK Hi og for STRT / STOP rutiner.Husk, at med 11MHz CPU clock du bruger en NOP vil kun være lidt over 1ľsec, så du skal bruge omkring fem NOPs at få 5ľsec forsinkelse.
Du kan også bruge ABORT til filial til en anden rutine at blinke / slå-om en LED, selv om det er af sekundær betydning for nutiden.

Hilsen,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top