Quantcast
Channel: MEL PICBASIC Forum
Viewing all articles
Browse latest Browse all 4787

Urgent assistance rqd - RTC stripdown

$
0
0
Guys

I've somehow managed to exceed the memory available in the PIC, which given the number of include files that are used It's quite possible.

Anyway, I'm trying to strip out a lot of the bloat in the code, the biggest part is the RTC routine, which was originally from DT when I was developing the original code way back when I was more of a green around the gills than I am now. But I'm not sure if I strip it down to just the time settings that I will screw up completely.

Code:

RTClock:

        Data @150,74,97,110,70,101,98,77,97,114,65,112,114
                ' Jan Feb Mar Apr
        Data 77,97,121,74,117,110,74,117,108,65,117,103
                ' May Jun Jul Aug
        Data 83,101,112,79,99,116,78,111,118,68,101,99
                ' Sep Oct Nov Dec
        Data 84,117,101,87,101,100,84,104,117,70,114,105
                ' Tue Wed Thu Fri
        Data 83,97,116,83,117,110,77,111,110
                ' Sat Sun Mon

'        Start Program
'        =============
goto JumpStart

'        Subroutine Converts back to BCD
'        -------------------------------
               
ConvertBCD:
        CounterB=CounterA DIG 1                        ' CounterA is the entry variable
        CounterB=CounterB<<4                          ' CounterB holds the converted BCD result on exit
        CounterB=CounterB+CounterA DIG 0
        Return

'        Subroutine Displays Month at current Cursor Position
'        ----------------------------------------------------
                               
DisplayMonth:                                      ' CounterB holds Month (1-12) this value is destroyed by the routine, additionally uses CounterA and CounterD variables
        CounterB=CounterB*3-3                                ' Convert BCD Month to EEPROM Start Address
DisplaySequence:
        For CounterA=CounterB to CounterB+2                               
                Read (CounterA+150),CounterD                ' Read and Display Month
                LCDOut CounterD
                Next CounterA
        Return

'        Subroutine works out Number of Days in the Month
'        ------------------------------------------------
' SetYear - entry variable containing year (0-99)
' SetMonth - entry Variable Containing Month (1-12)
' CounterA - exits with number of days
FindDays:
        LookUp SetMonth -1,[31,28,31,30,31,30,31,31,30,31,30,31],CounterA  ' this line gives the 'usual' days of the Month               
' Section below adjusts for Leap-Year
        If SetMonth=2 then
                If (SetYear&$03)=0 then CounterA=29
                endif
        Return
       
'        Subroutine waits until user reseases Set Button
'        -----------------------------------------------
SetButtonRelease:
        LCDOut $FE,1
        While SetButton=0:Wend
        Pause 200                                            ' Small pause to kill any Key-Bounce
        Return

'        End of Subroutine Nest Area
'        ---------------------------

'        Actual Start of Real Program
'        ============================
JumpStart:

Pause 200                                                    ' Timeout for LCD to settle

'        Time & Date Display Loop
'        ========================
ReDisplay:
                    LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250 ' Initialize LCD
ReDisplayLoop:
'        Read RTC
'        --------
I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]

'        Decide if Setup Required/Wanted
'        -------------------------------
        If RTCSec.7=1 then goto SetUpPreset

        If SetButton=0 then                                ' If Set Button is pressed, User will be taken to the Setup Menu.                                 
                Gosub SetButtonRelease
                goto Setup
                endif       
If DecButton=0 then
Gosub SetButtonRelease
                goto mainmenu
                endif        '
'        Display RTC
'        -----------

'        Display Time on Line 1
'        ----------------------
        LCDOut $FE,$80
        If RTCHour.6=1 then                                ' Work-Out 12 or 24 hour Display for Hours                       
                CounterA=(RTCHour>>4)&$01
                else
                CounterA=(RTCHour>>4)&$03
                endif
        CounterA=CounterA*10+(RTCHour&$0F)
        If RTCHour.6=1 then                                ' Display Hours appropriately for 12 or 24 hour Mode                       
                LCDOut #CounterA
                else
                LCDOut #CounterA Dig 1,#CounterA Dig 0
                endif
        LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F,":"
        LCDOut #(RTCSec>>4)&$0F,#RTCSec&$0F," "
        IF RTCHour.6=1 then
                If RTCHour.5=1 then
                        LCDOut "PM"
                        else
                        LCDOut "AM"
                        endif
                endif
'        Display Day of Week on Line 2
'        -----------------------------
        LCDOut " ",$FE,$C0
        CounterB=RTCWDay*3+33                                    ' Convert BCD WeekDay to EEPROM Start Address
        Gosub DisplaySequence                                    ' Display 3 character sequence from EEPROM
'        Display Date on Line 2
'        ----------------------
        LCDOut " ",#(RTCDay>>4)&$0F,#RTCDay&$0F," "
        CounterB=((RTCMonth>>4)&$0F)*10+(RTCMonth&$0F)
        Gosub DisplayMonth
        LCDOut " 20",#(RTCYear>>4)&$0F,#RTCYear&$0F,$FE,$80
        Pause 250               
        Goto ReDisplayLoop

'        Clock and Calandar Settings
'        ===========================
' Default setting preset to the moment this program first born
                '
SetupPreset:
        RTCSec=$00                ' Seconds preset to 00
        RTCMin=$00                ' Minutes preset to 00
        RTCHour=$14                ' Hours preset to 14'00
        RTCWDay=$01                ' Weekday preset to 01
        RTCDay=$12                ' Day preset 12
        RTCMonth=$06        ' Months preset to June
        RTCYear=$15                ' Year preset to 2015
        RTCCtrl=$10                ' Control preset to output 1 second 'Tick' on SQWpin
'
'        Convert the Current BCD Data to Something easier to Edit
'        --------------------------------------------------------
Setup:
        SetTime=RTCHour.6        ' Determines 12/24 Hour mode
        If SetTime=1 then
                SetHour=(RTCHour>>4)&$01
                                ' if 12-hour mode
                else
                SetHour=(RTCHour>>4)&$03
                                ' if 24 hour mode
                endif
        SetHour=SetHour*10+(RTCHour&$0F)
        If SetTime=1 then
                If RTCHour.5=1 then
                        If SetHour<12 then SetHour=SetHour+12
                                ' Add-in the AM/PM indicator
                        else
                        If SetHour=12 then SetHour=0
                        endif
                endif
        SetMin=((RTCMin>>4)&$0F)*10+(RTCMin&$0F)
        SetSec=((RTCSec>>4)&$0F)*10+(RTCSec&$0F)
        SetYear=((RTCYear>>4)&$0F)*10+(RTCYear&$0F)
        SetMonth=((RTCMonth>>4)&$0F)*10+(RTCMonth&$0F)
        SetDay=((RTCDay>>4)&$0F)*10+(RTCDay&$0F)

'        Setup Menu Loop
'        ---------------
        CounterC=0                ' Set to Start of Setup (seven steps from 0 to 6)
        TimeOut=0                ' Zero the Time-Out counter
SetupLoop:
        LCDOut $FE,1,"Set "

'        First Display the Menu Prompts
'        ------------------------------

        If CounterC=0 then
                LCDOut "Mode"
                endif
        If CounterC=1 then
                LCDOut "Hours"
                endif
        If CounterC=2 then
                LCDOut "Minutes"
                endif
        If CounterC=3 then
                LCDOut "Seconds"
                endif
        If CounterC=4 then
                LCDOut "Year : 20"
                endif
        If CounterC=5 then
                LCDOut "Month"
                endif
        If CounterC=6 then
                LCDOut "Day"
                endif
        If CounterC<>4 then LCDOut " :"
'        Now Display the Data
'        --------------------
SetupDisplayLoop:
'        12/24 Hour Option
'        -----------------
        If CounterC=0 then
                LCDOut $FE,$8B
                If SetTime=0 then
                        LCDOut "24HR"
                        else
                        LCDOut "12HR"
                        endif
                LCDOut $FE,$8B
                endif
'        Hours
'        -----
'        Hours are tricky because of the 12/24 & AM/PM bit
'        so we have to reconvert 1-24 back to 1-12 plus AM/PM
        If CounterC=1 then
                CounterA=SetHour
                If SetTime=1 then
                        LCDOut $FE,$8E
                                ' Display AM/PM bit
                        If CounterA<12 then
                                LCDOut "AM"
                                else
                                LCDOut "PM"
                                endif
                        If CounterA=0 then CounterA=12
                        If CounterA>12 then CounterA=CounterA-12
                        endif
                LCDOut $FE,$8C,#CounterA
                If CounterA<10 then LCDOut " "                       
                LCDOut $FE,$8C
                endif
'        Minutes
'        -------
        If CounterC=2 then
                LCDOut $FE,$8E,#SetMin
                If SetMin<10 then LCDOut " "
                LCDOut $FE,$8E
                endif
'        Seconds
'        -------
        If CounterC=3 then
                LCDOut $FE,$8E,#SetSec
                If SetSec<10 then LCDOut " "
                LCDOut $FE,$8E
                endif
'        Year
'        ----
        If CounterC=4 then
                LCDOut $FE,$8D,#SetYear DIG 1,#SetYear Dig 0
                LCDOut $FE,$8D
                endif
'        Month
'        -----
                       
        If CounterC=5 then
                LCDOut $FE,$8C
                CounterB=SetMonth
                Gosub DisplayMonth
                LCDOut $FE,$8C
                endif

'        Day
'        ---
        If CounterC=6 then
                LCDOut $FE,$8A,#SetDay
                If SetDay<10 then LCDOut " "
                LCDOut $FE,$8A
                endif
'        The Data-Entry Bit
'        ------------------
SetupEntryLoop:
'        Decrement Button Pressed
'        ------------------------
        If DecButton=0 then
'        12/24 Clock Selection
'        ---------------------
                If CounterC=0 then
                        If SetTime=0 then
                                SetTime=1
                                else
                                SetTime=0
                                endif
                        endif
'        Decrement Hours
'        ---------------
                If CounterC=1 then
                        If SetHour=0 then
                                SetHour=23
                                else
                                SetHour=SetHour-1
                                endif
                        endif
'        Decrement Minutes
'        -----------------
                If CounterC=2 then
                        If SetMin=0 then
                                SetMin=59
                                else
                                SetMin=SetMin-1
                                endif
                        endif
'        Decrement Seconds
'        -----------------
'        Kinda overkill to include setting seconds,
'        but if you got codespace to burn...
                If CounterC=3 then
                        If SetSec=0 then
                                SetSec=59
                                else
                                SetSec=SetSec-1
                                endif
                        endif
'        Decrement Years
'        ---------------
                If CounterC=4 then
                        If SetYear=0 then
                                SetYear=99
                                else
                                SetYear=SetYear-1
                                endif
                        endif
'        Decrement Month
'        ---------------
                If CounterC=5 then
                        If SetMonth=1 then
                                SetMonth=12
                                else
                                SetMonth=SetMonth-1
                                endif

                        Gosub FindDays
                        If SetDay>CounterA then SetDay=CounterA
                        endif
'        Decrement Days
'        --------------
                If CounterC=6 then
                        Gosub FindDays
                        If SetDay=1 then
                                SetDay=CounterA
                                else
                                SetDay=SetDay-1
                                endif
                        endif
                Pause ButtonRepeat
                TimeOut=0
                Goto SetUpDisplayLoop
                endif
'        Increment Button Pressed
'        ------------------------
               
        If IncButton=0 then
'        12/24 Clock Selection
'        ---------------------
                If CounterC=0 then
                        If SetTime=1 then
                                SetTime=0
                                else
                                SetTime=1
                                endif
                        endif
'        Increment Hours
'        ---------------
                If CounterC=1 then
                        If SetHour=23 then
                                SetHour=0
                                else
                                SetHour=SetHour+1
                                endif
                        endif
'        Increment Minutes
'        -----------------
                If CounterC=2 then
                        If SetMin=59 then
                                SetMin=0
                                else
                                SetMin=SetMin+1
                                endif
                        endif
'        Increment Seconds
'        -----------------
                If CounterC=3 then
                        If SetSec=59 then
                                SetSec=0
                                else
                                SetSec=SetSec+1
                                endif
                        endif
                                '
                                '        Increment Years
                                '        ---------------
                If CounterC=4 then
                        If SetYear=99 then
                                SetYear=0
                                else
                                SetYear=SetYear+1
                                endif
                        endif
'        Increment Month
'        ---------------
                If CounterC=5 then
                        If SetMonth=12 then
                                SetMonth=1
                                else
                                SetMonth=SetMonth+1
                                endif
                        Gosub FindDays
                        If SetDay>CounterA then SetDay=CounterA
                        endif

                If CounterC=6 then
                        Gosub FindDays
                        If SetDay=>CounterA then
                                SetDay=1
                                else
                                SetDay=SetDay+1
                                endif
                        endif
                Pause ButtonRepeat
                TimeOut=0
                Goto SetupDisplayLoop
                endif
'        Set Button Pressed
'        ------------------
        If SetButton=0 then
                CounterC=CounterC+1
                                ' Increment Menu Item
                TimeOut=0
                If CounterC>6 then
                                ' Save Data if all edit items exhaused
                        LCDOut $FE,1,"Memorised"

'        Save 12/24 Hours to BCD DS1307's Format
'        ---------------------------------------
                        CounterA=SetHour
                        If SetTime=1 then
                                If CounterA>12 then CounterA=CounterA-12
                                If CounterA=0 then CounterA=12
                                endif
                        Gosub ConvertBCD
                        RTCHour=CounterB
' Save the Hours Value
                        If SetTime=1 then
                                RTCHour.6=1
' Save the 12 Hour Mode Flag
                                If SetHour=>12 then RTCHour.5=1
' Save the 'PM' Flag
                                endif
'
'        Save Minutes
'        ------------
                        CounterA=SetMin
                        Gosub ConvertBCD
                        RTCMin=CounterB
'
'        Save Seconds
'        ------------
                        CounterA=SetSec
                        Gosub ConvertBCD
                        RTCSec=CounterB
'
'        Save Year
'        ---------
                        CounterA=SetYear
                        Gosub ConvertBCD
                        RTCYear=CounterB
'
'        Save Month
'        ----------
                        CounterA=SetMonth
                        Gosub ConvertBCD
                        RTCMonth=CounterB
'
'        Save Day
'        --------
                        CounterA=SetDay
                        Gosub ConvertBCD
                        RTCDay=CounterB
               
                        CounterA=SetYear+4
                        CounterB=SetMonth
                        If SetMonth<3 then
                                CounterA=CounterA-1
                                CounterB=CounterB+12
                                endif
                        CounterD=(SetDay+(153*CounterB-457)/5+365*CounterA+CounterA/4-CounterA/100+CounterA/400+2) MOD 7
                        RTCWDay=CounterD+1
'
'        Do the Business
'        ---------------

                I2CWrite SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]
                        Pause 1000
                        Gosub SetButtonRelease
                        Goto ReDisplay
                        endif
                Gosub SetButtonRelease
                Goto SetupLoop        ' Loop for Next Menu Item
                endif

All I'm after is the ability to set the hours and minutes for the current time... I don't need seconds, days, weeks months years etc....

Can someone either strip this code down, for me, or come up with a simple version. Do you have to write all the RTC variables in the string to the DS1307 chip ???

Viewing all articles
Browse latest Browse all 4787

Trending Articles