Retrieving 32bit Multiply Result


Closed Thread
Results 1 to 40 of 43

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default

    Thank you Darrel, Steve and Skimask,

    No more errors.
    One more clarification on the line:
    @ MOVE?CN 1000000, _big_number
    Does it make my big_number=1000000 in decimal?
    If that is true should I see the counter going down from 1000000 to 0?
    Am I processing the big_number right in my HSEROUT statement because when I run the program it starts counting down from 1516960.
    How do I insert a new big_number

    I will be away from the computer for the next 2 hours.
    Thanks in advance for all the help.

    Nick

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Yes, it loads 1 million into big_number.
    But it's a 32-bit binary number, so you can't just display the high/low WORDs with DEC.

    The hex representation of 1 million is F:4240.
    Then change each word to Decimal F=15, 4240=16960
    So it looks like it starts counting from 1516960

    To convert the big_number to a readable decimal output takes a little more work.

    Code:
    HighDigits  VAR WORD
    LowDigits   VAR WORD
    
    ;---[add this with the other macro's]---------------
    ASM
    PutMulResult?N  macro Nin
        MOVE?WW  Nin, R2
        MOVE?WW  Nin + 2, R0
      endm
    ENDASM
    
    
    ;---[add this to your main loop]--------------------
    @   PutMulResult?N  _big_number
        GOSUB SendBigNum
    ;---------------------------------------------------
    
    SendBigNum:
        HighDigits = DIV32 10000
        LowDigits  = R2
        IF (HighDigits > 0) THEN
            HSEROUT [DEC HighDigits, DEC4 LowDigits]
        ELSE
            HSEROUT [DEC LowDigits]
        ENDIF
    RETURN
    How do I insert a new big_number
    That depends on where the new big_number is coming from.

    You said you're reading the file length from the USB device.
    What format is it in, what variables are you storing it in.
    DT

  3. #3


    Did you find this post helpful? Yes | No

    Default

    Thank you Darrel,

    I will add the new code to my program and report the results.

    On the refreshing the big_number question:
    I’m using a Viniculun device to read an USB storage media that lets me read one byte at the time, n bytes or the entire file in one shot.
    The very first line in my data .txt file is the total number of records, 0 - 2,000,000, in fixed length (10 digit left padded with zeros.I used 10 digits to allow for up to 31 bit numbers if need be in the future), decimal format. The rest of the file are the records in fixed length (78 bytes) starting with "#" character, right padded with "~" character and ending with CR/LF. The data is only numerical and I do not process it, I just pass it to the Hserout. Every few records I must pause about 1 second to let the receiver process the information.

    I can read the 10 digit number byte by byte, strip the leading zeros and transfer into my big_number variable. How am I going to do it? This is the $10,000,000 question.

    I will fix my code right the way and work on the other problem.

    I must commend you guys for taking my “what if?” question and make sure I get the best solution. I learned a lot with your help.

    Regards,

    Nick
    Last edited by Nicmus; - 26th January 2008 at 00:55. Reason: Add more info

  4. #4


    Did you find this post helpful? Yes | No

    Default

    I added the changes Darrel suggested and it all works fine.
    I need to make small changes to the code to better fit my application and i will post it tomorrow.

    Thanks again and good night!

    Nick

  5. #5
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    If you come back and have it counting from 0 to <strike>1,000,000</strike> File Length ...

    I will ..., uh ...,

    oh hell, I don't know what I'd do.
    <br>
    DT

  6. #6


    Did you find this post helpful? Yes | No

    Default

    Hi Darrel,

    Sorry for the delay. I had some hardware problems which I had to fix.
    Also I’m using a USB to serial interface to communicate with HT and every now and then Windows will see my device as a mouse.
    Here is what I have so far:
    I am able to count down and send out the big_number. I made few changes to your code to format the output as a 8 digit number (kept the leading zeros).
    I’m also receiving the big_number as two 4 digit decimal numbers.
    The only thing left is to make one big_number from the two word size variable (in_high and in_low).
    I was thinking to use your PutMultResult?D macro Din but I’m not quite sure how to do it.
    Here is the latest working code:

    INCLUDE "modedefs.bas"
    @ device pic16F876a,hs_osc,pwrt_on, protect_on
    DEFINE OSC 16
    DEFINE LOADER_USED 1
    DEFIne HSER_RCSTA 90h
    DEFINE HSER_TXSTA 20h
    DEFINE HSER_BAUD 4800
    define HSER_CLROERR 1

    HighDigits VAR WORD
    LowDigits VAR WORD
    big_number VAR WORD[2] ; 32-bit variable
    in_low var word
    in_high var word
    led var PORTA.2

    ADCON1=6
    CMCON=7

    ASM
    MOVE?CN macro Cin, Nout
    MOVE?CW Cin & 0xFFFF, Nout ; Low Word
    MOVE?CW (Cin >> 16), Nout + 2 ; High Word
    endm
    ENDASM
    ASM
    PutMulResult?N macro Nin
    MOVE?WW Nin, R2
    MOVE?WW Nin + 2, R0
    endm
    ENDASM
    pause 10000 ' Allow for the USB device to enumerate
    hserout [13,10,"Waiting for Big_number",13,10] ' Add time out later
    hserin [dec4 in_high,dec4 in_low]
    main:
    @ MOVE?CN 20000, _big_number
    WHILE (big_number[1] > 0) OR (big_number[0] > 0)
    big_number[0] = big_number[0] - 1
    IF big_number[0] = $ffff THEN big_number[1] = big_number[1] - 1
    @ PutMulResult?N _big_number
    GOSUB SendBigNum
    toggle led ' Show if any action
    WEND
    pause 5000
    goto main
    SendBigNum:
    HighDigits = DIV32 10000
    LowDigits = R2
    'IF (HighDigits > 0) THEN
    HSEROUT [DEC4 HighDigits, DEC4 LowDigits," and ",dec4 in_high,dec4 in_low,13,10]
    'ELSE
    'HSEROUT [DEC4 LowDigits,13,10]
    'ENDIF
    RETURN

    End

    Thanks again for your patience.

    Nick

    BTW: I'm practising to post code the right way.
    Last edited by Nicmus; - 26th January 2008 at 16:02. Reason: Posting code practice

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    I’m also receiving the big_number as two 4 digit decimal numbers.
    The only thing left is to make one big_number from the two word size variable (in_high and in_low).
    This one I'm not so sure about. And I don't have anything handy to test it on.
    I'm pretty sure it will work, but not Positive...
    Code:
    HighDigits = 100   ; Simulating File Length of 1,000,000
    LowDigits  = 0000
    
    big_number[0] = HighDigits * 10000
    big_number[1] = R0
    big_number[0] = big_number[0] + LowDigits
    IF (big_number[0] < LowDigits) THEN big_number[1] = big_number[1] + 1
    P.S. To put code in a scrolling box that doesn't scrunch it all to the left, use ...
    [code]' --- code goes here ---[/code]

    oops, nevermind. I see you're even using colors in the test area.
    <br>
    Last edited by Darrel Taylor; - 26th January 2008 at 21:39. Reason: oops
    DT

Similar Threads

  1. Strugling without floating point
    By pjsmith in forum mel PIC BASIC Pro
    Replies: 15
    Last Post: - 27th March 2011, 06:29
  2. Math help please!!!
    By jbirnsch in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 10th August 2007, 14:45
  3. 32-bit Variables and DIV32, Hourmeter 99999.9
    By Darrel Taylor in forum Code Examples
    Replies: 9
    Last Post: - 23rd November 2006, 07:23
  4. PBP 16-bit ADC result math
    By sonic in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 13th March 2005, 14:21
  5. Retrieving Div32 Remainder
    By Darrel Taylor in forum Code Examples
    Replies: 4
    Last Post: - 20th August 2003, 03:53

Members who have read this thread : 4

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