DS3231 BCDTOASCII or [hours/16*10+hours//16]

JoeFromOzarks

Senior Member
Howdy folks!

What am I doing wrong here? Using a 14M2 and the DS3231 Clock PCB. At 12:29:10 BCDTOASCII returns 1<:29:10 while bVal14 = hours/16*10+hours//16 returns 12:29:10 correctly, as shown. The DS3231 is returning a BCD value, isn&#8217;t it?

Code:
[color=Navy]#PICAXE [/color][color=Black]14M2[/color]
[color=Navy]#NO_DATA
#TERMINAL 4800[/color]

[color=Blue]SYMBOL [/color][color=Purple]hours      [/color][color=DarkCyan]= [/color][color=Purple]b0 [/color]
[color=Blue]SYMBOL [/color][color=Purple]mins       [/color][color=DarkCyan]= [/color][color=Purple]b1 [/color]
[color=Blue]SYMBOL [/color][color=Purple]secs       [/color][color=DarkCyan]= [/color][color=Purple]b2 [/color]
[color=Blue]SYMBOL [/color][color=Purple]dow        [/color][color=DarkCyan]= [/color][color=Purple]b3 [/color]
[color=Blue]SYMBOL [/color][color=Purple]month      [/color][color=DarkCyan]= [/color][color=Purple]b4 [/color]
[color=Blue]SYMBOL [/color][color=Purple]day        [/color][color=DarkCyan]= [/color][color=Purple]b5 [/color]
[color=Blue]SYMBOL [/color][color=Purple]year       [/color][color=DarkCyan]= [/color][color=Purple]b6 [/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal7      [/color][color=DarkCyan]= [/color][color=Purple]b7[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal8      [/color][color=DarkCyan]= [/color][color=Purple]b8[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal9      [/color][color=DarkCyan]= [/color][color=Purple]b9[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal10     [/color][color=DarkCyan]= [/color][color=Purple]b10[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal11     [/color][color=DarkCyan]= [/color][color=Purple]b11[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal12     [/color][color=DarkCyan]= [/color][color=Purple]b12[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal13     [/color][color=DarkCyan]= [/color][color=Purple]b13[/color]
[color=Blue]SYMBOL [/color][color=Purple]bVal14     [/color][color=DarkCyan]= [/color][color=Purple]b14[/color]

[color=Blue]PAUSE [/color][color=Navy]3000[/color]
[color=Blue]HI2Csetup I2Cmaster[/color][color=Black], [/color][color=Navy]%11010000[/color][color=Black], [/color][color=Blue]I2Cslow[/color][color=Black], [/color][color=Blue]I2Cbyte  [/color][color=Green]' DS3231[/color]
[color=Blue]PAUSE [/color][color=Navy]1000[/color]

[color=Blue]DO
  HI2Cin [/color][color=Navy]$0[/color][color=Black],[/color][color=Blue]([/color][color=Purple]secs[/color][color=Black],[/color][color=Purple]mins[/color][color=Black],[/color][color=Purple]hours[/color][color=Black],[/color][color=Purple]dow[/color][color=Black],[/color][color=Purple]day[/color][color=Black],[/color][color=Purple]month[/color][color=Black],[/color][color=Purple]year[/color][color=Blue]) [/color][color=Green]' fetch time and date from clock
  [/color][color=Blue]PAUSE [/color][color=Navy]5
  [/color][color=Green]' --- Actual time: 12:29:xx

  [/color][color=Blue]BCDTOASCII [/color][color=Purple]hours[/color][color=Black],[/color][color=Purple]bVal8[/color][color=Black],[/color][color=Purple]bVal7 
  [/color][color=Blue]BCDTOASCII [/color][color=Purple]mins[/color][color=Black],[/color][color=Purple]bVal10[/color][color=Black],[/color][color=Purple]bVal9 
  [/color][color=Blue]BCDTOASCII [/color][color=Purple]secs[/color][color=Black],[/color][color=Purple]bVal12[/color][color=Black],[/color][color=Purple]bVal11
  [/color][color=Blue]SERTXD ([/color][color=Red][PLAIN]"[1]"[/PLAIN][/color][color=Black],[/color][color=Purple]bVal8[/color][color=Black],[/color][color=Purple]bVal7[/color][color=Black],[/color][color=Red]":"[/color][color=Black],[/color][color=Purple]bVal10[/color][color=Black],[/color][color=Purple]bVal9[/color][color=Black],[/color][color=Red]":"[/color][color=Black],[/color][color=Purple]bVal12[/color][color=Black],[/color][color=Purple]bVal11[/color][color=Black],[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF)

  [/color][color=Purple]bVal14 [/color][color=DarkCyan]= [/color][color=Purple]hours[/color][color=DarkCyan]/[/color][color=Navy]16[/color][color=DarkCyan]*[/color][color=Navy]10[/color][color=DarkCyan]+[/color][color=Purple]hours[/color][color=DarkCyan]//[/color][color=Navy]16
  [/color][color=Blue]SERTXD ([/color][color=Red][PLAIN]"[2]"[/PLAIN][/color][color=Black],#[/color][color=Purple]bVal14[/color][color=Black],[/color][color=Red]":"[/color][color=Black],[/color][color=Purple]bVal10[/color][color=Black],[/color][color=Purple]bVal9[/color][color=Black],[/color][color=Red]":"[/color][color=Black],[/color][color=Purple]bVal12[/color][color=Black],[/color][color=Purple]bVal11[/color][color=Black],[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF[/color][color=Black],[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF)

  PAUSE [/color][color=Navy]1000[/color]
[color=Blue]LOOP[/color]

[color=Green]#REM
Terminal Window Display:

[PLAIN][FC][1]0<:29:10
[2]12:29:10

[1]0<:29:11
[2]12:29:11

[1]0<:29:12
[2]12:29:12[/PLAIN]

#ENDREM[/color]
Terminal Window display:
[1]0<:29:10
[2]12:29:10

[1]0<:29:11
[2]12:29:11

[1]0<:29:12
[2]12:29:12



Thank you for your help!

:) joe
 

techElder

Well-known member
Joe, I would think that you might have answered your own question.

If the second way works, doesn't that mean that you aren't receiving BCD in the "hours" variable?

You can print that value out and see.

PS. I don't have access to the info I need right now.
 

hippy

Technical Support
Staff member
As Texasclodhopper says, the result you are seeing suggests the raw data is not BCD, has a nibble value which exceeds 9.

"bVal14 = hours/16*10+hours//16" is flawed as a BCD to decimal calculation as PICAXE maths is strictly left to right.

Output the raw decimal / binary value to see what it actually is and should show.
 

JoeFromOzarks

Senior Member
The documentation says BCD. "The contents of the time and calendar registers are in the binary-coded decimal (BCD) format."

ASCII:
0<
12

DECIMAL:
048 060
049 050

HEX:
30 3C
31 32


@Texasclodhopper I agree, but I need a break to clear my brain.

@Hippy I didn't think "bVal14 = hours/16*10+hours//16" was correct. :)

@Besqueut Your formula is what I initially used, but it too returns flaky data. GIGO maybe?

Thank you, I still have some hammering to accomplish!

:) joe
 

Attachments

Last edited:

eggdweather

Senior Member
Before you do this:
BCDTOASCII hours,bVal8,bVal7
do:
hours = hours & $0F ; to strip off the high nibble that contains unwanted information
BCDTOASCII hours,bVal8,bVal7

Do the same for minutes and secs too.
 

JoeFromOzarks

Senior Member
Before you do this:
BCDTOASCII hours,bVal8,bVal7
do:
hours = hours & $0F ; to strip off the high nibble that contains unwanted information
BCDTOASCII hours,bVal8,bVal7

Do the same for minutes and secs too.
@eggdweather For hours=12 and "hours = hours & $0F" then hours=2 which isn't correct.

:) joe
 

eggdweather

Senior Member
@eggdweather For hours=12 and "hours = hours & $0F" then hours=2 which isn't correct.

:) joe
Ok Joe, yes I was wrong
Hours needs to be AND $3F to strip off extra data, then convert from BCD to ASCII
Minutes needs to be AND $7F to strip off extra data, then convert from BCD to ASCII
Secs the same as minutes.
If you BCDTOASCII without doing this, you will get results that are not expected.
 

westaust55

Moderator
For the hours as read in BCD mode you need to know if running in 12 or 24 hour mode.
In 12 hour mode
Hours = hours AND $1F
In 24 hour mode
Hours = hours AND $3F

Bit6 is a 12 / 24 hour mode flag
Bit5 is 10's for 24hr mode or AM / PM indicator
For 24 hr mode bit6 =0 so it it not essential to mask off any bits.
 
Last edited:

JoeFromOzarks

Senior Member
Just horsing around, I banged out the following code and ran it on three flaky clocks. The first time I ran it, the clock displayed the odd characters in the time, all subsequent tests the clocks displayed perfectly. What have I done????? :)

Code:
[color=Navy]#PICAXE [/color][color=Black]14M2[/color]
[color=Navy]#NO_DATA
#TERMINAL 4800[/color]
[color=Green];
; Program to write increment HOUR 0-23 to clock chip, pause, then read the time and display it.
; Part of the "why is this clock PCB disturbing my day?" project.
;
; Sets time from 00hrs to 23hrs then END. 
;
; =============================================================[/color]
[color=Blue]SYMBOL [/color][color=Black]bLoop    [/color][color=DarkCyan]= [/color][color=Purple]b0[/color]
[color=Blue]SYMBOL [/color][color=Black]bNewHour [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]SYMBOL [/color][color=Black]hours    [/color][color=DarkCyan]= [/color][color=Purple]b3 [/color]
[color=Blue]SYMBOL [/color][color=Black]mins     [/color][color=DarkCyan]= [/color][color=Purple]b4[/color]
[color=Blue]SYMBOL [/color][color=Black]secs     [/color][color=DarkCyan]= [/color][color=Purple]b5[/color]
[color=Blue]SYMBOL [/color][color=Black]dow      [/color][color=DarkCyan]= [/color][color=Purple]b6[/color]
[color=Blue]SYMBOL [/color][color=Black]month    [/color][color=DarkCyan]= [/color][color=Purple]b7[/color]
[color=Blue]SYMBOL [/color][color=Black]day      [/color][color=DarkCyan]= [/color][color=Purple]b8[/color]
[color=Blue]SYMBOL [/color][color=Black]year     [/color][color=DarkCyan]= [/color][color=Purple]b9[/color]
[color=Blue]SYMBOL [/color][color=Black]bVal0    [/color][color=DarkCyan]= [/color][color=Purple]b10[/color]
[color=Blue]SYMBOL [/color][color=Black]bVal1    [/color][color=DarkCyan]= [/color][color=Purple]b11 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal2    [/color][color=DarkCyan]= [/color][color=Purple]b12 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal3    [/color][color=DarkCyan]= [/color][color=Purple]b13 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal4    [/color][color=DarkCyan]= [/color][color=Purple]b14 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal5    [/color][color=DarkCyan]= [/color][color=Purple]b15 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal6    [/color][color=DarkCyan]= [/color][color=Purple]b16 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal7    [/color][color=DarkCyan]= [/color][color=Purple]b17 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal8    [/color][color=DarkCyan]= [/color][color=Purple]b18 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal9    [/color][color=DarkCyan]= [/color][color=Purple]b19 [/color]
[color=Blue]SYMBOL [/color][color=Black]bVal10   [/color][color=DarkCyan]= [/color][color=Purple]b20[/color]
[color=Blue]SYMBOL [/color][color=Black]bVal13   [/color][color=DarkCyan]= [/color][color=Purple]b21[/color]
[color=Blue]SYMBOL [/color][color=Black]bVal14   [/color][color=DarkCyan]= [/color][color=Purple]b22[/color]
[color=Blue]SYMBOL [/color][color=Black]oDisplay      [/color][color=DarkCyan]= [/color][color=Blue]B.5     [/color][color=Green]' (IC Leg 8)[/color]
[color=Blue]SYMBOL [/color][color=Black]cBaud         [/color][color=DarkCyan]= [/color][color=Blue]N2400_4 [/color][color=Green]' baud rate for RevEd OLED Display[/color]
[color=Blue]SYMBOL [/color][color=Black]cDispPAUSE    [/color][color=DarkCyan]= [/color][color=Navy]1       [/color][color=Green]' PAUSE for Display
; =============================================================[/color]
[color=Black]INIT:
  [/color][color=Blue]PAUSE [/color][color=Navy]2000   [/color][color=Green]' wait for clock and OLED to power up
  [/color][color=Blue]HI2Csetup I2Cmaster[/color][color=Black], [/color][color=Navy]%11010000[/color][color=Black], [/color][color=Blue]I2Cslow[/color][color=Black], [/color][color=Blue]I2Cbyte  [/color][color=Green]' DS3231
  [/color][color=Blue]SEROUT [/color][color=Black]oDisplay,cBaud,[/color][color=Blue]([/color][color=Navy]254[/color][color=Black],[/color][color=Navy]1[/color][color=Blue])   [/color][color=Green]' initialize the display and clear 
  [/color][color=Blue]PAUSE [/color][color=Navy]60
  [/color][color=Blue]SEROUT [/color][color=Black]oDisplay,cBaud,[/color][color=Blue]([/color][color=Navy]254[/color][color=Black],[/color][color=Navy]128[/color][color=Blue]) [/color][color=Green]' Command: Display on ROW 0, COL 0
  [/color][color=Blue]PAUSE [/color][color=Navy]1000
  [/color][color=Blue]SERTXD (CR[/color][color=Black],[/color][color=Blue]LF)[/color]
[color=Green]; =============================================================[/color]
[color=Black]Main:[/color]
[color=Blue]FOR [/color][color=Black]bLoop [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]TO [/color][color=Navy]23 [/color][color=Blue]STEP [/color][color=Navy]1
    
  [/color][color=Blue]LOOKUP [/color][color=Black]bLoop,[/color][color=Blue]([/color][color=Navy]$00[/color][color=Black],[/color][color=Navy]$01[/color][color=Black],[/color][color=Navy]$02[/color][color=Black],[/color][color=Navy]$03[/color][color=Black],[/color][color=Navy]$04[/color][color=Black],[/color][color=Navy]$05[/color][color=Black],[/color][color=Navy]$06[/color][color=Black],[/color][color=Navy]$07[/color][color=Black],[/color][color=Navy]$08[/color][color=Black],[/color][color=Navy]$09[/color][color=Black],[/color][color=Navy]$10[/color][color=Black],[/color][color=Navy]$11[/color][color=Black],[/color][color=Navy]$12[/color][color=Black],[/color][color=Navy]$13[/color][color=Black],[/color][color=Navy]$14[/color][color=Black],[/color][color=Navy]$15[/color][color=Black],[/color][color=Navy]$16[/color][color=Black],[/color][color=Navy]$17[/color][color=Black],[/color][color=Navy]$18[/color][color=Black],[/color][color=Navy]$19[/color][color=Black],[/color][color=Navy]$20[/color][color=Black],[/color][color=Navy]$21[/color][color=Black],[/color][color=Navy]$22[/color][color=Black],[/color][color=Navy]$23[/color][color=Black],[/color][color=Navy]$24[/color][color=Blue])[/color][color=Black],bNewHour 

  [/color][color=Blue]HI2Cout [/color][color=Navy]$0[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$00[/color][color=Black],[/color][color=Navy]$30[/color][color=Black],bNewHour,[/color][color=Navy]$02[/color][color=Black],[/color][color=Navy]$30[/color][color=Black],[/color][color=Navy]$06[/color][color=Black],[/color][color=Navy]$75[/color][color=Blue]) [/color][color=Green]' Write HOUR to clock DS3231
  ;           (secs,mins,hours,dow,date,month,year)
  [/color][color=Blue]PAUSE [/color][color=Navy]800 [/color][color=Green]' let the DS3231 settle
  ; -     
  [/color][color=Blue]HI2Cin [/color][color=Navy]$0[/color][color=Black],[/color][color=Blue]([/color][color=Black]secs,mins,hours,dow,day,month,year[/color][color=Blue]) [/color][color=Green]' fetch time 
  [/color][color=Blue]PAUSE [/color][color=Navy]750 [/color][color=Green]' have a candy bar
  ; -
  [/color][color=Blue]BCDTOASCII [/color][color=Black]hours,bVal1,bVal0
  [/color][color=Blue]BCDTOASCII [/color][color=Black]mins,bVal3,bVal2
  [/color][color=Blue]BCDTOASCII [/color][color=Black]secs,bVal5,bVal4    
  [/color][color=Blue]SERTXD ([/color][color=Black]bVal1,bVal0,[/color][color=Red]":"[/color][color=Black],bVal3,bVal2,[/color][color=Red]":"[/color][color=Black],bVal5,bVal4,[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF) 
  PAUSE [/color][color=Navy]5
  [/color][color=Blue]SEROUT [/color][color=Black]oDisplay,cBaud,[/color][color=Blue]([/color][color=Navy]254[/color][color=Black],[/color][color=Navy]128[/color][color=Blue]) 
  SEROUT [/color][color=Black]oDisplay,cBaud, [/color][color=Blue]([/color][color=Black]bVal1,bVal0,[/color][color=Red]":"[/color][color=Black],bVal3,bVal2,[/color][color=Red]":"[/color][color=Black],bVal5,bVal4[/color][color=Blue]) 
  PAUSE [/color][color=Black]cDispPAUSE 
  [/color][color=Green]; -
  [/color][color=Black]bVal14 [/color][color=DarkCyan]= [/color][color=Black]hours[/color][color=DarkCyan]/[/color][color=Navy]16[/color][color=DarkCyan]*[/color][color=Navy]10
  [/color][color=Black]bVal14 [/color][color=DarkCyan]= [/color][color=Black]hours[/color][color=DarkCyan]//[/color][color=Navy]16[/color][color=DarkCyan]+[/color][color=Black]bVal14 
  [/color][color=Blue]SERTXD ([/color][color=Black]#bVal14,[/color][color=Red]":"[/color][color=Black],bVal3,bVal2,[/color][color=Red]":"[/color][color=Black],bVal5,bVal4,[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF[/color][color=Black],[/color][color=Blue]CR[/color][color=Black],[/color][color=Blue]LF) 
  [/color][color=Green]; -
  [/color][color=Blue]SEROUT [/color][color=Black]oDisplay,cBaud,[/color][color=Blue]([/color][color=Navy]254[/color][color=Black],[/color][color=Navy]192[/color][color=Blue])
  SEROUT [/color][color=Black]oDisplay,cBaud,[/color][color=Blue]([/color][color=Black]#bVal14,[/color][color=Red]":"[/color][color=Black],bVal3,bVal2,[/color][color=Red]":"[/color][color=Black],bVal5,bVal4[/color][color=Blue])      
  PAUSE [/color][color=Navy]500[/color]
[color=Blue]NEXT
SERTXD ([/color][color=Red]"**********END**********"[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)
END[/color]


About the 12 hour / 24 hour thing, I’m an old Navy man from the ‘70’s. I prefer 24 hour time and that’s the way these clocks are programmed. (grin)

@Marks I touched up the solder joints. I wrote the above code from your suggestion to “try reprogramming time registers.”

@eggdweather I like it, yes!! Thank you! I apologize if my previous post to you sounded bad – ungrateful or condescending, I did not intend for it to.

@westaust55 I’ll save your commands, thank you.

Thank you everyone, in advance!

:) joe
 
Top