Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
chart-export-handler
/
Projet
:
Clk_Demo.asm
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
* ********************************** * CLOCK DEMO * * * * Demo of the DS1302 clock chip * * and Junian Date & day-of-week * * software. * ********************************* * * * Written by: * Roger Schaefer * BCD Inc. * 3133 South Illinois * Belleville, IL 62220 * rsch@ezl.com * * http://www.ezl.com/~rsch * * PROCESSOR IS: MC9S12DP256 running at 24 MHz * This program is written to be run in RAM * D-Bug12 v 4.x.x monitor is present * "load" the S19 file and "G 2000" * * * The following Equates are for IF statements * in the source file * *EXPAND EQU 1 ;The listing of includes * *FLASH EQU 1 * RAMONLY EQU 1 ;use RAM only * * LANGUAGE USED IS: ENGLISH EQU 0 ;value doesn't matter * Real Time Clock is DS1302 EQU 0 ;from Dallas is installed * ********************************************************* * *************** * EQUATES * *************** * RAMSTRT: EQU $1000 ; start of internal ram MONRAM: EQU $2000 ; monitor ram start REGBS: EQU $0000 ; start of registers ROMBS: EQU $8000 ; start of paged rom DSTREE: EQU $0400 ; start of eeprom DENDEE: EQU $0FFF ; end of eeprom STACK: EQU $2000 ; top of stack ;OscClk: equ 8000000 ;Eclock: equ 24000000 ; final E-clock frequency (PLL) ;RefClock: equ 8000000 ; REFDVVal: equ 0 ;(OscClk/RefClock)-1 SYNRVal: equ 2 ;(Eclock/RefClock)-1 FCLKDIVVal: equ 40 ;(OscClk/200000) * * * Processor registor listing below * #ifdef EXPAND #include Reg9s12.i #else nolist #include Reg9s12.i list ;resume the listing #endif * * * Serial Peripheral Status Reg. bits SPIF EQU %10000000 * Serial Peripheral Control Reg. bits LSBF EQU %00000001 * * Serial Communication Interface Status Reg. bits TC EQU %01000000 ;transmit complete RDRF EQU %00100000 ;receive data full TE EQU %00001000 ;transmit enable TCIE EQU %01000000 ;TC interrupt enable * * Timer Interrupt Flag Register 1 bits C0F EQU %00000001 C1F EQU %00000010 C2F EQU %00000100 C3F EQU %00001000 C4F EQU %00010000 C5F EQU %00100000 C6F EQU %01000000 C7F EQU %10000000 * * Pulse Accumulator Control Register bits DDRA7 EQU %10000000 ;data dir reg bit 7 PAEN EQU %01000000 ;pulse accumulator ;enable PAMOD EQU %00100000 ;pulse acc mode sel PEDGE EQU %00010000 ;pulse acc edge sel * * Pulse Accumlator Interrupt Flag & Enable PAOVI EQU %00100000 ;enable in TMSK2 PAII EQU %00010000 ; " " PAOVF EQU %00100000 ;flag in TFLG2 PAIF EQU %00010000 ; " " * * Bit definitions for the CRGFLG register LOCK: equ $08 * * Bit definitions for the CLKSEL register PLLSEL: equ $80 ; use PLL for system clocks. * QUELNG EQU 16 ;size of input queue * * PROMPT EQU '>' * * * PR2PR1PR0 EQU %000 ;Timer Prescaler Select PRESCALE EQU 64 ;if PR2:1:0 = 000 set to 64 ;if PR2:1:0 = 001 set to 32 ; 010 set to 16 ; 011 set to 8 ; 100 set to 4 ; 101 set to 2 ; MSec EQU 375 ; @ 24MHz clock use 375 ; use: #ms*MSec*PRESCALE uSec EQU 24 ; use: #us*uSec * ***************************** USTACK EQU STACK-200 ***************************** BUFFLNG EQU 64 * IO equ portt ;port to use for output IODDR equ ddrt RTClkPort equ portm RTClkDDR equ ddrm RST equ %10000000 SCLK equ %01000000 I_O equ %00100000 * * * MinDigit EQU 7 ;for leading zero * * ORG RAMSTRT * * * .10ms RMB 1 JIFFY RMB 1 SEC RMB 1 MIN RMB 1 HR RMB 1 DAY RMB 1 CLK RMB 1 * * Clock flag bits * NewSec EQU %00000001 NewMin EQU %00000010 NewHr EQU %00000100 NewDay EQU %00001000 NewPM EQU %00010000 NewJif EQU %00100000 * * *** Buffalo variables - used by: *** * PTR0 RMB 2 ;main,readbuff,incbuff,AS PTR1 RMB 2 ;main,BR,DU,MO,AS PTR2 RMB 2 ;DU,GO,MO,AS PTR3 RMB 2 ;HO,MO,AS TMP1 RMB 1 ;main,hexbin,buffarg,termarg TMP2 RMB 1 ;GO,HO,AS TMP3 RMB 1 ;AS,LOAD TMP4 RMB 1 ;GO,HO,ME,AS * SHFTREG RMB 3 ;input shift register REGS RMB 9 ;user's pc,y,x,a,b,c SP RMB 2 ;user's sp STREE RMB 2 ;eeprom start address ENDEE RMB 2 ;eeprom end address YEAR RMB 1 AUTOLF RMB 1 ;auto lf flag for i/o IODEV RMB 1 ;0=sci, 1=acia, 2=duartA ;3=duartB, 4=MAX3100 EXTDEV RMB 1 ;0=none, 1=acia, 2=duart HOSTDEV RMB 1 ;0=sci, 1=acia, 3=duartB COUNT RMB 1 ;# characters read CHRCNT RMB 1 ;# characters output on ; current line PTRMEM RMB 2 ;current memory location LDOFFST RMB 2 ;offset for download DBUFR RMB 9 ;Decimal result buffer ;(8 bytes ASCII) * Some routines use only first 5 bytes of DBUFR HTEMP RMB 3 ;Temp for H6TOD8 (3 bytes) RESET_TYPE RMB 1 UCLK RMB 1 ;user clock flags BTemp RMB 1 ;temp for B in MAIN loop * FLG RMB 1 ; Flags * * FLG BITS * LeapYr EQU %00000001 ;is this a Leap Year QFULL EQU %00000010 ;input queue is full ECHO EQU %00000100 ;echo input character? NEWCHAR EQU %00001000 ;new character * ;------------- ;RTC Variables ;------------- ; DATA rmb 1 ACKCT rmb 1 * * QHEAD RMB 1 QTAIL RMB 1 QAVAIL RMB 1 QUEUE RMB QUELNG QUEUEZ EQU * ;marker for end of queue TX rmb 2 RX rmb 2 TXmask rmb 1 * * for Zeller Congrence ZELLER RMB 18 ;dayZ RMB 2 ;yrZ RMB 2 ;mnZ RMB 2 ;n1Z RMB 2 ;n2Z RMB 2 ;n3Z RMB 2 ;YearZ RMB 2 ;MonthZ RMB 2 ;DateZ RMB 2 * lcd_temp RMB 1 linechar RMB 1 lineno RMB 1 st_lo RMB 1 lcd_data RMB 1 * CKSM RMB 1 ;checksum TEMP RMB 1 TW RMB 2 MCONT RMB 1 * Sec_Temp RMB 4 ;for WRITE_EEPROM_BYTE * ZZRAM EQU * * * ***************** INBUFF RMB BUFFLNG BUFFEND RMB 1 ;EOS stuck here sometimes COMBUFF RMB 8 msgbuff rmb BUFFLNG rmb 1 ;EOS stuck here ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; * org $2000 ; * Following bytes need to be in battery backed RAM BaseYr RMB 1 ;start with 98 BCD * * ; #ifdef RAMONLY ORG $2000 #else ORG ppage fcb #$34 ; FLASH page ORG ROMBS #endif * *********************** * .BUFISIT JMP BUFISIT * *.ForceQ JMP ForceQ ;use A,B,X * COP_SERVICE EQU * LDAA #$55 STAA RESET_TYPE * BUFISIT EQU * SEI LDAA #REGBS/$100 ;Registers STAA $11 ;INITRG LDAA #RAMSTRT/$100 ;Ram STAA initrm #ifdef RAMONLY #else ldab #REFDVVal ; set the REFDV register to give us a stab refdv ; ....1.0 MHz reference. ldab #SYNRVal ; set the SYNR register to give us a stab synr ; ....24.0 MHz E-clock. nop ; nops required for bug in initial silicon. nop nop nop brclr crgflg,#LOCK,* ; wait here till the PLL is locked. bset clksel,#PLLSEL ; switch the bus clock to the PLL. ; ldab #FCLKDIVVal ; value for the Flash & EEPROM clock stab fclkdiv ; ....divider register. stab eclkdiv #endif LDAA #%00000111 ;COP rate STAA copctl LDAA #%11100000 STAA intcr ;dly, irqe LDAA #PR2PR1PR0 ORAA tmsk2 STAA tmsk2 ;timer pre = /4 ;Set up external memory control registers LDS #STACK CLR EXTDEV CLR IODEV JSR INIT ;initialize IO; set baud JSR SET_LYr * JSR CLS ;clear screen if ANSI installed JSR SignOn JSR OUTCRLF JSR SHOW_TIME JSR OUTCRLF JSR SHOW_DATE JSR OUTCRLF JSR PRTJULIAN JSR OUTCRLF JMP MAIN ************************************************************ * ************************************************************ * PRTJULIAN EQU * LDX #MSG79 ;"The JULIAN Date... JSR OUTSTRG0 JSR JULIAN_BIN LDX #PTR3 PRTJ1 JSR HTOD ;make ASCII LDX #DBUFR+2 ;100's digit LDAA #EOS STAA DBUFR+5 JSR OUTSTRG0 RTS * * * JULIAN IN BINARY -- Find the Julian day and * return is binary value * in PRT3; used by both * JULIAN and WEEK JULIAN_BIN EQU * JSR Get_Month TAB ANDA #$F ;mask off 10's ANDB #$F0 ;save just 10's BEQ JUL1 ADDA #10 JUL1 TAB BRSET FLG, LeapYr, JUL2 LDY #MonthTbl BRA JUL3 JUL2 LDY #MonthTbl_L JUL3 ASLB ;times two ABY LDD ,Y ;get number days STD PTR3 JSR Get_Date BSR BCDTOB ;convert to binary TAB ;move to B CLRA ADDD PTR3 ;add to months STD PTR3 RTS * * * * BCDTOB (A) Enter with a two digit BCD number in * reg A; return with binary in A. * Does no error checking. * BCDTOB PSHB TAB LSRB LSRB LSRB LSRB ;10's in B ANDA #$F ;1's in A PSHA LDAA #10 MUL ;result in B PULA ABA ;combine PULB RTS * * * TIME -- Display real time clock using the same * format as DOS * SHOW_TIME EQU * LDX #MSG20 ;"Current ... JSR OUTSTRG0 JSR Get_Hour PSHA ANDA #$30 LSRA LSRA LSRA LSRA BNE SET_T0 LDAA #$F0 SET_T0 EQU * JSR OUTRHLF PULA ANDA #$F JSR OUTRHLF LDAA #': JSR OUTPUT JSR Get_Minutes PSHA LSRA LSRA LSRA LSRA JSR OUTRHLF PULA ANDA #$F JSR OUTRHLF LDAA #': JSR OUTPUT JSR Get_Seconds PSHA ANDA #$7F LSRA LSRA LSRA LSRA JSR OUTRHLF PULA ANDA #$F JSR OUTRHLF JSR OUTSPAC JSR Get_Hour TSTA BPL SET_T9 BITA #%00010000 BEQ PM LDAA #'a SET_T1 JSR OUTPUT LDAA #'m JSR OUTPUT * LDX #MSG21 ;"Enter new ... * JSR OUTSTRG SET_T9 RTS PM LDAA #'p BRA SET_T1 * * * DATE -- Show the real time clock * * SHOW_DATE EQU * LDX #MSG22 ;"Current .. JSR OUTSTRG0 JSR Show_day_of_week *------------------------------------------------ JSR Get_Month PSHA BITA #%00010000 BNE SET_D1 LDAA #SPACE SET_D0 JSR OUTPUT PULA ANDA #$F JSR OUTRHLF LDAA #'- JSR OUTPUT *------------------------------------------------- JSR Get_Date PSHA LSRA LSRA LSRA LSRA JSR OUTRHLF PULA ANDA #$F JSR OUTRHLF LDAA #'- JSR OUTPUT *------------------------------------------------- JSR SET_LYr ;get year PSHA CMPA #$94 BLS SET_D2 BSR OUT19 SET_D3 LSRA LSRA LSRA LSRA JSR OUTRHLF PULA ANDA #$F JSR OUTRHLF * LDX #MSG23 * JSR OUTSTRG RTS * OUT19 PSHA LDAA #'1 JSR OUTPUT LDAA #'9 JSR OUTPUT PULA RTS OUT20 PSHA LDAA #'2 JSR OUTPUT LDAA #'0 JSR OUTPUT PULA RTS RTS SET_D1 LDAA #'1 BRA SET_D0 SET_D2 BSR OUT20 BRA SET_D3 * * * SET LEAP YEAR - returns with year in A and * sets the leap year flag * SET_LYr: LDAA #6 ;year JSR READ_CLK PSHA JSR BCDTOB ;convert to binary ;added ver 0.83 STAA YEAR LSRA BCS NOT_LYr LSRA BCS NOT_LYr BSET FLG, LeapYr ;is leap year PULA RTS NOT_LYr BCLR FLG, LeapYr ;isn't leap year PULA RTS * * Get_Full_Year: jsr Get_Year ;from RTC in BCD jsr BCDTOB tab clra cmpb #94 ;compare to 1994 bls Get_Full_Year1 addd #1900 bra Get_Full_Year2 Get_Full_Year1: addd #2000 Get_Full_Year2: rts * Show_Day_of_Week: bsr Get_day_of_week jsr OUTSTRG0 rts Get_day_of_week: jsr Get_Date ;return 1 to 31 jsr BCDTOB tab clra std DateZ * jsr Get_Month jsr BCDTOB tab clra std MonthZ * jsr Get_Full_Year std YearZ * sei jsr Compute_Day ;day returned in A cli lsla ;times two ldx #Days_of_Week leax a,x ldx 0,x rts * * * ********************* *** COMMAND TABLE *** ********************* * COMTABL EQU * * *** Command names for current application *** * IFDEF DS1302 INCLUDE "clk_cmd.i" ENDIF FCB 4 FCC 'HELP' FDB HELP FCB 3 FCC 'CLS' FDB CLS FCB -1 * * * ***************** * UTILITY SUBROUTINES - These routines * are called by any of the task routines. ***************** * ***************** * UPCASE(a) - If the contents of A is alpha, * returns a converted to uppercase. ***************** UPCASE CMPA #'a' BLT UPCASE1 ;jump if < a CMPA #'z' BGT UPCASE1 ;jump if > z SUBA #$20 ;convert UPCASE1 RTS * * ***************** * HEXBIN(a) - Convert the ASCII character in a * to binary and shift into shftreg. Returns value * in tmp1 incremented if a is not hex. ***************** HEXBIN PSHA PSHB PSHX JSR UPCASE ;convert to upper case CMPA #'0' BLT HEXNOT ;jump if a < $30 CMPA #'9' BLE HEXNMB ;jump if 0-9 CMPA #'A' BLT HEXNOT ;jump if $39> a <$41 CMPA #'F' BGT HEXNOT ;jump if a > $46 ADDA #$9 ;convert $A-$F HEXNMB ANDA #$0F ;convert to binary LDX #SHFTREG LDAB #4 HEXSHFT ASL 1,X ;2 byte shift through ROL 0,X ; carry bit DECB BGT HEXSHFT ;shift 4 times ORAA 1,X STAA 1,X BRA HEXRTS HEXNOT INC TMP1 ;indicate not hex HEXRTS PULX PULB PULA RTS * * ***************** * BUFFARG() - Build a hex argument from the * contents of the input buffer. Characters are * converted to binary and shifted into shftreg * until a non-hex character is found. On exit * shftreg holds the last four digits read, count * holds the number of digits read, ptrbuff points * to the first non-hex character read, and A holds * that first non-hex character. ***************** *Initialize *while((a=readbuff()) not hex) * hexbin(a); *return(); * BUFFARG CLR TMP1 ;not hex indicator CLR COUNT ;# or digits CLR SHFTREG CLR SHFTREG+1 JSR WSKIP BUFFLP JSR READBUFF ;read char JSR HEXBIN TST TMP1 BNE BUFFRTS ;jump if not hex INC COUNT JSR INCBUFF ;move buffer pointer BRA BUFFLP BUFFRTS RTS * * ***************** * READBUFF() - Read the character in "msgbuff" * pointed at by ptrbuff into A. Returns ptrbuff * unchanged. ***************** READBUFF PSHX LDX PTR0 LDAA 0,X PULX RTS * ***************** * INCBUFF(), DECBUFF() - Increment or decrement * ptrbuff. ***************** INCBUFF PSHX LDX PTR0 INX BRA INCDEC DECBUFF PSHX LDX PTR0 DEX INCDEC STX PTR0 PULX RTS * * ***************** * WSKIP() - Read from the msgbuff until a * non whitespace (space, comma, tab) character * is found. Returns ptrbuff pointing to the * first non-whitespace character and a holds * that character. WSKIP also compares a to * $0D (CR) and cond codes indicating the * results of that compare. ***************** WSKIP JSR READBUFF ;read character BSR WCHEK BNE WSKIP1 ;jump if not wspc JSR INCBUFF ;move pointer BRA WSKIP ;loop WSKIP1 CMPA #$0D ;is CR RTS * ***************** * WCHEK(a) - Returns z=1 if a holds a * whitespace character, else z=0. ***************** WCHEK CMPA #$2C ;comma BEQ WCHEK1 CMPA #$20 ;space BEQ WCHEK1 CMPA #$09 ;tab WCHEK1 RTS * ***************** * DCHEK(a) - Returns Z=1 if a = whitespace * or carriage return. Else returns z=0. ***************** DCHEK BSR WCHEK BEQ DCHEK1 ;jump if whitespace CMPA #$0D DCHEK1 RTS * * COPRESET: ;reset cop MOVB #$55,armcop MOVB #$AA,armcop RTS * HELP EQU * LDX #HELPMSG JSR OUTSTRG ;print help screen RTS * SignOn: LDX #MSG1 ;BUFFALO message JSR OUTSTRG RTS * CLS LDX #MSG17 JSR OUTSTRG RTS * * * * MONTH TABLE - A list of the number of days in * each month * MonthTbl FDB 0 FDB 0 FDB 31 ;January FDB 59 ;Febuary FDB 90 ;March FDB 120 ;April FDB 151 ;May FDB 181 ;June FDB 212 ;July FDB 243 ;August FDB 273 ;September FDB 304 ;October FDB 334 ;November Dec FDB 365 ;December * * MONTH TABLE - YEAP YEAR * MonthTbl_L EQU * FDB 0 FDB 0 FDB 31 FDB 60 ;Feb+1 FDB 91 ;March+1 FDB 121 ;April+1 FDB 152 ;May+1 FDB 182 ;June+1 FDB 213 ;July+1 FDB 244 ;Aug+1 FDB 274 ;Sept+1 FDB 305 ;Oct+1 FDB 335 ;Nov+1 DecYLr FDB 366 ;Dec+1 * * Days_of_Week: FDB MSG63 ;SUNDAY FDB MSG64 FDB MSG65 FDB MSG66 FDB MSG67 FDB MSG68 FDB MSG69 FDB MSG9 * * INCLUDE "main.i" INCLUDE "Zeller64.i" * INCLUDE "Mul16x16.i" * INCLUDE "Div32x16.i" INCLUDE "HTOD.I" INCLUDE "utility.i" INCLUDE "io.i" * INCLUDE "io_irq.i" ;NOTE: cannot use SCI0 and * ;D-Bug12 so can't use io_irq.i * ************************************************** * routine to implement general purpose timer, with * 1 ms increments call with desired time period in * acc. Routine implements a 1 ms loop. * time1ms staa st_lo LDAA #$80 STAA tscr ;enable timer system LDAA #C2F ORAA tios ;timer two selected STAA tios ;...as output compare pshb timer2: ldd tcnt addd #1*MSec*PRESCALE std tc2 ldaa #C2F staa tflg1 ; clear flag timeloop: brclr tflg1, #C2F, timeloop ldaa #C2F staa tflg1 ; clear flag dec st_lo ;dec count on each underflow bne timer2 ;exit when time_count = 0 pulb rts * * wait for 100 milliseconds wait100ms: psha ldaa #100 bsr time1ms pula rts * * wait for 10 milliseconds DLY10MS: wait10ms: psha ldaa #10 bsr time1ms pula rts * * * wait for 1 millisecond wait1ms: psha ldaa #1 bsr time1ms pula rts * ********************************************************* * If we have a DS1302 chip installed then load driver * * else * * simulate to demostrate the rest of the software. * ********************************************************* IFDEF DS1302 INCLUDE "DS1202.I" ELSE Get_Seconds: lda #$00 rts Get_Minutes: lda #$00 rts Get_Hour: lda #%10000111 rts Get_Date: lda #$23 rts Get_Month: lda #$07 rts Get_Year: lda #$03 rts ENDIF ************************************************************ * ************************* * MESSAGE SCREEN * ************************* * MSG1 FCC 'Demonstration of DS1302 Real Time Clock' FCB CR FCC 'Type HELP for commands' FCB CR FCB EOT MSG17 FCB $1B FCC '[2J' FCB EOT MSG20 FCC 'Current time is ' FCB EOT MSG21 FCC 'Enter new time: ' FCB EOT MSG22 FCC 'Current date is ' FCB EOT MSG23 FCC 'Enter new date (mm-dd-yy) ' FCB EOT * MSG63 FCC 'SUNDAY ' FCB EOT MSG64 FCC 'MONDAY ' FCB EOT MSG65 FCC 'TUESDAY ' FCB EOT MSG66 FCC 'WEDNESDAY ' FCB EOT MSG67 FCC 'THURSDAY ' FCB EOT MSG68 FCC 'FRIDAY ' FCB EOT MSG69 FCC 'SATURDAY ' FCB EOT MSG79 FCC 'The JULIAN Date is ' FCB EOT HELPMSG: FCC 'TIME JULIAN DATE' FCB CR,CR FCC 'HOUR [h] MONTH [m]' FCB CR FCC 'MINUTE [m] DAY [d]' FCB CR FCC ' YEAR [y]' FCB CR FCB EOT ******************************