Thursday, October 1, 2009
Tuesday, August 25, 2009
Civil and environmental engineers are concerned with some of the most pressing problems of our world, including public infrastructure renewal, access to clean drinking water, environmental remediation and sustainable solutions to energy needs.
The CEE undergraduate program prepares students to face these tremendous challenges by providing a sound education in math, physics, and science and engineering fundamentals, all while emphasizing hands-on design projects and case studies that supply context and motivation. Students are taught how to combine theory, measurement and modeling to develop a good understanding of the problems at hand and point the way to desirable solutions.
The three CEE undergraduate degrees - civil engineering (1C) environmental engineering science (1E) and civil and environmental engineering degree (1A) - share a common core, usually taken in the sophomore year, that includes subjects in ecology, mechanics, mathematics and engineering design. In the junior and senior years, students build on the core by taking more specialized subjects in their chosen degree tracks.
The CEE engineering design lab sequence introduces sophomores to design and fabrication in a supportive team-oriented environment. The Classes of 2009 and 2010 designed and built energy-harvesting machines, for instance, a bicycle that harvests and stores the energy generated by the cyclist and a turbine that collects wind energy. Students in the senior engineering design class also design and build projects, including full-scale portable footbridges that can support a ton of concrete blocks.
Our departmental unit requirements are among the lowest in the School of Engineering, providing flexibility for students who wish to have a minor as well as a major, study abroad and pursue interests outside engineering.
Schematic Symbol Reference
This is an offline version of the . It contains all the same info, but is a standalone program that requires no Internet connection to run. This will run under Windows 95, Windows 98 and NT4 Server and Workstation.
If you have the filesMSVBVM50.DLL
and MSVBVM60.DLL
in your windows\sytem
directory, then you can download the (917K). Otherwise, you will need to
If you have built any of the interfaces on my circuits page and now want to know how to actually make use of them, this page is for you. This is a simple introduction to programming the parallel port in QBasic, QuickBasic or similar language. Note that most of the concepts in this page can also be applied to GWBASIC. If you are interested in using Visual Basic to control the port, see Programming The Parallel Port In Visual Basic. What this document will not do is give you lots of details on using bi-directional ports, DMA and other advanced topics. This document assumes that you are familiar with the basic functions of BASIC itself.
The parallel port is made up of three different sections. These are the data lines, control lines and status lines. There are 8 data lines, and they are the primary means of getting information out of the port. In simple projects, you will be concentrating mostly on the data lines. The control lines are another 4 outputs. They are meant to provide control signals to the printer (such as form feed or initialize). The status lines are a standard parallel port's only inputs. There are 5 of them. They were meant to allow the printer to communicate things such as error, paper out and busy to the PC.
Each section is accessed by it's own address and will act independently from the rest. This is almost as if they were different ports. The addresses are as follows:
Data Lines | ||
Control Lines | ||
Status Lines |
You need to know the address of the port you want to use. You will also need two other things; the command to access the port and the number you want to set it to. The command will be explained in a little while. The ports work with numbers. These can be expressed in hex, binary or decimal, but for this document all values will be expressed in decimal. It's just easier that way. Anyway, you operate the port by sending it a number that represents the binary pattern of the physical outputs on the port. For example, to set the 8 data lines to 11111111, you would send 255. To set them to 00000000 you would send 0. Note that these are all 8 bit binary numbers, and the port is also 8 outputs. Coincidence? I think not.
Now that we know how to tell the port what bit patterns we want, we have to actually apply that to the BASIC language. BASIC uses two commands to talk to the computer's ports. These are OUT
and INP
. OUT
is a statement and is used like the following:
OUT [port],[number]
We will get to INP
later. As you can see, the two parameters required are the port address and the value we want to set it to. The address can be decimal or hex, as can the value. Because there are only 8 data lines, we can only send a maximum of 255 to the port (255 is decimal for binary 11111111). The examples below illustrate sending a few different bit patterns to the data lines.
'set port to 00000000
OUT 888, 0
'set port to 10000000
OUT 888, 1
'set port to 01000000
OUT 888, 2
'set port to 00100000
OUT 888, 4
'set port to 00010000
OUT 888, 8
Of course, you can also turn on more than one bit:
'set port to 10110000
OUT 888, 11
Note that when you send a bit pattern to the port everything that was there previously is cleared. This is a convenience and also a annoyance. For example, what if we want bit 2 to always stay at 1, but want to turn bit 5 on and off in sequence? Every time we set bit 5, bit 2 is turned off, and vice versa. We will discuss how to get around this when we get to the INP
function.
The control lines are just as easy to control, but there are a few differences. First, the address of the port is 890. Second is that there are only 4 outputs, so the highest decimal representation of the binary bit pattern you will be using is 15 (binary 1111).
Outputting information is easy, and inputting is just as easy. If you actually want to get information into the computer, you will be using the 5 status lines. Reading the bit pattern of a port is done using the INP
function. This function is used in the following way:
[variable]=INP([port])
So if we wanted to get the current status of the status lines (port 889) we would use:
PortNum%=INP(889)
PortNum%
would then contain the decimal representation of the binary bit pattern present at the 5 status lines. If you try this and get 31 (11111) with nothing connected to the port don't be surprised. When there is nothing connected to the input of a TTL logic chip, a high input is usually assumed.
Not only can you perform inputs on ports actually designed for inputting, but you can also use INP
to read the status of an output port. For example:
PortNum%=INP(888)
The above would set PortNum%
to the current value of the data lines (port 888). We can prove this by doing the following:
OUT 888, 56
PortNum%=INP(888)
PRINT PortNum%
If all is well, the number 56 will appear on the screen.
Now that we know the INP
function we can use it to solve the problem of keeping the state of one bit while changing the state of another. For that we will define a subroutine that uses both functions:
SUB OutPort(PortAddress%, OutNum%)
PortState% = INP(PortAddress%)
PortNum% = PortState% + OutNum%
OUT PortAddress%, PortNum%
The sub does all it's normal stuff, but also sets the port to 0 if a 0 was passed to it. This is a very easy to clear up a port if you create strange bit patterns by trying to turn a bit on twice. You may want to keep track of the state you expect the port to be and compare it to the actual state by using the INP
function. If the two do not match, clear the port and reset all the the bits using your other variable.
Now that we know a few useful functions with respect to output, we should look at a very useful input function. When using the port in software, you will very likely need to know the status of a single bit at one time or another. There are various ways of doing this, but I find the function below to be the most useful:
FUNCTION BitStatus(PortAddress%, BitYouWant%) AS INTEGER
IF PortAddress% = 888 THEN
NumOfBits% = 8
ELSE IF PortAddress% = 889 THEN
NumOfBits% = 5
ELSE
NumOfBits% = 4
REDIM PortBits(NumOfBits%) AS INTEGER
PortNum% = INP(PortAddress%)
FOR i = 1 To NumOfBits%
PortBits%(i) = PortNum% MOD 2
PortNum% = FIX(PortNum% / 2)
NEXT I
BitStatus% = PortBits%(BitYouWant%)