Professional Documents
Culture Documents
John
Bibin John
DN: cn=Bibin John, c=IN
Date: 2006.04.14
23:41:17 Z
Reason: I am the author
of this document
Signature Location: Ernakulam
Not Verified
by
BIBIN JOHN
Digitally signed
by Bibin John
Bibin
DN: cn=Bibin
John, c=IN
Date:
2006.04.15
00:03:49 Z
Reason: I am
Signatur
e Not
Verified
John the author of
this document
Location:
Ernakulam
NOTICE
I am providing this book free of cost. You can use this book as
a study material. I don't want my book to be used as a material for business without
my permission. You are not allowed to upload this book in any other sites.
BIBIN JOHN
e-mail:njbibin@yahoo.co.in
website:www.geocities.com/njbibin
Indian forums for robotics and electronics:
Www.roboticsindia.net
Www.migindia.com
http://www.hamradioindia.org
Www.machinegrid.com
www.edaboard.com
Yahoo group:
parallelport
interfacing
magazine:Robotics For You (RFY) , Electronics For You (EFY)
INDEX
Parallel Port is same as the printer port in the back side of computer.Parallel Port
interfacing is the simplest method of interfacing. Now parallel port interfacing is used
for programming microcontrollers and hobby circuit. Here I am going to explain how
to interface it in Windows(all versions),Linux in C and Java.
6
INTRODUCTION
Parallel Port interfacing is thesimplest method of
interfacing. So it is widely used. The main problem with parallel port interfacing is
that it has data transfer speed upto 1Mbytes/sec. USB interfacing are
available having speed near to 12MBytes/sec. Parallel port is basically the 25 pin
Female connector(DB-25) in the back side of the computer(Printer Port). It has 17 input
lines for input port and 12 pins for output port. Out of the 25 pins most pins are
Ground and there is data register(8 bit), control register(4 bit) and status register(5 bit).
We can input port through all the three registers and can output port only through
data and control registers only. Each of these register have their own addresses. By
using that addresses we can program the port. Parallel Port’s are standardized
under the IEEE 1284 standard first released in 1994. This standard defines 5 modes of
operation, which are as follows,
1. Compatibility Mode.
2. Nibble Mode.
3. Byte Mode.
4. EPP Mode (Enhanced Parallel Port).
5. ECP Mode (Enhanced Capabilities Mode).
Here I am explaining bi-directional mode and simple parallel port. EPP and ECP
modes use handshaking signals.
7
DATA PORT
8
Writing Data Port:giving data to the outside circuit
For normal port C5=0(i.e, the fifth bit of control port must be low)
outportb (0x378,0x45);
D7=0 D6=1 D5=0 D4=0 D3=0 D2=1 D1=0 D0=1
reaches the port.It should be noted that dataport is a latch so the last data
send is stored on the port(since it is a latch).
Reading Data Port: Taking data from outside circuit
In order to make data port for inputting the control pin C5=1
outportb(0x37a,0x20);
a=inportb(0x378);
When u execute this program the variable 'a' is stored the value the decimal value of
the data inputted to the port.
Suppose if you input the all the pins to VCC then we get value
a=255
drive load 24mA @ 4.2V (From IBM definition of port)
Note: High Impedance state is considered as HIGH by parallel port. If you read the
data port without connecting any input, we get all high(a=255)(same as that of LS TTL
gates). Suppose if you connect input to D0 and no inputs to the others pins(D1-D7),
then only the value at D0 change, the value at (D1-D7) will remain as same as the
previous value.
9
CONTROL REGISTER
The Control Out pins were driven by 7405 inverting open collector buffers, pulled to
+5 volts via 4.7K resistors. All data lines except C2 are inverted before going to output
pins; data line C2 is double inverted before going to pin 16 (ie: is not inverted).
Remember that it is better to use 74LS gates at the output because open collector
inputs are read as LOGIC HIGH by the 74LS series IC's.
Open collector means LOGIC HIGH become high impedance and
LOGIC LOW become LOGIC LOW(<.8V)
10
writing Control Port:
outportb(0x37a,0x00);
then you get at the ouput C0=1,C1=1,C2=0, C3=1
because the C0,C1,C3 are inverted pins.
STATUS PORT
Status port is used for reading purpose only. It is an input only port.
A=inportb(0x379); will read the status port. But remember that some pins are
inverted.
11
BIOS SETTINGS
Motherboard used:INTEL845GVSR
In different motherboard there are differnt BIOS configuration.
When system start press 'Delete' key or Ctrl+F2 to enter BIOS and
go to peripheral configuration
then do the following settings
In other motherboards do the following steps. First find where parallel port option,
then enable it, then set your address as above, you can use 0x278 but normally not
used. Then select bidirectional mode if available, otherwise select any mode which do
not contain ECP and EPP. Don't put these modes because they have different
protocols. Better you select all the modes except ECP , EPP and ECP+EPP and try.
Note:
● Set parallel port mode to any mode except ECP,EPP,ECP+EPP, mostly set to
SPP
● In some branded PC's of IBM etc.. you won't be able to acess BIOS
properly.So in that case you won't be able to use dataport for input. Use only
status port for input.
● You should see the bios setting before you start parallel port interfacing. This
is the most important step.
12
CONNECTOR
Different connectors are shown below.
But accordint to my experience I first used 1284B shown in below diagram with blue
tip is shown, but that does not worked properly before one year, but nowadays we are
getting such connectors and it works fine .I used the same 1284B connector with white
tip(tip means only color). See the my connector 2 years old, still working perfectly. I
have heard of 25 pin male on one side and 25 pin female on other side connector, but i
haven't worked on it. The connector is a normal printer cable which have 25 male pins
on one side and 36 female pins on the other side(circuit side). Better use a 25 – 36 pin
connector which is available commonly, costs around Rs.40 or less(cost of my
connector 2 years back).
Buying Connector:
See whether it have 25 male pins on one side and 36 female pins on other side. It is
normally called centronics connector available in every computer shop. Some people
say it as a printer connector while some others as data cable, so you see the connector
before you bring from the shop whether it is a DB25 connector.
15
Now let's see the different type of wires available. The following figure shows
diffferent wires. The black wires are very good to get inserted into the female pins of
the connctor. They will be held tight and they won't suffer any problems with loose
contact. But these black wires will enlarge the holes of the breadboard as well as the
cable. But you should use this wire to avoid the problem of soldering. If you can
solder the cable then it good. But soldering can cause some short circuits because you
had to solder atleast some 18 wires. If some short circuit occurs, sometimes you won't
be able to detect and it will eat your time , sometimes it can cause damage to the port
also. If you are good in soldering,then no problem. The green wires are medium type
wires which can be inserted to the holes of the connector and the breadboard. But the
contact won't be good. The black and white wires are the wires we use in breadboard
connection. See the thickness of the wires. If you use this wire to connect to the cable
to breadboard, then it will always get loose and create too much problem to you.
16
So better use the black wire. I think you got a confusion now. How 25 pins on one side
become 36 pin on other side???????. I got same, so I opened both sides of the
connector to see the inside connection. Then I drawed the inside connections with the
same color of the wires used inside for my cable. See the diagram below. Now you
should have got the problem solved. See data pins(8)+control pins(4)+status
pins(5)+ground(1)=18pins will be used by us. We will leave the remaining pins
unconnected.
17
18
19
MY EXPERIENCE WITH PARALLEL PORT CABLE:
If you are not getting data properly from port your connector
may or may not be bad. This problem occured to me when I am using a normal
connector ,IEEE1284 Type B connector. It is better to use a connector all the time
when you are taking output from port. I have seen many person using simple wire to
the port and taking output. That is a wrong practice. The connector I brought first can
be opened on both sides. I opened it and identified the colours of the wires connected
to the pins as show in figure above. That is not working properly and not getting
ouput properly. So I brought new one which cannot be opened on both sides.
20
SOFTWARES USED IN WINDOWS
Installing USERPORT:
You can get userport.zip with this file or from yahoo group-parallelport.
http://www.embeddedtronics.com:80/public/Electronics/minidaq/userport/UserPort.zip
Download this file and unzip it
then copy Userport.sys to WINDOWS\SYSTEM32\DRIVERS
then run USERPORT.EXE
u will get a message driver started. Click Start two times then you will get the
following message. This is the next step after BIOS Settings.
21
USING LPT.EXE:
This is a small VB program which shows the status of the parallel port registers
You can get it with this book or yahoo group-parallelport or from the link
http://neil.fraser.name/software/lpt/
After BIOS settings and userport installation next step is to check whether your
parallel port will work or not and which ports will work well.
Run lpt.exe
select your port address first as you set on the BIOS. The following diagram shows
how to check port. You 'tick' indicates high on that port. So change tick on the port.
Make it low and high. If it is changing for data register and control register then your
parallel port is working fine and will work fine. But if the 'tick' is not changing then
you won't be able to use it. You won't be able to use the ports in which 'ticks' are not
changing. In the above diagram we can see that Pin1 (strobe C0) is not having tick(i.e
is low), but if you connect an LED then it will glow because C0' is there and the port
get's HIGH. Suppose if you input LOW on pin1 then the Strobe will get HIGH in the
software. So remember this when you do troubleshooting circuits with lpt.
22
TURBO C commands
#include<dos.h>
this header file is used for doing IO operations.
Delay(time_ms);
This function delays time in milliseconds. That is execution will be stopped for
time_ms time.
Outportb(port,data);
This command will send data(data) to the port address (port) in the command
a=inportb(port);
This command will read a port. The data(a) will be in decimal format.
Printf(“%x”,a);
This command will print the hexadecimal value of 'a' on the screen
23
GCC commands
#include<sys/io.h>
#include<unistd.h>
these header files should be used in the program.
ioperm(base,3,1);
This function is used to provide acess to port. You should be in root of the system
ioperm(base,3,0);
usleep(time_us);
delay in microseconds.
Java:
You can get the sourcecode from yahoo group-parallelport. The file named
'interfacing in Java'(.rar file).
24
Important points to be noted for interface:
1.You have to make the port bidirectional before applying the external voltage to the
data port because it can cause problem to your port (C5=1)
2.Don't remove the covering of the cable. If you are using Centronics pin as Female pin
then take wire out of the pins shown above. Don't try to remove covering to take the
wires out, because it can create problem of short-circuiting or you can solder the wires
to a PCB.
4.don't try to draw power from parallel port. This cause damage to port. So it is
necessary to use external power supply.
5.use only 74LS series IC's to interface between port and the other IC's because the
Parallel Port is LS TTL ouputs and inputs. This is valid for inputting or outputting
also.
6.switch on the circuit first then only connect the connector to the port
7.first disconnect the port then only switch off the circuit
8.don't forget to connect the ground of the port from the connector to the ground of
the circuit.
9.Connect the ouput of the port to the input of the buffer and use the output of the
buffer as the output of the port.
25
Note: When you are inputting the port connect the wire to the input of a buffer and
take the output of the buffer to the port.
NOTE: use only 74LS buffer or 74LS IC's to the port directly.
If you want to connect 40xx,45xx series IC's in the circuit it is better not to connect to
the IC directly to the port. It is better to use buffer in between port and IC.
10. Don't connect motors or relays directly to parallel port. You are allowed to connect
only normal digital IC's and transistor where driving current it low. Connect motors
and relays using power transistors.
12. High Impedance state is considered as HIGH by parallel port That means if u
doesn't connect any input and u apply inportting through port we get all
high(a=255)(same as that of LS TTL gates).
13.If you use 74HC244 then it takes the high impedance state as LOGIC LOW but
74LS244 takes it as LOGIC HIGH.
14.BIOS settings is the main thing to note. Set BIOS to bidirectional port, if not
available set it to any configuration except ECP,EPP,ECP+EPP
15.The external power supply must have the driving capability to drive the external
circuit. You can use the SMPS of the computer you are working on.
16.Remember that all ports are registers, so they all keep the last data
sent to the port
17. Don't extend the parallel port cable for long distance. If you want to use it for long
distance use some buffer(74244) in after the length of the cable. Every cable has some
resistance, capacitance and other factors and the voltage through printer cable is 5V,
so if a HIGH is send from printer port, then it should reach HIGH for the circuit and
this is possible only when you use the cable within limited length. If you see a serial
port cable, you will get more length than parallel port cable because the HIGH for a
serial port cable is -3V to -25V and LOW for 3 to 25V, so a good voltage swing is there
and you can get good distance.
26
TROUBLESHOOTING PARALLEL PORTS:
This is the most important section which normally unavailable in internet. Here I am
saying about my own experiences.
1.) First of all your system has not attacked by any WORM or any other type of virus
like shutdown virus(remember that this problem only comes after when a shutdown
virus given you shutdown message and you run shutdown -a ). This problem occured
with me recently. Then your parallel port won't work.
2.) You must install UserPort.zip for working in Windows operating systems above
Windows ME
4.) check the connector or connector configuration connected be wrong( connector can
be bad but rare condition)
6.) Check proper tightness of the connector to the port. Insert the connector properly
to the port.
7.) Test the buffer you are using whether it is bad or good and it is of 74LS family. If
you are using 74HC which takes the high impedance state as logic LOW where 74LS
take as HIGH.
8.)Power Supply should be correct and check whether the LED's are good or not.
27
9.) You can connect LED directly to port by taking one data pin as the positive
terminal and ground as -ve terminal. The wire should be properly inserted to the
breadboard and the Centronics cable .
10.) The ground of the port and the circuit should be short circuited.
11.) Don't try to connect without any buffer although no serious problem(you can
connect but the voltage level be low)
12.) See any motor or relay connected to the port without power transistor or any
buffer.
13.) See whether the pin number of Centronics is correct. See whether that the bit is
inverted or non-inverted.
16.) While inporting data port then make sure that C5=1
In inputting status port there is no problem occur mostly.
17.)If your data port reading of Turbo C gives a reading 170(in decimal) and the input
you had given is a different one, but lpt.exe is reading the input correctly, then reboot
the system. This the problem occuring with Turbo C in hardware interfacing.
28
LET'S START
Before starting let me explain the components i am going to use. First about my power
supply. I am using the adapter of 12V,500mA with voltage ranging from 1.5V-12V. I
have explained it on my first book MY EXPERIENCE ON AUTONOMOUS
ROBOTICS.I want to show you how i am doing things so that you will be able to do
all the projects given in this book very fastly and follow the right way.
29
30
Now come to Breadboard. This is the breadboard of my college.
31
This is an LED connected in series with a 100 ohm resistor. This white led gives red
light.
32
See this figure carefully. See how i connected the individual ports. See I have used
different wires. A thick black wire from cable to breadboard. I used a green wire
also. The wires in the breadboard are small size as I shown it previously.
33
35
Here is the multimeter which i am using. It costs around Rs300. I have talked about
this multimeter in my previous book MY EXPERIENCE IN AUTONOMOUS
ROBOTICS. Now we can start. First install userport.zip and do bios settings.
36
In the above diagram you can see that i checked the voltage at the data port. In that I
connected LED and multimeter to same point. Let's remove Led and check
37
see the voltage difference. Here i used 100 ohm series with LED.
38
This diagram shows how i check for the control port. The voltage of control port is
high compared to data port.
39
First Program
Program: 1.c
This program sends 0x99 to data port i.e D0=1,D3=1,D4=1,D7=1 and remaining are
LOGIC LOW. Now check the status using an LED. Figure below shows the status of
D7. Check the status at every pin of data port.
40
Reading Data Port
Program: 2.c
#include"bparlib.c"
void main()
{
printf("%x",Read_DataPort());
}
Here I used %x to print the hexadecimal value instead of decimal value.
Now let's connect some input to data port and check. In the figure below I am
connecting LOW to D0. Now run this program. You can see the output is 0x98. Only
the value at D0 has changed, the remaining values from D1-D7 remains unchanged.
41
Writing to Control Port
Program: 3.c
#include"bparlib.c"
void main()
{
Write_ControlPort(0x00);
}
This program will send 0x00 to control port. i.e c0,c1,c3 led has glown because they are
inverted pins and C2=0.
Reading Control Port
program:4.c
#include"bparlib.c"
void main()
{
printf("%x",Read_ControlPort());
}
i connected c2=high, remember that previous values will be stored in the port. The
output of pgm4 is 4. ie. C2=1 and remaining all others are LOW.
Reading Status Port
program:5.c
#include"bparlib.c"
void main()
{
printf("%x",Read_StatusPort());
}
first execute this program without connecting any inputs. I got the value 0x78. Now
connected Pin4 to HIGH then it read 0x78 again because the Pin4 is already high in
this program.
42
NOTE:
1. Use lpt.exe to see the status of every ports everytime when you execute the
program.
2. You can use this as an ideal status detector.
TROUBLESHOOTING
1. The cable may not be good some time. This occurred to me in the beginning.
So You had to see this problem first. Now let's see how to do it
2. Use multimeter continuity tester to test continuity between the wires of the
breadboard and the copper strip of the cable. Try to vary values, ie. Apply
both LOW and HIGH to see whether the wire is properly inserted into the
cable and the continuity is good. This is the main step.
3. See for any problems with breadboard.
4. Careful about ground. You have to short circuit external ground and ground
of parallel port.
5. See whether there is any short circuit between the pins of the cable or wires.
Solve this first. This may occur if you go for soldering.
6. There might be some loose contact between cable and wire. Fix it properly. In
order to avoid this use wires of good thickness.
7. Always check the voltage of external power supply. It should not be greater
than 5V. Otherwise sometimes, some problems can occur to the parallel port.
8. See whether your parallel port is working using lpt.exe by changing the 'ticks'
If 'ticks' are not changing then you won't be able to use that port.
43
Driving a Relay:
44
45
By default LED is ON, if you send High to D0 then relay will become active and LED
will turn OFF.
Program: relay.c
You can use this circuit to control your home equipments using computer. Here if you
use 12 relays using both control and data port of parallel port, you can control 12
equipments working upto 230V(including). Here I used LED to explain it clearly. See
troubleshooting tips on my previous book MY EXPERIENCE IN AUTONOMOUS
ROBOTICS.
DO IT:
Try to make a timed control of your home equipment. Suppose you want to turn
ON your equipments after Ton time and work it for Toff time and turn OFF. i.e, the
equipment work for Toff time. Suppose if you set Ton=1hr and Toff=1/2 hour. Then
the equipment will become ON after 1hr. From now and work for ½ hours and turn
OFF after this ½ hour. Also try to make your home voice controlled using VB or
Java. See the link below:
http://www.roboticsindia.com/modules.php?name=News&file=article&sid=115
46
Driving a motor
Use the same circuit to drive motor. You connect collector to one end of motor and
other end of motor to the Vcc(12V or 6V according to your motor).
Program: motor.c
47
H-BRIDGE
Program: HBRIDGMO.c
see not to short circuit Vcc and power supply by making (2,3) ON, first condition and
(0,1) ON another condition when Vcc is connected to ground and short circuit occurs.
But if you use power transistor then the heat sink will get heated too much.
adapter o/p 6.42v,voltage across motor 2.35v.
48
49
L293D driving motor
program: L293d.c
D0,D1 outputs are used as inputs of L293D.
50
See how to troubleshoot L293D in my previous book MY EXPERIENCE IN
AutONOMOUS RobOTICS. See the program.
DO IT:
try to control a robot forward,backward and stop using L293D. Try to make it voice
controlled. See this link to make a parallel port controlled bot
http://www.roboticsindia.com/modules.php?name=News&file=article&sid=65
http://www.roboticsindia.com/modules.php?name=News&file=article&sid=115
51
STEPPER MOTOR DRIVING
Figure shows a general stepper motor. This is a 6 wire stepper motor which can be
used both as unipolar and bipolar stepper motor. Figure below shows the stepper
motor i used costs around Rs.270. The first task is to identify terminals (a,b,c,d,e,f).
They are identified and as show below
hold it like a 2X3 row
1,1 is common 1,2 is one end of coil 1, 1,3 other end of coil1
2,1 is common of coil2 and so on.
The resistance of one coil is 108 ohm and between (a,c) is 54 ohm( I checked it).
Programs for driving stepper motor as
bipoloar: bipolar.c
unipolar: unipolar.c
use separate power supply for logic and control circuit
http://www.seattlerobotics.org/encoder/may98/steppers.html
http://micromouse.cannock.ac.uk/motors/stepper_driving.htm
52
UNIPOLAR STEPPER CIRCUIT
Above diagram shows how i connected the stepper circuit.
This diagram above has one wire missing. The circuit is given below
Suppose V1=0 then both transistors are cut off and no current will flow. When
V1=HIGH then both transistors are ON and the 'output' will become LOW(0v)(i.e,
emitter will get gnd). So at V1=0 it has 'output'=Z and V1=1 has 'output'=LOW. A
power transistor has two states, there is short circuit between E and Collector or there
is no connection. But in ULN the collector will get either high impedance or a LOW
voltage(gnd). So it can't be used for H-bridge. Here when the input is HIGH the
transistor emitter will get ground instead of a short circuit between E and C.
56
DISPLAYS
7-segment display
The above circuit shows how to connect multiple displays with a single decoder. You
can do it without a decoder and some transistors. But here I am using 74126 a tri-state
buffer and a 7segment decoder. Corresponding pins of displays are short ciruited
together. i.e, 'a' of all displays are short circuited, same as b'.
Program:led.c
Algoritham
Clear_ControlPort_bit(0);
Clear_ControlPort_bit(1);
Clear_ControlPort_bit(2);
Clear_ControlPort_bit(3);
This is used to remove the Vcc to all displays so that nothing can be seen on display.
57
Here we use the technique of persistance of vision. i.e, our eye cannot detect what is
happening within 1/16 of a second. Delay(7); This command gives a delay of 7ms and
the digits to be displayed on LED are given to the data port and the corresponding
control bit is taken.
Troubleshooting:
1. Check the connections like 'a' of all are short circuited.
2. Check whether all the segments of the display are working by connecting Vcc of
all to Power supply and LT'=GND. In that case all displays should glow.
3. See whether your breadboard has any problems and the connections are
interchanged or not
4. The pin3 and pin8 can be used for VCC but only one at a time.
5. Here i have not used resistor, it is better to insert a series resistance of 100 ohm
according to the intensity of the display.
58
59
60
LCD DISPLAY
61
More tutorials about LCD is available on the following links
http://www.roboticsindia.com/modules.php?name=News&file=print&sid=75
http://www.beyondlogic.org/parlcd/parlcd.htm
http://www.eio.com/lcdintro.htm
http://home.iae.nl/users/pouweha/lcd/lcd0.shtml#hd44780
http://ee.cleversoul.com/lcd_project.html
See the commands from the first link and see the program.
Program: lcd.c
62
first select the instruction register to write these following commands. See the table of
commands
init[0] = 0x01;
init[1] = 0x38;
init[2] = 0x0c;
init[3] = 0x06;
init[4] = 0x80;
Now select the data register and write the data you want to send. Delays should be
proper for the display to set.
The following program writes some data into the LCD which will remain stored in the
RAM of LCD
TROUBLESHOOTING:
1. Make the LCD ON by varying the contrast. You vary the potentiometer knob so
that the contrast will vary and you will get dark matrix on the screen.
2. Reduce the contrast so that dark dot's of less intensity will be seen.
3. Now run the program, check for parallel port troubleshooting.
4. The delay inserted in the program should be sufficient.
5. The CRA address should be correct.
63
Here is the output of the program.
64
65
ANALOG TO DIGITAL CONVERTER
program: adc2.c
Here I used Vref=Vcc=5V. This voltage may change depending on load. You can use
any other Vref using a potentiometer at the Vref/2 pin. See datasheet for the
maximum value of Vref. Digital and analog grounds are short circuited. Here the 10K
and 150pF determines the speed of conversion. The normal speed is 100uSec. You can
change this. If you increase the speed, then it is called overclocking. I used 222pF
instead of 150pF. So if you don't get 150 pF then u can use other values but the speed
of conversion will vary. Here I am using the free running mode of operation for
easiness. Mainly used mode is interrupt mode. In free running mode ADC will never
end the conversion. Some power is wasted in this case compared to interrupt mode.
First we have to Enable Write pin then disable it after some time. This time will be in
milliseconds because the conversion time of ADC is in terms of milliseconds(.1ms). So
the conversion time of ADC in our program is 2ms. i.e, you can get 500 conversions in
a second. Most of the application this much speed is enough, especially when we used
sensors in robotics. You can try for a better speed. Here the voltage is calculated using
the formula
V=ouput of ADC/(2^8-1)*Vref. Here Vcc=5V and output of ADC is of 8 bit so we
divide it by 255. See the least count of ADC = 5/255=1/51=.02V . You can see that if
you decrease Vref, then we can get a better accuracy.
66
Program: adc1.c
This program is used to check what is the output of the ADC when chip select and
read are not enabled. The output will be 0xff not Z(high impedance). In most of the
cases you have to see it if you use it with some multiplexed bus. Suppose if you want
to expand parallel port and by using control signals we disable ADC but still a voltage
of HIGH remains at the output. So be careful about multiplexing ADC with any bus.
Use a buffer to the output of the ADC to enable the chip reading when you are using
multiplexed bus.
67
TEMPERATURE MEASUREMENT
The most commonly available LM35 is LM35DZ measures temperature from 0 to 100
degree.Output is 10mV* degree in Celsius. That is if the temperature is 29 degree then
Vout=.29V. Therefore we require a least count of .01V for measurement of
temperature with 1degree difference.
So we should select a proper Vref least count=Vref/255 , gives Vref=2.55. So we have
to apply 2.55/2(Vref/2) to the pin9.
Program:lm35.c
68
69
70
LDR SENSITIVITY MEASUREMENT
Program: ldr.c
read the LDR 400 times continously and take the least count in which consecutive 3
readings will differ. You can use this circuit to change the parameters of your
computer monitor so that you will feel same effect with variation in external light.
71
72
8-CHANNEL ADC(USING ANALOG MUX)
Figure shows analog mux is used to multiplex 8 analog voltages to the ADC. Here we
are using an analog mux MC14051 or CD4051. The selection pins of the analog mux is
connected to the output of the control port.INH is disabled. Thus by selecting proper
inputs we can get different channel outputs. Analog mux can work as a digital mux
while digital mux can't.
Program:amux.c
73
74
MEASURING MAINS SUPPLY:
75
COMPUTER AS CRO:
http://www.geocities.com/lptscope/hw.html
Here you can use the same logic as you used in above project. But there is a limitation
for maximum frequency in this case. Here we have to use some method so that we can
measure high frequency. So we have to remove delay(1) and use some C graphics to
plot the waveform. Circuit for this was published in Electronics For You. See the
above link. Here also we required to plot the negative side, so in this case also we use
comparator. Go for some high speed ADC's to get good performance. It is better to use
Interrupt mode for this, so that we can get speed upto 10Khz and we can measure and
plot the same. You can overclock the ADC to measure high frequencies.
See this link where you can get a high speed one using USB
http://www.eix.co.uk/Ethernet/USB/
ANTENNA TRACKING:
The aim of antenna tracking is to place antenna in a position to get the maximum
signal. So in this case we are holding the antenna vertically in a platform which can be
rotated using a simple DC motor. So we have to measure the signal strength(i.e,output
voltage) at every point in the rotation of the motor. We connect the signal output to
ADC to measure the maxium voltage. Step down the signal voltage, if it is above the
maximum ratings of the antenna. So rotate the antenna using the motor. Make a 360
degree rotation and get the maximum peak signal. Store the maxium peak signal and
again rotate the antenna such that it is aligned to the direction from which maximum
signal strength is received. You can rotate the antenna from 0-180 in one direction and
0-180 in opposite direction or 0-360 in one direction depends on your mechanical
structure. This setup can be used to align the antenna to the direction of maximum
signal strength when you shift it from one place to another.
76
REDING A COMPARATOR
Here you can see I am connecting comparator output to the status port pin7. The
output of comparator may not be accurately 5V . It is in the range of 3.5V . But all
voltages above 2.4V is treated as HIGH by the digital circuits. Here you can use
potentiometer output as the reference voltage.
Program:lm324.c
77
SPEED MEASUREMENT OF A DC MOTOR:
Most of the DC motors have maximum speed about 2400 rpm . Ie, 40 rotation/sec. So
we can measure this using a sensor whose sensitivity is greater than 1/40 in a second.
Suppose if you use an LDR or a photo diode, then we can measure the speed easily.
Attaching some spikes at the shaft or at the wheel of the motor(or make wheel in that
type construction), use photo diode or LDR. A photo diode is the best option which
can have have distance upto 5-7cm, but LDR is not having that much because of
external light. Use IRLED+photo diode combination. Use a series resistance with a
photo diode and connect the resistance voltage to the comparator. Count the number
of spikes passed. The spikes are placed at equal angles with the center. Meaure the
speed using number of spikes moved, diameter of the wheel and the time taken. This
is the simple method instead of usingshaft encoders. See the mechanical setup to
measure the position of a mouse in a ball mouse(not optical mouse), then you can
understand better.
78
KEYPAD INTERFACING
79
80
KEYPAD CONNECTION WITH PARALLEL PORT
81
KEYPAD CIRCUIT
See the above circuit diagram and understand the connection. Take Row 0 and column
0. A switch has four leads in which two leads are short circuited internaly to form a
swich. Suppose if you press the switch then all the terminals will be short circuited. If
we send C0=1 and C2=C1=C3=0 then first row become active and remain rows will
be deactive. One row of all switches get HIGH (i.e, switches in row 0 , one terminal
will get high). If you won't press a switch in the row then output will be zero(you can
see the output terminal of the switch is short circuited to No Connection terminal of
the switch. So by default the output is zero at d1,d2,d0,d3.
82
Suppose if you press row 0 and column1 switch then d1
become HIGH and all remaining d0,d2,d3 become LOW. Here we are using a
resistance with every output to see the output voltage. When no switch is pressed the
output voltage will be zero and when switch is pressed output voltage will become
HIGH. In all the cases you can see that bottom 2 switches of all row become HIGH and
top one is not connected=LOW and other is output. So when you press the switch all
become HIGH if you had selected the row for that switch.
Program: keypad.c
TROUBLESHOOTING:
1. You should avoid key debouncing problem by inserting proper delays in the
program. A normal person can press only 10 switches in a second (at max). So
insert a delay of 100ms after pressing a switch to void keydebouncing.
2. See the appropriate keydebouncing algoritham.
3. Soldering should be proper.Better go for a redymade keypad.
4. At the starting of the program make all output ports low. Make sure when you
make a particular row HIGH, other rows should be LOW.
5. IF you want to avoid keydebouncing problem and a software making then go
for 74922 or 74923.
83
84
Here I have short circuited X2 and Y1 so the output will be 1.
Program:922.c
The program will wait for a keypress (i.e short circuiting between two pins(x, y)) and
print the pressed value.
85
RAM INTERFACING(7489)
86
87
PARALLEL PORT EXPANSION
88
Here you can see that output of data port is
connected to the input of D flip flop and control port pins as the clock of the D flip
flop. The clock for 74374 is produced by making the clock pin HIGH from a LOW
state of the clock pin. The output should be enabled. First you write the data you
want to write to the flip flop into the data register of the parallel port and the clock the
flip flop. Suppose if you want to write to flip flop connected to C0, then
89
The buffers become active only when a LOW is applied to the control pin of the buffer.
So in the starting of the program we have to make all pins HIGH so that two buffers
are not selected at a time. Suppose if you want to select the first flip flop connected to
C0.
Clear_ControlPort_bit(0);
a=Read_DataPort();
Set_ControlPort_bit(0);
you should make the pin high before you leave the buffer. This way we can get 24
inputs from the parallel port.
90
First you should disable the output of the
buffers(74244's) in the beginning of the program. Make the clock to the flip flop by
making the corresponding control port pin LOW and then HIGH. Buffers input
should be made LOW to read the buffer and the data port should be made for input
before reading the buffer
program: exp1.c
91
92
EXPANDING PARALLEL PORT FOR MORE INPUTS AND OUTPUTS
93
ROBO DAC
A data acquisition Card is always need to get data in different form, analog or digital .
The data can be inputted or outputted or used as a independent counter / timer. But
in Robo DAC we are having 8 analog inputs, 8 digital inputs and 8 digital outpus. We
can also expand the number of digital outputs and digital inputs.
Here you can see that first flip flop is used for 8 digital outputs and second flip flop for
controlling the DAC like ADC signalling, used as select pins for the analog mux. In
DAC there is facility for extending 8 analog inputs or 32 digital inputs or 32 digital
outputs or 16 digital inputs and outputs. So first we clock the first flip flop to output a
digital data. Then we use control flip flop to select different channels of analog mux
and signalling ADC conversion. The output of ADC conversion is given to the input of
one 74244 buffer which is read by making C3 pin LOW.
Program:dac.c
remember that in the program you are taking the value as decimal and you will get
output of the flipflop as hexadecimal.
96
97
98
APPLICATIONS OF ROBO DAC
SUN TRACKER:
Sun Tracker is a mechanism which keep Solar Panels always perpendicular to Sun.
The maximum radiation is obtained when Solar panel is perpendicular to sunlight, so
maximum power. Everyday sun moves from East to West and a lateral shift of
23.5degree on both sides of normal(i.e, change with seasons like summer and
winter).See http://www.eaas.co.uk/news/seasons.html. So we need two axis
tracking. Sun sets at west and our system shut downs automatically when
a particular intensity of light is reached (i.e in night and in rain time). When it set at
west and during morning it had to come back to east i.e in morning it had to shift 180
degree.. Sun Tracker should work perfectly with Sunlight and in darkroom in
presence of sodium vapor lamp.
99
100
RA0,RA1,RA2,RA3 is the output of the flip flop(74374).
You can connect the output of 74374 to the enable of L293D. When the LDR resistance
is too high , the enable of L293D should be disabled because there is no need of
moving sun tracker because the availability of light is less. You can decide it in your
program. There should be an option for suntracker to align automatically to the
direction of maximum sunlight when it is shifted from one position to other. You can
provide a suitable algoritham in your program. You can disable the L293D for
sometime and thus power consumption is somewhat reduced(see in case of big
motors H-bridge consuming good amount of power) .
Suppose you want to make a line follower robot with 4 sensors on each side and 16
speed reductions then you can make it using ROBO DAC. If you use varying supply
voltage to drive the motor then you can use this circuit. Make a proper algoritham for
driving the motor.
101
ROBOTIC ARM
A robotic arm requires precise movement of the motor. You can make a robotic arm
using steppers,but it won't have enough torque to drive the arm. Normal robotic arms
are made using Servo motors which are very costly. We can have a less cost solution
using a DC motor and a potentiometer. Potentiometer will give the feedback to the
computer. But only 270 degree rotation is possible with a potentiometer. We couple
DC motor shaft with the knob of a potentiometer, so that relative motion between DC
motor shaft and potentiometer is zero. Then connect the output to ROBO DAC and
measure the voltage corresponding to a specific angle. Suppose if you want to move
the arm to a specific angle,then we should see the database, corresponding voltage for
that angle . Rotate that motor until the potentiometer output reaches the
corresponding value.
102
103
DITTO
This is a robotic arm which makes equivalent movement with the movement of the
other robotic arm. You might have seen in some vidoes of humanoid robots that if our
hand moves equivalent movement occurs in the hand of the humanoid robot. In this
case we use a robotic arm. Use ROBO DAC to sense the movement.
105
IC TESTER
We all know that different IC's have different input and output pins.The first
procedure is to program which pins are for input and output. This programming is
done by writing data into control register. That is the name of that register is control
register. We can only input 13 data from parallel port at a time. But this is not
sufficient. So what I am doing is that I am storing data into data register and read the
output from all pins. This will work with all digital IC's work on 5v. I tested it for
74/40/45 series.(don't forget to buy 74LS244 not 74HC244)
WORKING:
Before reading this you have to see the datasheet of the IC's and how it work(if you
don't know about these IC's). First we see the testing of combinationl circuits.So I am
taking a simple IC 7404, same logic for all other IC's working without clock.
106
Before programming you have to see the control port pins. You can see that c2,c1',c0' .
So see the below table for corresponding IC's.From the table we can see that if you
want the output of the decoder to be Q0 then we have to write 3 to control port ,i.e,011
so the output of port will be 000. Always use this table when you are seeing code.
decoder software
03
12
21
30
47
56
75
First connect pin1 of IC to the 1 shown in circuit
diagram.
Now next aim to set control register. You can see that pin 1,3,5 are for input and 2,4,6
for output and 7 for ground, 8 is not used in diagram. So we want to send voltages to
pins 1,3,5,7.
First setting control register(2)
1.select control register(2): since Q2 of decoder is connected to clock of the register. So
first select the register by decoder. First make clock to 0 by 0x01. Now we get clock
low. Then we write to data port. Then select any other pin of decoder which is not
connected. I am using the unconnected output of decoder that is Q7(0x04). So control
register got the data from data port. I am using this way for all registers.
107
2.Write to data port:
so we want the input to be 10101010(pin1-1 and so on) Now we configured pins 1,3,5,7
for input by applying high to the control of tri-state buffer.But you know that D0 is
connected to Do7(data port) so we have to read from right to left for corresponding
data to be send to data port.
outportb(0x37a,0x01);
D;
outportb(0x378,0x55);//1010,1010 first three is for ic's
//next 1 is for ground next one no need so i made it Z
D;
outportb(0x37a,0x04);
D;
/* control register(2) is configured*/
Here D is the delay of 1mS
Setting for control register(1):
outportb(0x37a,0x00);
D;
outportb(0x378,0x2b);//1101,0100 first Vcc three ic's and a Z
D;
outportb(0x37a,0x04);
D;
/* control register(1) is configured*/
use the same step of control register(2) to control register(1)
first select control register(1) by selecting that register by
writing 0x00 to control port (that is clock is low). Then make the
corresponding data control to control register. Then select another
decoder output(0x04 as default)
/*first sending all to low*/
outportb(0x37a,0x02);
D;
outportb(0x378,0x00);//all zero since ground is there
D;
outportb(0x37a,0x04);
D;
/*data register(2) is entered zeros*/
outportb(0x37a,0x03);
D;
outportb(0x378,0x01 );//1000,0000 since pin 14 is VCC
D;
108
outportb(0x37a,0x04);
D;
/*data register(1) is enterd zer0*/
inporting should be done by using C5=1,and select the enable of 74LS244
/* data inputting for all zeros*/
outportb(0x37a,0x26);
D;
a=inportb(0x378);
D;
printf("pins from 1 t0 8, reading float as zero\n");
printf("a(0)d2=%d\n",a);
D;
printf("output should be=01010100\n");
D;
// data inputted for lower pins1 to 8
outportb(0x37a,0x27);
D;
a=inportb(0x378);
D;
printf("pins 16 to 9, reading floating as one\n");
D;
printf("a(0)d1=%d\n",a);
D;
printf("output should be=10101011");
D;
//data inputted for higher pins 16 to 9
/*data outputted all high*/
outportb(0x37a,0x02);
D;
outportb(0x378,0xbf);//1111,1101
D;
outportb(0x37a,0x04);
D;
//data entered data(2)
outportb(0x37a,0x03);
D;
109
outportb(0x378,0xff);
D;
outportb(0x37a,0x04);
D;
//data entered data(1)
//started entering all high
/* inputting all high*/
outportb(0x37a,0x26);
D;
a=inportb(0x378);
D;
printf("all high for and floating zero pin 1 to 8");
D;
printf("a(1)d2=%d",a);
D;
printf("output is a=10101000");
D;
//data from data register(2)
outportb(0x37a,0x27);
D;
getch();
a=inportb(0x378);
D;
printf("all high for pin 16 to 9");
D;
printf("a(1)d1=%d",a);
printf("output is a=11010101");
D;
//data from data register(1)
}
This way you can test combinational logic IC's
For clock driven IC's
first clock check reset and set using normal IC's combinational IC's.
For applying clock first apply data register pin to 1 then apply the
corresponding pin to 0. Thus we get clock for -ve edge level triggering.
I think you will sometimes won't be getting this. Just think of it, you can
get. See the code below you will get it
outcontrol3(0x99);
outcontrol2(0xff);
110
//apply reset
outdata0(0x55);
outdata1(0x7b);
a=inp5();
bin(a,b);
if(b[1]==0) ic[1]+=1;
if(b[5]==0) ic[2]+=1;
//apply set
outdata0(0xb3);
outdata1(0xbd);
a=inp5();
bin(a,b);
if(b[1]==1) ic[1]+=1;
if(b[5]==1) ic[2]+=1;
//J=1 , K=0
outdata0(0xa2);
outdata1(0xff);
//apply clk
outdata1(0xde);
a=inp5();
bin(a,b);
if(b[1]==1) ic[1]+=1;
if(b[5]==1) ic[2]+=1;
//J=0, K=1
outdata0(0x55);
outdata1(0xf7);
//apply clk
outdata1(0xd6);
a=inp5();
bin(a,b);
if(b[1]==0) ic[1]+=1;
if(b[5]==0) ic[2]+=1;
//J=K=0
//applying reset
outdata1(0x7b);
outdata0(0x44);
outdata1(0xf7);
111
//apply clk
outdata1(0xd6);
a=inp5();
bin(a,b);
if(b[1]==0) ic[1]+=1;
if(b[5]==0) ic[2]+=1;
//applying set
outdata1(0xbd);
outdata0(0x22);
outdata1(0xf7);
//apply clk
outdata1(0xd6);
a=inp5();
bin(a,b);
if(b[1]==1) ic[1]+=1;
if(b[5]==1) ic[2]+=1;
//apply J=K=1
//apply reset
outdata1(0x7b);
outdata0(0xb3);
outdata1(0xff);
//apply clk
outdata1(0xde);
a=inp5();
bin(a,b);
if(b[1]==1) ic[1]+=1;
if(b[5]==1) ic[2]+=1;
//next clk
outdata1(0xff);
outdata1(0xde);
a=inp5();
bin(a,b);
if(b[1]==0) ic[1]+=1;
if(b[5]==0) ic[2]+=1;
112
LAN CONTROLLED PARALLEL PORT
You might have heard of controlling home equipments using Lan or internet. Here we
are going to use one for Lan. The folder named lan controlled parallel port has the
source code and executable file. This program has been done by Mahesh Paliath. He
used VC++ and WinSock library to make the program.
you can buy game boy camera using a credit card from www.ebay.com
113
I am winding up this book hoping this book will help newbies to start
with parallel port interfacing. All the source codes given are tested and verified. I
haven't verified the following sourcecodes
bipolar.c
unipolar.c
keypad.c
The remaining source codes worked well with me and it will work for you. Once you
have completed this book then go for microcontroller . My next book will be on AVR
microcontroller.
BIBIN JOHN