;Thanks Scott, your code is very instructive. ;Total execution time: ;worst case: 47 + 66 + 58 + 39 + 2 = 213 cycles(with known zero) ;worst case: 53 + 73 + 58 + 39 + 2 = 226 cycles(without known zero) ;Code size: 68 clrf temp sub30k movlw 3 addwf temp, f movlw low(30000) subwf Lo, f IFNDEF known_zero movlw high(30000) skpc movlw high(30000) + 1 subwf Hi, f ELSE rlf known_zero, w sublw high(30000) + 1 subwf Hi, f ENDIF skpnc goto sub30k add10k decf temp, f movlw low(10000) addwf Lo, f IFNDEF known_zero movlw high(10000) skpnc movlw high(10000) + 1 addwf Hi, f ELSE rlf known_zero, w addlw high(10000) addwf Hi, f ENDIF skpc goto add10k ; Output(temp) ;output temp = TenK ;worst case: 10 * 3 + 9 * 3 - 1 = 47 (with known zero) ;worst case: 11 * 3 + 10 * 3 - 1 = 53 (without known zero) clrf temp sub3k movlw 3 addwf temp, f movlw low(3000) subwf Lo, f IFNDEF known_zero movlw high(3000) skpc movlw high(3000) + 1 subwf Hi, f ELSE rlf known_zero, w sublw high(3000) + 1 subwf Hi, f ENDIF skpnc goto sub3k add1k decf temp, f movlw low(1000) addwf Lo, f IFNDEF known_zero movlw high(1000) skpnc movlw high(1000) + 1 addwf Hi, f ELSE rlf known_zero, w addlw high(1000) addwf Hi, f ENDIF skpc goto add1k ; Output(temp) ;output temp = Thou ;worst case: 10 * 4 + 9 * 3 - 1 = 66 (with known zero) ;worst case: 11 * 4 + 10 * 3 - 1 = 73 (without known zero) clrf temp sub300 movlw 3 addwf temp, f movlw low(300) subwf Lo, f IFNDEF known_zero movlw high(300) skpc movlw high(300) + 1 subwf Hi, f ELSE rlf known_zero, w sublw high(300) + 1 subwf Hi, f ENDIF skpnc goto sub300 movlw 100 add100 decf temp, f addwf Lo, f skpc goto add100 incf Hi, f btfsc Hi, 7 goto add100 ; Output(temp) ;output temp = Hund ;worst case: 10 * 4 + 5 * 3 + 3 = 59 clrf temp movlw 30 sub30 incf temp, f subwf Lo, f skpnc goto sub30 movfw temp rlf temp, f addwf temp, f movlw 10 add10 decf temp, f addwf Lo, f skpc goto add10 ; Output(temp) ;output temp = Tens ;worst case: 5 * 4 + 5 * 3 + 4 = 39 ; Output(Lo) ;output temp = Ones
Questions:
I am new to PIC, so I apologise in advance for this question.James Newton replies: If I remember correctly, high() takes the upper 8 bits of the value and low() takes only the lower 8 bits.
I am trying to get the ten-bit number from a 16F877a's A/D convertor to a computer using Hyperterminal, so this code converts the binary ADC value into an ASCII decimal, I assume?
I am using MPASM to programme the code, and understand the basics. What I do not understand is the numbers in brackets after movlw. Do I take out the "high"/"low" before it?
Also, since the ADC is only 10-bit, can the first section of the code "Output(temp) ;output temp = TenK" be discarded?
Thank you in advance!
Yes, you can safely remove the TenK output.
Comments:
Thank you for the reply!James Newton replies: Try it and see! Let us know the result? Ken of Operation Radiation replies: To answer my own question from a long time ago, it does not work. Anyways, the result is not actually in ASCII, but in decimal. One needs to add 0x30h or .48 to the output digits to obtain the ASCII result. Thank you Nikolai for the great code!
How about the Hi and Lo variables? I thought those two would be high and low bytes of the binary number...
I assembled the unedited code with MPASM and it seemed to have assembled fine.
My second question was not too clear; sorry! I meant whether I can take out the entire code from the beginning up to the TenK output. If I do that, would it affect the last four digits?
Thank you very much!