Hi again,
Ok, not the most elegant piece of code, but it works. Basically this allows you to instruct the 12F683 to output a regular pulse at a desired frequency or duty cycle on pin 5. You can communicate with the chip via a serial com port [I'm using a USB to RS232 converter].
Personally, I establish a connection with hyperterminal that comes with XP.
Press 'f' to set frequency [press enter after you type a value in Hz]
Press 'f' to set the dutycycle (0 - 100%) [+enter] - the program will auto scale it 0 - 255.
Or alternatively, type 'f?' or 'd?' to determine the current set dutycycle of frequency.
Note: There is little in the way of error checking on the input. I just wanted to get this back to you guys to show what I'd done and that I was grateful for your help last Friday. Now that I have reliable 2-way com's on the serial bus, I'll set it up with a nice little application in MatLab.
Best regards, J.
P.S. One thing I couldn't sort out was clearing the screen at the start in hyperterminal from the serial port. People say to use Esc/[2J or something but I can't get it to work!!!
Include "modedefs.bas"
ANSEL=0
CMCON0 = %00000111
define osc 4
Serial_out var gpio.0
Serial_in var gpio.1
command var byte
input_char var byte
pulse_width var word
pulse_width_percent var byte
pulse_width_percent_new var byte
pulse_frequency var word
pulse_frequency_new var word
variable_output var word
pulse_width = 128
pulse_width_percent = 50
pulse_frequency = 20000
pause 100
serout Serial_out,T9600,[13]
pause 100
serout Serial_out,T9600,[13," "]
pause 100
SEROUT Serial_out,T9600,[13,"This is a test",13,10]
SEROUT Serial_out,T9600,[13,"f for frequency",13,10]
SEROUT Serial_out,T9600,[13,"d for dutecycle (0-100)",13,10]
SEROUT Serial_out,T9600,[13,"Press ? after f/d to find current value",13,10]
mainloop:
Serin Serial_in,T9600,command
If (command = 100) then
SEROUT Serial_out,T9600,["Enter duty cycle : "]
input_char = 0
pulse_width_percent_new = 0
while input_char<10
pulse_width_percent_new = (pulse_width_percent_new * 10) + input_char
gosub getchar
wend
if input_char <> 15 then
pulse_width = pulse_width_percent_new * 256 / 100
hpwm 1,pulse_width,pulse_frequency
SEROUT Serial_out,T9600,[10,13]
else
SEROUT Serial_out,T9600,[#pulse_width_percent,10,13]
endif
pulse_width_percent = pulse_width_percent_new
endif
If (command = 102) then
SEROUT Serial_out,T9600,["Enter frequency cycle : "]
pulse_frequency_new = 0
input_char = 0
while input_char<10
pulse_frequency_new = (pulse_frequency_new * 10) + input_char
gosub getchar
wend
if input_char <> 15 then
pulse_frequency = pulse_frequency_new
hpwm 1,pulse_width,pulse_frequency_new
SEROUT Serial_out,T9600,[10,13]
else
SEROUT Serial_out,T9600,[#pulse_frequency,10,13]
endif
endif
Goto mainloop
getchar:
serin Serial_in,T9600,input_char
input_char = input_char - 48
if input_char < 10 then
serout Serial_out,T9600,[48+input_char]
endif
return
Bookmarks