- LO2HI
- $20 EMIT
- HI2LO
- SUB #2,IP
- SUB #1,TOS
- 0= UNTIL
- MOV @RSP+,IP
-THEN
-MOV @PSP+,TOS \ -- drop n
-NEXT
-ENDCODE
-[THEN]
-
-[UNDEFINED] HERE [IF]
-CODE HERE
-MOV #HEREXEC,PC
-ENDCODE
-[THEN]
-
-[UNDEFINED] U.R [IF]
-: U.R \ u n -- display u unsigned in n width (n >= 2)
- >R <# 0 # #S #>
- R> OVER - 0 MAX SPACES TYPE
-;
-[THEN]
-
-$81EF DEVICEID @ U< ; search device ID: MSP430FR4133 or...
-DEVICEID @ $8241 U< ; ...MSP430FR2433
-=
-$830B DEVICEID @ U< ; MSP430FR21xx/23xx/24xx/25xx/26xx
-OR ; -- flag
-
-[IF]
-
-\ ==============================================================================
-\ driver for RTC without calendar
-\ ==============================================================================
-
- CREATE RTCSEC 2 ALLOT
- CREATE RTCMIN 2 ALLOT
- CREATE RTCHOUR 2 ALLOT
- CREATE RTCDOW 2 ALLOT
- CREATE RTCDAY 2 ALLOT
- CREATE RTCMON 2 ALLOT
- CREATE RTCYEAR 2 ALLOT
-
-\ ************************************\
- HDNCODE RTC_INT \ computes sec min hour day month year
-\ ************************************\
- ADD #2,RSP \ remove previous_SR
- BIT #1,&RTCIV \ clear RTC_IFG
- ADD.B #1,&RTCSEC \ sec+1
- CMP.B #60,&RTCSEC
- U>= IF
- MOV.B #0,&RTCSEC \ sec=0
- ADD.B #1,&RTCMIN \ min+1
- CMP.B #60,&RTCMIN
- U>= IF
- MOV.B #0,&RTCMIN \ min=0
- ADD.B #1,&RTCHOUR \ hour+1
- CMP.B #24,&RTCHOUR
- U>= IF
- MOV.B #0,&RTCHOUR \ hour=0
- ADD.B #1,&RTCDOW \ dow+1
- CMP.B #7,&RTCDOW
- U>= IF
- MOV.B #0,&RTCDOW \ dow=0
- THEN
- ADD.B #1,&RTCDAY \ day+1
- CMP.B #2,&RTCMON \ February month ?
-\ ------------------------\ here we compute leap year
- 0= IF \ yes
- COLON
- RTCYEAR @ 4 UMOD
- IF 29
- ELSE
- RTCYEAR @ 100 UMOD
- IF 30
- ELSE
- RTCYEAR @ 400 UMOD
- IF 29
- ELSE 30
- THEN
- THEN
- THEN
- HI2LO
- MOV @RSP+,IP
- MOV TOS,X \ X = 29|30
- MOV @PSP+,TOS
-\ ------------------------\
- ELSE \ month other than Feb
- MOV #31,X
- MOV.B &RTCMON,W
- CMP.B #8,W
- 0>= IF \ month >= August?
- ADD.B #1,W
- THEN
- BIT.B #1,W \
- 0<> IF
- ADD #1,X \ 31 days / month
- THEN
- THEN
- CMP.B X,&RTCDAY
- U>= IF \ max day of month is exceeded
- MOV.B #1,&RTCDAY \ day=1
- ADD.B #1,&RTCMON \ mon+1
- CMP.B #13,&RTCMON
- U>= IF
- MOV.B #1,&RTCMON \ mon=1
- ADD #1,&RTCYEAR \ year+1
- THEN
- THEN
- THEN
- THEN
- THEN \
- MOV @RSP+,PC \ RET to BACKGrouND routine, with GIE disabled
- ENDCODE
-
-\ ------------------------\
- HDNCODE STOP_RTC \ define STOP_RTC as new COLD_APP subroutine, called by {RTC}|WIPE|RST|COLD|SYS_failures.
-\ ------------------------\ ------------------------------------------
- CMP #RET_ADR,&{RTC}+8 \
- 0<> IF \ and only if RTC_APP is started by START_RTC
- MOV #{RTC}+10,X \
- MOV #RET_ADR,-2(X) \ restore {RTC}+8 default value
- MOV @X+,&RTC_VEC \ restore previous RTC_VEC content from {RTC}+10
- MOV @X+,&COLD+2 \ restore previous STOP_APP from {RTC}+12 to COLD_PFA
- MOV @X+,&WARM+2 \ restore previous INI_APP from {RTC}+14 to WARM_PFA
-\ MOV @X+,&SLEEP+2 \ restore previous BACKGND_APP from {RTC}+16 to SLEEP_PFA
- THEN
-\ ------------------------\
- MOV #0,&RTCCTL \ stops RTC and RTC_INT, see RTC15 in MSP430FR2xxx errata sheet
- MOV.B #XIN,X \ X = bit_position of XT1 Xtal
- BIC.B X,&XT1_SEL \ XIN as GPIO
- BIS.B X,&XT1_DIR \ XIN as output
- BIC.B X,&XT1_OUT \ RTC15 :"toggle twice XIN ouput"
- BIS.B X,&XT1_OUT \ "with at least 2 rising or falling edges".
- BIC.B X,&XT1_OUT \
- BIS.B X,&XT1_OUT \
- BIC.B X,&XT1_DIR \ restore default state of XIN
- BIS.B X,&XT1_SEL \ XIN as XT1 input
-\ ------------------------\
- MOV &COLD+2,PC \ 5 link (branch) to the previous STOP_APP subroutine,
-\ ------------------------\ then RET to MARKER_DOES or to COLD+4
- ENDCODE \
-\ ------------------------\
-
-\ ----------------------------------------\
- HDNCODE INI_RTC \ define INI_HDWR_APP called first by START_RTC then by WARM
-\ ----------------------------------------\ ---------------------------------------------------------
- CALL &{RTC}+14 \ call previous INI_APP (which sets TOS = RSTIV_MEM)
- CMP #0,&RTCCTL \ if RTCCTL = 0 = reset state, app is STOPPED and must to be started
- 0= IF \ and if RTCCTL <> 0, we don't restart app and no time is lost.
- MOV #$7F,&RTCMOD \ RTCMOD = 127
- BIT #-1,&RTCIV \ clear RTC_IFG
- MOV #%0010_0110_0100_0010,&RTCCTL \ starts RTC with XT1CLK/256, enables RTC_INT
- THEN
- MOV @RSP+,PC \ RET to BODYWARM|START_RTC
- ENDCODE \
-\ ----------------------------------------\
-
-\\ -------------------------------------------------------------------------------
-\\ WARNING! because RTC_INT have higher priority than eUSCI used for TERMINAL,
-\\ BACKGND_APP default subroutine execute pending RTC_INT, so you can download a file without RTC time lost.
-\\ but if you manualy type a command, pending RTC_INT may not be executed during this time.
-\\ -------------------------------------------------------------------------------
-\\ --------------------\
-\\ HDNCODE BACKGND_RTC \ define BACKGND_RTC to replace actual BACKGND_APP
-\\ --------------------\
-\ BEGIN \
-\ MOV &LPM_MODE,SR \ enter to SLEEP mode, waiting RTC_INT
-\ AGAIN \ loop back to BEGIN is executed before CPU shut down
-\\ --------------------\
-\ ENDCODE \
-\\ -------------------------------------------------------------------------------
-\\ WARNING! because unlinked, this BACKGND_APP doesn't execute XON, TERMINAL is MUTEd
-\\ but maybe that is what you want: RTC time keeps its accuracy.
-\\ -------------------------------------------------------------------------------
-
-\ --------------------------------\
- CODE START_RTC \ save current content of WARM_PFA, COLD_PFA, SLEEP_PFA, RTC_VEC
-\ --------------------------------\ then replace them by INI_RTC, STOP_RTC, BACKGND_RTC, RTC_INT then execute INI_RTC.
- CMP #STOP_RTC,&{RTC}+8 \ content of {RTC}+8 = STOP_RTC ?
- 0<> IF \ if not
- MOV #STOP_RTC,&{RTC}+8 \ STOP_RTC must be executed by MARKER_DOES of {RTC}, else RTC15 hangs out!
- MOV &RTC_VEC,&{RTC}+10 \ save content of RTC_VEC to {RTC}+10...
- MOV #RTC_INT,&RTC_VEC \ then set RTC_VEC with RTC_INT
- MOV &COLD+2,&{RTC}+12 \ save content of COLD_PFA to {RTC}+12...
- MOV #STOP_RTC,&COLD+2 \ ...and replace it by STOP_RTC, else RTC15 hangs out with Deep_RST!
- MOV &WARM+2,&{RTC}+14 \ save content of WARM_PFA to {RTC}+14...
- MOV #INI_RTC,&WARM+2 \ ...and replace it by INI_RTC
-\ MOV &SLEEP+2,&{RTC}+16 \ save content of SLEEP_PFA to {RTC}+16...
-\ MOV #BACKGND_RTC,&SLEEP+2 \ ...and replace it by BACKGND_RTC
- THEN \
- CALL #INI_RTC \
- MOV @IP+,PC \
-\ --------------------------------\
- ENDCODE
-\ --------------------------------\
-
- : TIME? \ display time
- RTCHOUR C@ 2 U.R $3A EMIT
- RTCMIN C@ 2 U.R $3A EMIT
- RTCSEC C@ 2 U.R