OOps!
Thanks Steve.
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
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 RETURNThat depends on where the new big_number is coming from.How do I insert a new big_number
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
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 01:55. Reason: Add more info
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
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
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 17:02. Reason: Posting code practice
Bookmarks