DS1337 - 12h to 24h mode


Closed Thread
Results 1 to 31 of 31

Hybrid View

  1. #1
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    I think your becoming a good case for the snippets are us award
    but if you intention is to just to set/reset 24 h mode on the chip

    Code:
     If(PortC.5 = 1) & (PortC.6 = 1) then Pause 1500
      If (PortC.5 = 1) & (PortC.6 = 1) then
       'IF hourly mode = AM
       I2CRead SDApin,SCLpin,$D0,$02,[RTCHour]  
       RTCHour.6 = ! RTCHour.6
       I2cwrite SDApin,SCLpin,$D0,$02,[RTCHour]     
      endif
     endif

  2. #2
    Join Date
    Sep 2006
    Posts
    747


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    Here is the full code.
    The display gosub is not being used, will be used when display in a 7 segment display.
    Now I am using a LCDout command to view my numbers

    Code:
    '////////////////////////////////////////////////////
    '////////////////// PROGRAM /////////////////////////
    '////////////////////////////////////////////////////
     I2CWRITE SDApin,SCLpin,$D0,$00,[$56,$59,$20,$00,$00,$00,$00,$00] ' Write to DS1337 to initialize RTC 
     pause 10
                 I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour]     ' bit 5 of hour is 1 for PM  , 0 for AM
                 pause 10
                 'RTCHour.5 = 1      'bit 5 is the AM/PM bit with logic high being PM   AND NOT USED
                ' RTCHour.6 = 0   '24h selected    ' for 12 or 24 h  mode ,  when high 12h mode is selected
                 'in 24 hour mode (=0)  bit 5 is used for hours 20 to 23
                 
                      I2CwRITE SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour]  
                       pause 10
                           
    Mainloop:
            I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour]  
            gosub bcd_to_bin 
            
            If (PortC.5 = 1) & (PortC.6 = 1) then Pause 1500
    	     If (PortC.5 = 1) & (PortC.6 = 1) then
                'IF hourly mode = AM
                I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour]  
                Pause 10
                     if RTCHour.6 = 1 then      'turn into 24h mode   therefore 1 to 11 converts to 13 to 23
                     point =2
    
                     RTCHour.6 = 0
                     endif
                     if RTCHour.6 = 0 then      'turn into 12h mode   therefore 13 to 23 converts to 1 to 11
                     point =3
                     RTCHour.6 = 1
                     endif
                I2cwrite SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour] 
                Pause 100
              endif
       
            temp1_min = RTCMin_temp1  
            m = temp1_min
            'PortA.0 =1
            'gosub display 
          '  PortA.0 =0
            
            temp2_min = RTCMin_temp2  
            n = temp2_min
          '  PortA.1 =1
          '  gosub display 
         '   PortA.1 =0  
             
            temp1_sec = RTCSec_temp1  
            o = temp1_sec
           ' PortA.2 =1
           ' gosub display 
           ' PortA.2 =0
            
            temp2_sec = RTCSec_temp2  
            p = temp2_sec
           ' PortA.4 =1
            'gosub display 
            'PortA.4 =0
    
            		lcdout $FE,1, "Time: ",  HEX2 RTCHour, ":", hex2 RTCmin ,":", HEX2 RTCsec 'in decimals... wow
    				lcdout $FE,$C0, dec TempVal , " :" ,dec RTCHour_temp1,":", dec RTCHour_temp2,":", dec point
    				Pause 150 
    				
        goto Mainloop
        end
    
        bcd_to_bin:
                      
         if (RTCHour.6 = 1 ) then      'bit 5 is used if RTCHour.6 = 0   ; 24h selected
           RTCHour.6 = 0
           RTCHour.5 = 0
         RTCHour_temp2 = $0F & RTCHour
         RTCHour_temp1= RTCHour >> 4 
         endif
         if (RTCHour.6 = 0 ) then 
         RTCHour_temp2 = %00001111 & RTCHour
         RTCHour_temp1= RTCHour >> 4                        ' Shift down four to read 2 BCD value
         TempVal = RTCHour_temp1 * 10 + RTCHour_temp2       ' this calculate the hours in decima
        
          if ( TempVal > 19 ) then 
                return
            else 
             RTCHour.5 = 0
             RTCHour_temp2 = $0F & RTCHour
             RTCHour_temp1= RTCHour >> 4 
             endif
          endif
             
         RTCMin_temp2 = $0F & RTCMin               ' Clear off the top four bits
         RTCMin_temp1= RTCMin >> 4                       ' Shift down four to read 2 BCD value
         
         RTCSec_temp2 = $0F & RTCSec                     ' Clear off the top four bits
         RTCSec_temp1= RTCSec >> 4                       ' Shift down four to read 2 BCD value
    
        return
    Last edited by lerameur; - 13th January 2015 at 21:28.

  3. #3
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    this may be better


    Code:
    If(PortC.5 = 1) & (PortC.6 = 1) then Pause 1500
      If (PortC.5 = 1) & (PortC.6 = 1) then
       'IF hourly mode = AM
       I2CRead SDApin,SCLpin,$D0,$02,[RTCHour] 
       temp1 = ((RTCHour>> 4) * 10) + (RTCHour& $0f)    , to binary
    
       if RTCHour.6=1  then   ' 12h mode 
            if RTCHour.5=1then  temp1=temp1+12  ' pm
       
       else  
             if temp1 > 12 then
             temp1=temp1-12
       endif
    
      rtcHOUR = ((temp1 / 10) << 4) + (tEmp1 // 10)  ' to bcd
      
    
     RTCHour.6 = ! RTCHour.6  '  set/reset   24h mode
    
       I2cwrite SDApin,SCLpin,$D0,$02,[RTCHour]     
      endif
     endif
    Last edited by richard; - 13th January 2015 at 22:48. Reason: add som comments

  4. #4
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    no I'm still wrong, why is time so complicated

    try

    Code:
    
    
    Code:
    If(PortC.5 = 1) & (PortC.6 = 1) then Pause 1500
      If (PortC.5 = 1) & (PortC.6 = 1) then
       I2CRead SDApin,SCLpin,$D0,$02,[RTCHour]
      if RTCHour.6=1 then
           temp1 = (((RTCHour&$1f)>> 4) * 10) + (RTCHour& $0f)    ' to binary  mask off am/pm
         else
           temp1 = ((RTCHour>> 4) * 10) + (RTCHour& $0f)    ' to binary
         endif
       if RTCHour.6=1  then   ' 12h mode 
            if RTCHour.5=1then  temp1=temp1+12  ' pm
       
       else  
             if temp1 > 12 then
             temp1=temp1-12
       endif
    
      rtcHOUR = ((temp1 / 10) << 4) + (temp1 // 10)  ' to bcd
      
    
     RTCHour.6 = ! RTCHour.6  '  set/reset   24h mode
    
       I2cwrite SDApin,SCLpin,$D0,$02,[RTCHour]     
      endif
     endif

  5. #5
    Join Date
    Sep 2006
    Posts
    747


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    Hi Richard,

    Trie both code with same error,
    It does seem to go from 19h to 7h.
    When I attempt to go back to 19H I get a four appearing before the hours .. like so : 7:01:01 to 47:01:01 then the four disappear to come back to 7:01:01 ( yes minutes and seconds are still incrementing. But this is weird that the four would just leave by its own !

    Also the datasheet specifies that the bit 5 hour.5 is used for the hours between the 20 to 23 hours.
    Last edited by lerameur; - 13th January 2015 at 23:18.

  6. #6
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    the "4 " probably comes from the fact that temp1 is used in you display routine and its getting messed with by my code

    make a new byte var temp12 for use in the 12/24 routine in place of temp1


    but it should go to 19h not stay at 7h check if the am/pm is getting cleared when 24h mode is selected
    I have to go to work for a while

  7. #7
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    Give this a whirl.

    Code:
    rtcAMPM    var bit   ' Storage flag to indicate AM or PM ; 0=AM, 1=PM
    hourmode  var bit   ' Storage flag for RTC 12/24 hour mode ; 0=24Hr, 1=12Hr
    BCDResult  var byte  ' Storage for temporary result for BCD Conversions
    
    
    If(PortC.5 = 1) & (PortC.6 = 1) then Pause 1500
      If (PortC.5 = 1) & (PortC.6 = 1) then
       I2CRead SDApin,SCLpin,$D0,$02,[RTCHour]
       hourmode = RTCHour.6
       if hourmode = 1 then          ' Is the RTC set for 12-hour mode
        rtcAMPM = RTCHour.5          ' Assign AM/PM
        RTCHour = RTCHour & %00011111  ' Bits 4-0 = Hours  0-12
       endif
      BCDResult = RTCHour
      gosub Bcd2Dec
      
      if hourmode = 1 then  '12Hr
        if rtcAMPM = 1 then 'PM 
            BCDResult = BCDResult + 12  'PM
        endif
      else
        if BCDResult > 12 then 
            BCDResult = BCDResult - 12
            rtcAMPM = 1
        else
            rtcAMPM = 0
        endif
      endif
      gosub Dec2Bcd
      RTCHour = BCDResult
      hourmode = ! hourmode
      I2cwrite SDApin,SCLpin,$D0,$02,[RTCHour]
      pause 10
      I2cwrite SDApin,SCLpin,$D0,$02,[RTCHour]  ' Need to write twice because you changed the mode bit
      
             
      
     Bcd2Dec:
    ' Subroutine to convert BCD (2 hex digits) to Decimal
    ' Make sure to set BCDResult with parameter value before calling this sub  
    ' Result is stored in BCDResult
    
        BCDResult = (((BCDResult >> 4) * 10) + (BCDResult & $0f))
        
        return
        
    Dec2Bcd:
    ' Subroutine to convert Decimal to BCD (2 hex digits)
    ' Make sure to set BCDResult with parameter value before calling this sub  
    ' Result is stored in BCDResult
         
        BCDResult = (((BCDResult / 10) << 4) | (BCDResult // 10))
        
        return
    Regards,
    TABSoft

  8. #8
    Join Date
    Sep 2006
    Posts
    747


    Did you find this post helpful? Yes | No

    Default Re: DS1337 - 12h to 24h mode

    Thanks for all the help.
    I just tried your code tabsoft, work very good from 18H to 7H, but not the opposite.
    hourmode = not hourmode
    but still I print out on the LCD that specific bit and I always get a 1 ...
    wird.. I also have RTChour output in binary and I only get 111 (7) and not 100111 as I thought ..
    Last edited by lerameur; - 14th January 2015 at 00:59.

Similar Threads

  1. 12H format setting for DS1307
    By larzazral in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 23rd February 2010, 07:34
  2. example code for DS1337
    By TONIGALEA in forum mel PIC BASIC Pro
    Replies: 25
    Last Post: - 8th December 2009, 21:16
  3. Code for DS1337
    By Fernanda in forum Off Topic
    Replies: 2
    Last Post: - 21st July 2008, 20:18
  4. PBPro for 16-bit PICs (24F/24H/DSPICs)?
    By Sergeant in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 20th April 2007, 20:18
  5. DS1337 Problem
    By snow in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 9th January 2005, 12:17

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts