PDA

View Full Version : itoa or wordtostring function?



tracecom
- 5th January 2014, 02:01
Does Picbasic Pro have a function to convert a unsigned 16bit variable into an ascii text number? If so, what is it?

Thanks.

Heckler
- 5th January 2014, 04:33
Could you give a couple of examples of what you mean?

ie. show the unsigned 16 bit value and what the result should look like?

Demon
- 5th January 2014, 04:43
Offhand, a WORD has 16 bits unsigned and can be displayed on an LCD using DEC format.

More on this in PBP manual under LCDOUT command if this is what you want.

Robert

tracecom
- 5th January 2014, 04:51
Offhand, a WORD has 16 bits unsigned and can be displayed on an LCD using DEC format.

More on this in PBP manual under LCDOUT command if this is what you want.

Robert

Thanks for the reply. I read that part of the manual and tried using the DEC modifier, but couldn't figure out the correct syntax. I hope someone can post a sample.

tracecom
- 5th January 2014, 04:53
Could you give a couple of examples of what you mean?

ie. show the unsigned 16 bit value and what the result should look like?

Thanks for the reply. Here's the way I am doing it now, but it seems there should be a simpler way.


' Program Code:
PAUSE 1000 'Pauses 1 second to allow LCD to setup.
start:
ADCIN 0, left_pot 'Reads analog voltage on AN0, converts it to 10-bit digital
'value, and stores it as left_pot.
lpot = (left_pot*4) 'Multiplies left_pot times 4 to get voltage.
lthousands = (lpot//10000)/1000 'Extracts thousands digit from 4 digit voltage.
lhundreds = (lpot//1000)/100 'Extracts hundreds digit from 4 digit voltage.
ltens = (lpot//100)/10 'Extracts tens digit from 4 digit voltage.
lunits = (lpot//10) 'Extracts units digit from 4 digit voltage.
ADCIN 1, right_pot 'Reads analog voltage on AN1, converts it to 10-bit digital
'value and stores it as right_pot.
rpot = (right_pot*4) 'Multiplies right_pot times 4 to get voltage.
rthousands = (rpot//10000)/1000 'Extracts thousands digit from 4 digit voltage.
rhundreds = (rpot//1000)/100 'Extracts hundreds digit from 4 digit voltage.
rtens = (rpot//100)/10 'Extracts tens digit from 4 digit voltage.
runits = (rpot//10) 'Extracts units digit from 4 digit voltage.
LCDOUT $FE,1,"Left Pot = ", DEC left_pot 'Clears LCD screen, displays
'"Left Pot = " and the decimal value of left_pot.
lcdout $FE,$C0,"Voltage = ", #lthousands, ".", #lhundreds, #ltens, #lunits
'Sends left pot voltage to LCD.
LCDOUT $FE,$94,"Right Pot = ", DEC right_pot 'Sets LCD to beginning of
'second line and displays "Right Pot = " and the decimal value of
'right_pot.
lcdout $FE,$D4,"Voltage = ", #rthousands, ".", #rhundreds, #rtens, #runits
'Sends right pot voltage to LCD.

Here's a picture of the LCD with the above displayed.

7187

Demon
- 5th January 2014, 09:52
I just found this in Lab X1 folder:


' PicBasic Pro program to display result of
' 10-bit A/D conversion on LCD
'
' Connect analog input to channel-0 (RA0)

' Define LOADER_USED to allow use of the boot loader.
' This will not affect normal program operation.
Define LOADER_USED 1

' Define LCD registers and bits
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1

' Define ADCIN parameters
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS

adval var word ' Create adval to store result


TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %10000010 ' Set PORTA analog and right justify result
Low PORTE.2 ' LCD R/W line low (W)

Pause 500 ' Wait .5 second

loop: ADCIN 0, adval ' Read channel 0 to adval

Lcdout $fe, 1 ' Clear LCD
Lcdout "Value: ", DEC adval ' Display the decimal value

Pause 100 ' Wait .1 second

Goto loop ' Do it forever
End

Maybe there's something in there that will help you (in case you don't have Lab X1 samples). I saw nothing at first glance.

Robert

tracecom
- 5th January 2014, 12:26
@Demon

Thanks. That is the information I needed. I haven't yet figured out how to insert a decimal point in it, but maybe that will be possible.

Charlie
- 5th January 2014, 14:54
Since the software only works with whole numbers, there is no concept of a decimal point. You have to manage placing it where you feel it is supposed to be on your own. (sort of like a slide rule before calculators LOL)

HenrikOlsson
- 5th January 2014, 15:01
Hi,
The typical way of doing this is to have your number scaled 10 or 100 or 1000 times (or whatever) so that a value in myVAR of 12345 corresponds to 123.45 (for example). Then, to put that on the LCD, you can do something like

LCDOUT $FE, 1, "My value= ", DEC myVAR/100, ".", DEC2 myVAR//100 ' Clear screen and print result with two decimal places.

The myVAR/100 will divide the value by 100 and print the result, which in this case will be 123.
The myVAR//100 will again divide the value by 100 but then it'll take the remainder of that division, in this case 45, and print that.
The DEC2 specifies that the number should always be printed with two digits.

/Henrik.

tracecom
- 5th January 2014, 20:42
Hi,
The typical way of doing this is to have your number scaled 10 or 100 or 1000 times (or whatever) so that a value in myVAR of 12345 corresponds to 123.45 (for example). Then, to put that on the LCD, you can do something like

LCDOUT $FE, 1, "My value= ", DEC myVAR/100, ".", DEC2 myVAR//100 ' Clear screen and print result with two decimal places.

The myVAR/100 will divide the value by 100 and print the result, which in this case will be 123.
The myVAR//100 will again divide the value by 100 but then it'll take the remainder of that division, in this case 45, and print that.
The DEC2 specifies that the number should always be printed with two digits.

/Henrik.

Here's my code; it works. Thanks.

ETA: I am using a 4.096V reference.


' Aliases and Modifiers:

' Program Code:
PAUSE 1000 'Pauses 1 second to allow LCD to setup.
start:
ADCIN 0, left_pot 'Reads analog voltage on AN0, converts it to 10-bit digital
'value, and stores it as left_pot.
lpot = (left_pot*4) 'Multiplies left_pot times 4 to get 1000x voltage.

ADCIN 1, right_pot 'Reads analog voltage on AN1, converts it to 10-bit digital
'value and stores it as right_pot.
rpot = (right_pot*4) 'Multiplies right_pot times 4 to get 1000x voltage.

LCDOUT $FE,1,"Left Pot = ", DEC left_pot 'Clears LCD screen, displays
'"Left Pot = " and the decimal ADC of left_pot.
LCDOUT $FE,$C0, "Voltage = ", DEC lpot/1000, ".", DEC3 lpot//1000
'Displays result to 3 decimal places.

LCDOUT $FE,$94,"Right Pot = ", DEC right_pot 'Sets LCD to beginning of
'second line and displays "Right Pot = " and the decimal ADC of
'right_pot.
LCDOUT $FE,$D4, "Voltage = ", DEC rpot/1000, ".", DEC3 rpot//1000
'Displays result to 3 decimal places.

Demon
- 7th January 2014, 01:17
Trace Communications, I knew I saw that somewhere before. :)

I like your power supply PCB above; good idea to have it clip onto a breadboard, tidy and solid. My solution was "el cheapo", just a 5VDC wall adapter with a small electrolyte cap at the end. One day I'm going to either short-circuit the flimsy leads or snap them off.

You do know you can advertise your PCBs in the advert subforum right?

Robert