Shop OBEX P1 Docs P2 Docs Learn Events
Counting problems.... — Parallax Forums

Counting problems....

Mikael SMikael S Posts: 60
edited 2010-02-02 06:57 in BASIC Stamp
In a code for a digital clock i use this instruction: "mins = mins + 1" (mins VAR Word) for·setting the minutes. It works execept when it going to change the 10'th minutes. For example can i see in my debug screen when·it counts: 28 - 29 - 2A - 2B - 2C -2D - 2F -30 -31 -32. Why does it count the letters?? How can i fix this??

Thanks for any help!!

Regards,

Mikael S
·

Comments

  • WolfbrotherWolfbrother Posts: 129
    edited 2010-01-27 19:47
    Hi,

    I think you are counting in HEX. Do a quick search and you will see how to do base 10 and base 60 to use a clock function.
  • Mikael SMikael S Posts: 60
    edited 2010-01-27 20:19
    This is a example of my problem. How can i do to count from 0 - 60 without the (HEX) letters·??

    ' {$STAMP BS2}
    ' {$PBASIC 2.5}


    · mins· VAR Byte

    start:
    · mins· = mins + 1
    · 'PAUSE 50
    · IF mins.HIGHNIB = 6 THEN mins = 0
    · DEBUG HEX2 mins
    · PAUSE 500
    · GOTO start


    Mikael
  • UnsoundcodeUnsoundcode Posts: 1,532
    edited 2010-01-27 22:41
    Hi Mikael , internal to your Stamp the variable "mins" is a binary number consisting of a bunch of 1's and 0's.
    To enable you to read the value of your variable on your computer monitor there are several "formatters" that take your 1's and 0's and format them in a way you are able to read them.
    In your code you are using the HEX2 formatter that displays your 1's and 0' as a 2 digit hex value.
    What it seems like you really need is the DEC2 formatter which will display the variable as a decimal number.
    mins=mins+1
    IF mins>59 THEN mins=0 : ENDIF
    DEBUG DEC2 mins," "
    



    Do a little research on computer numbering systems , it's really worthwhile.

    Jeff T.
  • sam_sam_samsam_sam_sam Posts: 2,286
    edited 2010-01-28 00:03
    Here is another way of doing what your trying do

    seconds VAR  BYTE ' or WORD depending how many second you want to count
    

    secs = $00
    GOSUB Set_Secs
    
    DO
    GOSUB Get_secs
     
     
     IF secs <> oldsecs THEN   ' This Routine Compars the oldsecs to secs
        oldsecs =  secs       ' This Routine is so that Counter Update once a Seconds
         s =  s + 1
     ENDIF
    
    DEBUG HOME,HEX secs,CR,  DEC3 s                  ' To Read The Seconds
    LOOP   
     
     
     Get_secs:                                          ' DS1302 Reads the Read the Seconds Register
      HIGH CS1302                                      ' Select DS1302
      SHIFTOUT DataIO, Clock, LSBFIRST, [noparse][[/noparse]RdSecs]
      SHIFTIN DataIO, Clock, LSBPRE, [noparse][[/noparse]secs.BIT0]
      LOW CS1302                                       ' Deselect DS1302
      RETURN
    
    

    or· you need to ,HEX secs , HEX mins, ·HEX hrs

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    ··Thanks for any·idea.gif·that you may have and all of your time finding them smile.gif

    ·
    ·
    ·
    ·
    Sam

    Post Edited (sam_sam_sam) : 1/28/2010 12:12:58 AM GMT
  • Mikael SMikael S Posts: 60
    edited 2010-01-28 06:28
    I use the "mins = mins + 1" to set the·minutes to a ds1302. Is there a way to tell the variable "mins" to just count in decimal, i cant figure it out!
  • Mike2545Mike2545 Posts: 433
    edited 2010-01-29 17:44
    Hmmm, do you mean the DS 1302 is loaded and displays HEX numbers just fine but when you try to change the numbers by mins = mins +1 you get weird results?

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Mike2545
  • Mikael SMikael S Posts: 60
    edited 2010-01-29 18:03
    Yes the ds1302 seem to work fine,·i use it to show the time·on LED display. The problem is·when i want to set the time, and show·the setting on the led-display. I just want the·display to step up one minute·at a time when i press a button.··I use the instruction "mins = mins +1", so i need the variable mins to be decimal.
  • Mike2545Mike2545 Posts: 433
    edited 2010-01-29 18:16
    I'll bet your time is in 24 hr format too...I have run into the same situation, check out LOOKUP and change the min from hex to dec and then back again, unless someone has a better way to do it...

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Mike2545
  • allanlane5allanlane5 Posts: 3,815
    edited 2010-01-29 19:21
    The 1302 does what is called "Binary coded decimal", aka BCD. The low nibble (4-bits) counts 0 to 9, then increments the top nibble while the low nibble goes to zero again. The upshot of this is when you DISPLAY it as Hex, it LOOKS like Decimal.

    However, the BS2 doesn't do this. When the low nibble counts from 9 to the next number, in binary (and hex) that's $0A, not $10. So, to send data (and interpret data) from the 1302, realize it's BCD. To send data (and interpret data) from the BS2, you can use the "DEC" modifier. But the two systems -- BCD and HEX -- ARE different from each other, and do require some conversion to use properly.
  • Mike2545Mike2545 Posts: 433
    edited 2010-01-29 23:27
    Mikael, here is a work-around I came up with


    'For displaying time
    setclock:
    second =0
    
         if ampm = 0 then lookup Hr_hour,[noparse][[/noparse]00,01,02,03,04,05,06,07,08,09,16,17,18], hour
         if ampm = 1 then lookup Hr_hour,[noparse][[/noparse]00,19,20,21,22,23,24,25,32,33,34,35,36], hour
           LOOKUPmin_minute[noparse][[/noparse]00,01,02,03,04,05,06,07,08,09,16,17,18,19,20,21,22,23,24,25,32,33,34,35,36,37,38,39,40,41,48,49,50,51,52,53, 54,55,56,57,64,65,66,67,68,69,70,71,72,73,80,81,82,83,84,85,86,87,88,89,96],minute 
         I2COUT 6,7, I2C_WR, [noparse][[/noparse]0,Second,Minute,Hour,Day,Date,Month,Year]
           
         
    
    I2COUT 7, I2C_WR, [noparse][[/noparse]0]
      I2CIN 6 ,7, I2C_RD, [noparse][[/noparse]Second,Minute,Hour,Day,Date,Month,Year]     
      gosub gettime   
          serout 1,baud,[noparse][[/noparse]"?y0?x11",dec2 Hr_hour,":",dec2 min_MINUTE ] 'lcd display
          if hour =>18 then 
          serout 1 ,baud, [noparse][[/noparse]"?y0?x17PM"] 'display PM            
          ampm = 1
          endif
          if hour =<17 then
          serout 1, baud, [noparse][[/noparse]"?y0?x17AM"]"display AM
          ampm = 0
    goto main
    '-----------------------------------------------------
    gettime:' after your min=min+1
    lookup hour,[noparse][[/noparse]12,1,2,3,4,5,6,7,8,9,2,2,2,2,2,2,10,11,12,1,2,3,4,5,6,7,2,2,2,2,2,2,8,9,10,11],Hr_hour
    lookup minute,[noparse][[/noparse]0,1,2,3,4,5,6,7,8,9,2,2,2,2,2,2,10,11,12,13,14,15,16,17,18,19,2,2,2,2,2,2,20,21,22,23,24,25,26,27,28,29,2,2,2,2,2,2,30,31,32,33,34,35,36,37,38,39,2,2,2,2,2,2,40,41,42,43,44,45,46,47,48,49,2,2,2,2,2,2,50,51,52,53,54,55,56,57,58,59,2,2,2,2,2,2,60],miN_MINUTE 
    return
    
    

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Mike2545

    Post Edited (Mike2545) : 1/30/2010 12:48:03 AM GMT
  • Mikael SMikael S Posts: 60
    edited 2010-02-02 06:57
    Thanks! Will try this.



    /Mikael
Sign In or Register to comment.