??? 06/01/08 15:07 Modified: 06/01/08 15:17 Read: times |
#155349 - just did the same thing yesterday! Responding to: ???'s previous message |
I know, I know, lots of guys will call me crazy. Yeah, yeah these things are obsolete, and there are millions of BETTER ways to do this: yada yada yada, bla bla bla.
However I don't do this for a living, its strictly a hobby for me. My only intention was to get it to work. Yesterday I was cleaning up some old JUNK in my basement and I noticed some old computers. My intention was to bring them to the dump! I saw the DS1287 RTC, and I stopped everything and tried to get it working with an Atmel AT89C2051. There is little or no example source, that I could actually get to work. The only way was to study the datasheet. The DS1287,DS12887, DS12B887 and the DS12C887 are all interchangeable (according to the data sheets). What I did was interface the RTC to an at89C2051 which is interfaced to a max232, and displays information on the screen, including a menu to set time, etc,etc. Since I don't do C, here is my working asm version. There is a lot of cut & paste from code fragments, but it does work. ;Saturday, May 31, 2008, 8:52:44 PM ;trying to interface a RTC DS1287 or DS12887 (from old motherboard) ;to 89C2051 ; ;prints time, date or registers to terminal ;you can also set time through terminal ;working with hyperterminal @ 9600 baud with 11.0592 MHz clock ; ;Connection between this microcontroller and ;DS12887 is pretty straightforward: ;AD0-AD7 --> P1.0-P1.7 ;AS --> p3.4 ;R/W --> p3.5 ;DS --> p3.7 ;IRQ --> if required, to External Interrupt 0 or 1 ; ;CS --> 0V ;MOT --> 0V ;Reset --> to +5V ; $mod51 ; DYTA equ 12h ; data byte to be written addr equ 13h ; for address byte ;--------------port 3 Pinout----------------- Ser_RX equ p3.0 ;Serial RX Ser_TX equ p3.1 ;Serial TX ; equ p3.2 ; ; equ p3.3 ; ; equ p3.4 ; RTC_AS equ p3.5 ; RTC_RW equ p3.6 ; RTC_DS equ p3.7 ;Data Strobe ;**************************************** sec equ 00h sec_alrm equ 01h min equ 02h min_alrm equ 03h hour equ 04h hrs_alrm equ 05h day equ 06h date equ 07h month equ 08h year equ 09h rega equ 0ah regb equ 0bh regc equ 0ch regd equ 0dh set_oscsqwe equ 00100000b ;set osc to run normally,sqw o/p freq is 1.024 KHz.Reg A ;and a periodic interupt of 976.5625 usec. set_time equ 11101010b ;bit7(1 for time setting),bit6(1 for periodic interrupt ;enable PIEdepends on RS0-RS3),bit5(AIE),bit4(UIE),bit3 ;SQWE,bit2(DM=0 for BCD format),bit1(24/12),bit0(DSE).Reg B update_time equ 00000010b ;b ; ;storage in ram for date & time sec_stor equ 08h sec_alrm_stor equ 09h min_stor equ 0Ah min_alrm_stor equ 0Bh hour_stor equ 0Ch hrs_alrm_stor equ 0Dh day_stor equ 0Eh date_stor equ 0Fh month_stor equ 10h year_stor equ 11h ;-------------------------------------- org 0 Reset: ajmp Start ;main program ORG 0030H ; begin code space ;************************************************ Start: MOV SP,#06FH ;Set Stack MOV A,#0FFH ; MOV P1,A ; MOV P3,A ; CLR RTC_AS ;AS always low Start2: lcall ClrScreen ; lcall intro ; print menu message lcall newline ; ChkInp: lcall Inchar ;Get a cmd to work with cjne a,#030h,KeyIn ; sjmp ChkInp KeyIn: cjne a,#031h,KeyIn1 ;'1' entered, set time lcall setime sjmp ChkInp1 KeyIn1: cjne a,#032h,KeyIn2 ;'2' entered, read time lcall Get_RTC lcall Print_Time sjmp ChkInp1 KeyIn2: cjne a,#033h,KeyIn3 ;'3' entered, read date lcall Get_RTC lcall Print_Date sjmp ChkInp1 KeyIn3: cjne a,#034h,ChkInp ;'4' entered, read registers lcall NewLine lcall read_reg sjmp ChkInp1 ;************************************************ ChkInp1: lcall Inchar ljmp Start2 ;************************************************ RTC_READ: MOV P1,addr nop SETB RTC_AS ;send address nop CLR RTC_AS nop MOV P1,#0FFH ;P1 = input nop CLR RTC_DS nop MOV DYTA,P1 ;read to DYTA SETB RTC_DS RET ;************************************************ RTC_WRITE: MOV P1,addr nop SETB RTC_AS ;send address nop CLR RTC_AS nop nop MOV P1,DYTA ;send data nop CLR RTC_RW nop SETB RTC_RW RET ;************************************************ ;read time and date, store in 8051 ram Get_RTC: MOV addr, #rega Wait: lcall RTC_READ mov a,DYTA JB ACC.7, Wait MOV addr, #sec lcall RTC_READ MOV sec_stor, DYTA MOV addr, #Min lcall RTC_READ MOV min_stor, DYTA MOV addr, #Hour lcall RTC_READ MOV Hour_stor, DYTA MOV addr, #Day lcall RTC_READ MOV Day_stor, DYTA MOV addr, #Date lcall RTC_READ MOV Date_stor, DYTA MOV addr, #Month lcall RTC_READ MOV Month_stor, DYTA MOV addr, #Year lcall RTC_READ MOV Year_stor, DYTA ret ;************************************************ Print_Date: mov dptr,#Date_msg lcall OutStr mov R0,#Year_stor mov a,@R0 lcall pout mov R0,#Month_stor mov a,@R0 lcall pout mov R0,#Date_stor mov a,@R0 lcall pout ret ;************************************************ Print_Time: mov dptr,#Time_msg lcall OutStr mov R0,#Hour_stor mov a,@R0 lcall Hex2Ascii mov a,#3ah lcall OutChar mov R0,#Min_stor mov a,@R0 lcall Hex2Ascii mov a,#3ah lcall OutChar mov R0,#Sec_stor mov a,@R0 lcall Hex2Ascii ret Date_msg: db cr,lf,'Date: ',0 Time_msg: db cr,lf,'Time: ',0 ;================================================ ;subroutine to set time ;================================================ setime: mov addr,#regb mov DYTA,#set_time ;prepare to set time lcall RTC_WRITE mov addr,#hour ;set hrs mov dptr,#Ent_Hrs_str lcall OutStr lcall GetHex mov DYTA,a ;change the value to any 0-23 as hour to set lcall RTC_WRITE mov addr,#min ;set minutes mov dptr,#Ent_min_str lcall OutStr lcall GetHex mov DYTA,a ;change 0-59 to set minutes lcall RTC_WRITE mov addr,#sec ;set seconds to 00 mov DYTA,#00h ;change 0- 59 to set seconds lcall RTC_WRITE ; mov addr,#day ;set day of the week ; mov DYTA,#01h ; lcall RTC_WRITE mov addr,#date ;set day of month mov dptr,#Ent_Day_str lcall OutStr lcall GetHex mov DYTA,a ;set 15h for 15th lcall RTC_WRITE mov addr,#month ;set month mov dptr,#Ent_Mnth_str lcall OutStr lcall GetHex mov DYTA,a ;05h for month of may lcall RTC_WRITE mov addr,#year ;set year mov dptr,#Ent_Yr_str lcall OutStr lcall GetHex mov DYTA,a ;08h for year 2008 lcall RTC_WRITE mov addr,#rega mov DYTA,#set_oscsqwe ;set regA lcall RTC_WRITE mov addr,#regb mov DYTA,#update_time ;set regB for normal clock operation lcall RTC_WRITE ret ;-------------------------------------------------------- ;subroutine to read and display 4 registers A,B,C,D.of DS1287 ;============================================================= read_reg: ;-------------read and display reg A-------- mov addr,#rega lcall RTC_READ mov a,DYTA lcall POUT ;-------------read and display reg B-------- mov addr,#regb lcall RTC_READ mov a,DYTA lcall POUT ;-------------read and display reg C-------- mov addr,#regc lcall RTC_READ mov a,DYTA lcall POUT ;-------------read and display reg D-------- mov addr,#regd lcall RTC_READ mov a,DYTA lcall POUT ret ;============================================================= $include (termfunc.inc) END if you need the whole thing (the include files, let me know) incidentally, I never made it to the dump! Good Luck |
Topic | Author | Date |
DS12C887 with non mux interface | 01/01/70 00:00 | |
Throw that junk away... | 01/01/70 00:00 | |
Search For... | 01/01/70 00:00 | |
A full circle.. | 01/01/70 00:00 | |
just did the same thing yesterday! | 01/01/70 00:00 | |
Why would anyone call you crazy ? | 01/01/70 00:00 | |
nop's | 01/01/70 00:00 | |
The full C code for the DS12887 | 01/01/70 00:00 | |
just curious | 01/01/70 00:00 | |
Selectable bus timings | 01/01/70 00:00 | |
I agree with Michael... | 01/01/70 00:00 | |
Are there any specific reasons ??![]() | 01/01/70 00:00 | |
what does datasheet says | 01/01/70 00:00 | |
Memory mapping | 01/01/70 00:00 | |
Craig, which lead to the old issue | 01/01/70 00:00 |