************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Hello
This was very interesting. I have a little bit of the same problem.
I have A/D input 0-5V (0-255)
I want a puls out 0V=1mS and 5V=2mS.
If i take your example with the Laser and run it in CurveExpert i got the formula a-bx.
Where did you get 8573 and 41 from, and what is + ( AdResult / 2 ) means?
distance = 8573 + 41*AdResult + ( AdResult / 2 )
Any help will help.
![]()
Hi,
How about:When ADResult is 0 DelayInMicroSeconds is 1000 (1ms), when ADResult is 128 you'll get 1000 + (1280 * 100 / 256) = 1500 and when ADresult is 255 DelayInMicroSeconds is 1000 + (2550 * 100 / 256) = 1996.Code:ADResult = ADResult * 10 DelayInMicroSeconds = 1000 + (ADResult */ 100) PortB.0 = 1 PauseUs DelayInMicroSeconds PortB.0 = 0
It's not perfect but hopefully good enough.
/Henrik.
Tusen Tack Henrik.
Sorry for the Swedish, i was so happy for the answer AND that you also took your time to described how you did it.
This was exactly what i was looking for.
Thank's
Ole
My first PIC program works!
Description
A pot connected to an A/D port gives 0-255
A little converting give an output of 1mS when pot CCW and 255 when pot is max CW.
Drives the Servo between 1-2mS
Show the Pot input on LCD line 1, 0-255.
Show the Pulse width in mS on LCD line 2, 1-2mS.
Se Drawing below.
'************************************************* ***************
'* Name : NimSer.BAS *
'* Date : 3/3/2011 *
'* Notes : Move Servo 1 to 2mS depend on POT value *
'* Show valu in mS on LCD display *
'* For standard servo settings 1-2mS set LOW_servo con 100 *
'* and HIGH_servo CON 200 *
'************************************************* ***************
'Define OSC and ADC
DEFINE OSC 4 ' Set internal Oschillator to 4Mhz
DEFINE ADC_BITS 8 ' Set number of bits in result
DEFINE ADC_CLOCK 2 ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS
' Define LCD pins
Define LCD_DREG PORTC 'LCD data port
Define LCD_DBIT 0 'LCD data starting bit 0 or 4
Define LCD_RSREG PORTC 'LCD register select port
Define LCD_RSBIT 4 'LCD register select bit
Define LCD_EREG PORTC 'LCD enable port
Define LCD_EBIT 5 'LCD enable bit
TRISA = %00001001 ' RA0 = A/D input
ADCON1.7 = 0 ' RA.1 = +Vref, Set PORTA analog and left justify result
PORTb.6 =0 ' Prepare RB0 for high-going pulseout
ANSEL = %00000100 ' Set PORTA.2 analog, rest digital
ANSELH = %00000000
' Variables
outpuls VAR WORD ' Variable for the calculated puls out in mS
POT_POS VAR BYTE ' Pot position CC=0, CCW=255
LOW_servo con 60 ' Min Servo pulse 60= 0.6mS 100=1mS
HIGH_servo CON 200 ' Max Span from LOW_servo to HIGH_servo
' Span 100 gives 100+100 = 200=2mS
Pause 500 ' Wait for LCD to start
MainLoop: ' The Loop start here!
ADCIN 0,POT_POS ' Read A/D channel 0 to variable SVO_POS
outpuls =LOW_servo + (POT_POS *HIGH_servo/255) 'Calculate the outpuls in mS
Lcdout $fe, 1, "POT_POS= ", #POT_POS ' Display POT Valu between 0-255 on line 1
LCDOut $fe,$C0, "Puls= ",DEC (outpuls/100),".", DEC2 outpuls,"mS"' Display pulswith in mS on line 2
PULSOUT portb.6 ,outpuls ' Move servo on pin
PAUSE 20 ' Constant 20mS pulses(low) between outpuls
GOTO MainLoop ' Forever
End
Pot to Servo and LCD.pdf
Nice you got it working. Also very nice graphics in your pdf file!
Ioannis
Thank's Ioannis. There is a long way to go. But i start to understand what every body is talking about, Loook in the datasheet, 70% of the answer is there.
Continue the good work, I will try.
Ole
Bookmarks