Hi,
I am new to this board and I am not a very experienced Basic programmer.
I am trying to read and count a pulse train from the serial port. The code looks like this:
INPUT "ENTER PULSE COUNT"; P%
PIN = &H3F8: REM COM1 PORT ADDRESS
DO
IN1=-((INP(PIN + 6) AND 128) = 128): REM READ INPUT PIN 1
IF IN1 = 1 THEN NR =1 ELSE NR=0
NR=NR+1
LOOP UNTIL NR = P%
********************************
It does not work. Is this because the pulse train is to fast? The pulses have a period of 0.15ms which is 5kHz and and are 12V, or is the programming wrong?
Any suggestins will be greatly appreciated.
Thanks.
Serial Port Input
- Codemss
- Veteran
- Posts: 124
- Joined: Sun Jun 24, 2007 6:49 am
- Location: Utrecht, The Netherlands
- Contact:
The NR variable will never reach more then two becuase this line:
IF IN1 = 1 THEN NR = 1 ELSE NR = 0
Sets NR to 0 or 1. So the maximal value of NR at the end of the loop is two (1 from the IF statement and one because you added one after that with NR = NR + 1)
What always helps is looking at your program and write what it actually does. Like this:
IF IN1 = 1 THEN NR = 1 ELSE NR = 0
Sets NR to one if IN1 is one, else NR is set to zero.
NR = NR + 1
Increases NR by one.
It's also a good tip to check what values you expect from variables at certain moments and what values they actually have at that moment(try making a breakpoint with F9 when you're in QBasic). When variables have the value you expect at one moment, but a value that is too high or too low, then the bug is probably between this two lines of code.
BTW, it's still possible that there are more small bugs, but I don't know much about that ports etc. I wonder what are you trying to do?
EDIT: I see that you use different types of variables also. Try to make the most variables of one type. I prefer integers, they can only hold integer numbers but are very fast.
IF IN1 = 1 THEN NR = 1 ELSE NR = 0
Sets NR to 0 or 1. So the maximal value of NR at the end of the loop is two (1 from the IF statement and one because you added one after that with NR = NR + 1)
What always helps is looking at your program and write what it actually does. Like this:
IF IN1 = 1 THEN NR = 1 ELSE NR = 0
Sets NR to one if IN1 is one, else NR is set to zero.
NR = NR + 1
Increases NR by one.
It's also a good tip to check what values you expect from variables at certain moments and what values they actually have at that moment(try making a breakpoint with F9 when you're in QBasic). When variables have the value you expect at one moment, but a value that is too high or too low, then the bug is probably between this two lines of code.
BTW, it's still possible that there are more small bugs, but I don't know much about that ports etc. I wonder what are you trying to do?
EDIT: I see that you use different types of variables also. Try to make the most variables of one type. I prefer integers, they can only hold integer numbers but are very fast.
Check out my site: <a href="http://members.lycos.nl/rubynl">Click here</a>
Hope you like it. Send some feedback if you want: <a href="mailto:basicallybest@live.nl">Mail me</a>
Codemss, before known as RubyNL
Hope you like it. Send some feedback if you want: <a href="mailto:basicallybest@live.nl">Mail me</a>
Codemss, before known as RubyNL
- burger2227
- Veteran
- Posts: 2466
- Joined: Mon Aug 21, 2006 12:40 am
- Location: Pittsburgh, PA
COM PORTS
COM ports read data, not usually pulses. Do you have an OPEN COM statement? QB can open only COM 1 or 2. Did you find the address from Windows Devices first? A COM port is capable of speeds up to 11,500 bytes per second on the data transmit and receive lines.
You seem to be using the Modem Status Register &H03FE or base address + 6. The pin you are sending the pulse to is CD or carrier detect. The bit is 7 so AND 128 should indicate if it is high or low. So you are close!
I have not tested this. I hope it helps. The COM port may have to be opened first. Be careful as devices and voltages can destroy ports. You will also need a common ground to your pulse circuit from the port. A 9 pin connector uses pin 5 and a 25 pin uses pin 1 for ground.
Ted
You seem to be using the Modem Status Register &H03FE or base address + 6. The pin you are sending the pulse to is CD or carrier detect. The bit is 7 so AND 128 should indicate if it is high or low. So you are close!
Code: Select all
DEFINT A-Z 'use integers only
DO
IF (INP(&H3FE) AND 128) THEN 'brackets required
count = count + 1
DO: LOOP UNTIL (INP(&H3FE) AND 128) = 0
END IF
LOOP UNTIL count = P
Ted
Please acknowledge and thank members who answer your questions!
QB64 is a FREE QBasic compiler for WIN, MAC(OSX) and LINUX : https://www.qb64.org/forum/index.php
Get my Q-Basics demonstrator: https://www.dropbox.com/s/fdmgp91d6h8ps ... s.zip?dl=0
QB64 is a FREE QBasic compiler for WIN, MAC(OSX) and LINUX : https://www.qb64.org/forum/index.php
Get my Q-Basics demonstrator: https://www.dropbox.com/s/fdmgp91d6h8ps ... s.zip?dl=0
It works!!
Thanks to Burger2227 and Codemss. Your suggestions were essential.
I re-wrote the code and it works:
DO
IF -((INP(&3HFE) AND 128) = 128 THEN
CT=CT+1
DO
LOOP UNTIL -((INP(&H3FE) AND 128) = 0
END IF
LOOP UNTIL CT = L
My project is a wire cutting machine. A DC motor with an optical encoder output measures the wire and a cutter device cuts the wire. I am entering the wire length and wire count. There is only one input (encoder) and two outputs, for motor run/stop and a cutting solenoid. The encoder output is 5000 pulses a second, pretty fast.
I re-wrote the code and it works:
DO
IF -((INP(&3HFE) AND 128) = 128 THEN
CT=CT+1
DO
LOOP UNTIL -((INP(&H3FE) AND 128) = 0
END IF
LOOP UNTIL CT = L
My project is a wire cutting machine. A DC motor with an optical encoder output measures the wire and a cutter device cuts the wire. I am entering the wire length and wire count. There is only one input (encoder) and two outputs, for motor run/stop and a cutting solenoid. The encoder output is 5000 pulses a second, pretty fast.