Course Manual Main Book
Course Manual Main Book
Sourabh Sankule
www.sourabh.sankule.com
June 2010
Contribution
Arpit Mathur
Abhijeet Gupta
Ankur Agrawal
Tanmay Gangwani
Sahil Khan
Manoj Gulati
Abhishek Kumar
Punit Narang
Vipin Jaiswal
Acknowledgement
Digital Electronics
In most general terms, this system’s behavior is sufficiently explained by using only two of its
states can be Voltage(more than x volts or less?),distance covered(more than 2.5 km or less?],true-
false or weight of an elephant(will my weighing machine withstand it?) )
Note that although in every case, the all the intermediate states ARE POSSIBLE AND DO EXIST,
our point of interest are such that we don’t require their explicit description. In electronic systems
we mostly deal with Voltage levels as digital entities.
There is no specific fixed definition of logic levels in electronics. Most commonly used level
designation is the one used in CMOS and TTL (transistor transistor logic) families:
Where high and low are actually ‘higher’ and ‘lower’ with respect to a reference voltage
level (ideally taken as 2.5V)
GOOGLY: Why assign ‘0’and ‘1’ and not ‘a ‘and ‘b’, ’x’ and ‘y,’cat ‘and ‘dog’?
ANS: Computational ease!
2. Hexadecimal: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
A clock is simply alternate high and low states of voltage with time i.e. essentially a square wave.
Important terms related to clock are its duty cycle and its frequency:
𝑇ℎ
Duty cycle: It is the ratio of Thand Th+Tl 𝐷 =
𝑇𝑙+𝑇ℎ
These are essentially combinatorial circuits used to implement logical Boolean operations like AND,
NAND, OR, XOR and NOT. NOT and NAND are called universal gates as any other gate can be formed
using either of them!
1.7.1 Resistor:
A color scheme is followed to give the specifications of a resistor. The table for color code is
shown below:
The 1st two bands specify the 2 digits of the resistor value whereas the
3rd band specifies the multiplier in terms of the power to which 10 is
raised and multiplied to the 2 digits.
The tolerance tells the possible % variation of the resistor value about
the value indicated by bands.
1.7.2 Capacitor:
The 2 types of capacitors we frequently use in circuits are ceramic and electrolytic capacitors. While
ceramic capacitors do not have a fixed polarity; electrolytic capacitors should be connected in their
specified polarities only else they might blow off! This polarity is usually provided on the side of the
capacitors ‘corresponding leg.
Figure 5: Electrolytic cap with –ve polarity leg seen Figure 4: Ceramic cap with value 15x104 pF
This is the base used for setting up the circuit. This has embedded metal strips in it that form a grid
of connections inside its body. This allows us to take multiple connections from a single point
without any need of soldering/disordering as in PCBs. It is always a good habit to test the circuit on
breadboard before making it on a PCB.
Figure 7: IC
Figure 6: Top view showing the connecting holes. Bottom view shows the contact metal strips
1.7.5 LED
LED (Light Emitting Diode) is frequently used to display the outputs at various stages of the circuit. It
is essentially a Diode with the energy released in the form of photons due to electron transitions
falling in the visible region. Hence normal diode properties apply to it.
It glows only in fwd bias mode i.e. with p junction connected to +ve voltage and n junction to
negative.
Diodes are essentially low power devices. The current through the LED should be less than
20mA.Hence always put a 220 ohm resistor in series with the LED.
Never forget that LEDs consume a significant amount of power of the outputs of the ICs (CMOS
based).Hence it is advisable to only use them for checking the voltage level (high or low) and then
remove them.
Figure 8: LEDs
2.1 555
Frequency
Duty cycle.
As the name suggests; in this mode the output is stable in only one (mono) state i.e. ‘off’ state.
Thus it can stay only for a finite time, if triggered, to the other state i.e. ‘on’ state. This time can be
set choosing appropriate values of resistances in the formula:
In this mode; the output is stable neither in ‘high’ state nor in ‘low ’ state. Hence it oscillates from
one state to another giving us a square wave or clock. We can set the clock frequency and Duty cycle
D by the formulae:
𝟏.𝟒𝟒 (𝑹𝟏+𝑹𝟐)
F= D=
𝑹𝟏+𝟐𝑹𝟐 𝑪𝟏 (𝑹𝟏+𝟐𝑹𝟐)
NOTE: Capacitor C2 is just to filter the noise and its value can be suitably chosen to be 0.01µF. It can
also be neglected.
With the clock made, we are ready to count the number of pulses passed into the circuit. Note that
any kind of counting requires a memory (you got to know that you have just counted ‘3’ to go to
‘4’!). Hence 4029 can also be used as a memory element that remembers its immediate previous
state.
For displaying the number in the counter output on a seven segment display (i.e. 7 LEDs
making up a figure of ‘8’ as in a general calculator. See fig. )we need to decode the 4 bits and
match them to the 7 pins for lighting the LEDs corresponding to the number. This work is
done by 7447.
NOTE:
The COM pins are to be connected to Vcc via 220 ohm resistor. Why resistor is required??
The dot pin is just for display of decimal point and essentially only makes the upper and
lower sides distinguishable from each other for a single display. without the asymmetry
produced by dot how will we be able to see which side is upper and which is lower?
Light Dependent Resistor (LDR) or photo resistor is a device that acts like a resistance and its
resistance varies with the intensity of light incident on it. In this device, if photons of sufficient
energy fall on it, the resistance drops drastically as the electrons in the semiconductor are able to
jump from the valence band to the conduction band and are available for conduction. The LDRs used
are mostly responsive to visible light. The resistance might drop from as high as 1MΩ in the dark to 1
kΩ in bright light.
Opamp is a very important device used in everyday electronics .It is essentially a differential
amplifier with a very high gain of the order of 105!By differential amplifier I mean that it amplifies
the difference of 2 signals and gives the output.
Opamp equation:
Ironically, this high gain in open loop makes it impossible to use it as a general purpose
differential amplifier directly.
Simplest use of Opamp is as a comparator. It can be used to convert an analog signal to a digital
signal defined by a fixed threshold. Set V- as the threshold voltage say 2.5 V and apply the analog
signal to be digitized at V+ .What will be the output? Well if you have worked out the googly; this
should be a piece of cake!
7805 voltage regulator is used to get +5 V output out of a higher voltage supply (7.5V-20V).We use
adapter’s supply to generate +5V here. Connect the gnd and +12V of adapter to the pins as shown
and get +5V directly as an output out of the 3rd pin. Current up to 0.5 A can be obtained from this
regulator without any significant fall in voltage level.
NOTE: Use 2 capacitors of value say 0.1µF to filter the noise in the input and output of regulator’s
supply as shown.
Embedded Systems
Embedded system is a scaled down computer system which is designed to perform a specific
task/operation. Unlike a general purpose computer
system which is used for a variety of tasks, like playing
music, games, surfing internet etc. The term embedded
tells that whole system is embedded into an appliance. A
single chip contains both hardware and software
(technically, firmware). It is designed to perform
operations which minimize (or even completely avoid)
need of human control.
Basic Flow diagram for embedded computer systems can be shown as:
1. Once an embedded hardware is programmed for a certain task, it is used forever for the
same task. Changing the firmware afterwards is not possible.
2. Such systems are limited in computational resources like memory, CPU processing speed,
I/O facilities but are still capable of performing the task given to them very efficiently.
3. Embedded systems can also be having a reduced functionality version of operating system
called RTOS (Real Time Operating System) for highly specialized applications.
An embedded system may be used for a variety of purposes. Some examples of an embedded
system are:
1. Security System
2. Mobile and PDA
3. Alarm system
4. Automobile system
5. Digital Camera
6. Environment monitoring systems (using sensors and actuators)
Embedded systems are often required to perform real time operations. By Real time operations,
we mean that, operations where delay of even a few milliseconds could be dangerous. Some real
time systems may be:
These are situations where we need very accurate timing and control. Failure in such situations
may cause great loss.
You must be knowing about Digital Integrated Circuits (ICs)right ? For example:
There are AND, XOR, NAND, NOR, OR logic gate ICs, Counters, Timers, Seven Segment
Display Drivers and much more. Just check out 7400 Series and 4000 Series of Integrated
Circuits.
Now let’s take Quad 2 input AND gate IC. It has 4 AND gates, each having 2 pins for input
and 1 pin for output. The truth table or the function table of each gate is fixed. This is as
follows,
Similarly all the Integrated circuits have their function tables and input and output pins fixed.
You cannot change the function and no input pin act as output and vice versa. So whenever
you want to design some circuit you first have to get the output as a function of inputs and
then design it using gates or whatever the requirement is.
So once a circuit is built we cannot change its function ! Even if you want to make some
changes again you have to consider all the gates and components involved. Now if you are
designing any circuit which involves change of the function table every now and then you are
in trouble ! For example if I want to design an Autonomous Robot which should perform
various tasks and I don’t just want to fix the task. Suppose I make it to move in a path then I
want to change the path ! How to do that ?
Here comes the use of Microcontrollers! Now if I give you an Integrated Circuit with 20 pins
and tell you that you can make any pin as output or input also you can change the function
table by programming the IC using your computer! Then your reactions will be wow!that’s
nice :-) That’s what the most basic function of a microcontroller is. It has set of pins called as
PORT and you can make any pin either as output or input. After configuring pins you can
program it to perform according to any function table you want. You can change the
configuration or the function tables as many times you want.
Intel
Atmel
Microchip
Motorola
We will discuss about Atmel Microcontrollers commonly known as AVR in this section.
Answer:Well I cannot go into lot of details about the working because it is a vast topic in
itself. I can just give an overview.
Answer:You basically write the program on your computer in any of the high level
languages like C, C++, JAVA etc. Then you compile the code to generate the machine file.
Now you will ask what this machine file is ? All the machines understand only one language,
0 & 1 that is on and off. Now this 0 & 1 both corresponds to 2 different voltage levels for
example 0 volt for 0 logic and +5 volt for 1 logic. Actually the code has to be written in this
0, 1 language and then saved in the memory of the microcontroller. But this will be very
difficult for us ! So we write the code in the language we understand (C) and then compile
and make the machine file (.hex). After we make this machine file we feed this to the
memory of the microcontroller.
Answer:Assuming you have the machine file (.hex) ready and now you want to feed that to
the flash of the microcontroller. Basically you want to make communication between your
computer and microcontroller. Now computer has many communication ports such as Serial
Port, Parallel Port and USB (Universal Serial Bus).
Lets take Serial Port, it has its own definition that is voltage level to define 0 & 1 (yeah all
the data communication is a just collection of 0 &1 ) Serial Port's protocol is called as UART
(Universal Asynchronous Receiver & Transmitter) Its voltage levels are :-12 volt for 0 logic
and +12 volt for 1 logic.
Now the voltage levels of our microcontroller are based on CMOS (Complementary Metal
Oxide Semiconductor) technology which has 0 volt for 0 logic and +5 volt for 1 logic.
Two different machines with 2 different ways to define 0 & 1 and we want to exchange
information between them. Consider microcontroller as a French and Computer's Serial Port
as an Indian person (obviously no common language in between !) If they want to exchange
information they basically need a mediator who knows both the language. He will listen one
person and then translate to other person. Similarly we need a circuit which converts CMOS
(microcontroller) to UART (serial port) and vice versa. This circuit is called as programmer.
Atmel Microcontrollers are very famous as they are very easy to use. There are many
development tools available for them. First of all we need an easy IDE for developing code. I
suggest beginners to use CVAVR (Code Vision AVR) Evaluation version is available for free
download from the website. It has limitation of code size. It works on computers with
Windows platform that is Windows XP & Vista.
AVRGCC is a very nice open source compiler used by most of the people.
4.2 Programmer
Hardware depends on the communication port you are using on the computer (Serial, Parallel
or USB). I suggest beginners to use Serial Programmer as it is very easy to build. Software
for that is Pony Prog. Some famous Windows (XP, Vista) programmers are:
This is the easiest programmer circuit to make. You just have to get Serial Port connector and
three 1K resistors and you are done! Circuit Diagram is attached.
Now open the datasheet of Atmega you are using (I am using Atmega-16). Go to the pin
configuration and find the following pins and connect the programmer. Programming is done
through SPI (Serial Peripheral Interface) which involves MISO, MOSI and SCK pins. RESET is used to
reset the chip. 0 volt on this pin will reset the chip and for normal running it should be pulled up to
+5V.
Do not forget to connect Reset to Vcc with a 1K/10K resistor for pulling up.
As I told you there are two parts of a programmer, hardware and software. We can build this
hardware as it is very easy with just 3-4 components. Now we need software which support this
hardware and can comminucate with micro controller using this circuit. There are 2 good softwares
for Windows. They are,
Pony Prog
At-Prog
Both of them support Serial as well as Parallel port, but I have always preferred serial port
because it has only 9 pins, hence a smaller connector is required.
4.3.2 At-Prog
I consider it as simplest programmer ever. The circuit we discussed is actually based on this
programmer. Download the folder from the website, unzip it. It has an executable file named at-
prog.exe double click to execute it.
4.3.3 PonyProg
One of the most commonly used programmers on Windows. Download it from the website and
install it. Now let’s set it up for our hardware.
First select AVR micro and AVR-Auto (you can also specify device name, Atmega16) in the chip
options (last two drop down tabs)
Go to the Setup---->Interface-Setup. Then do the settings as shown in the picture below. Then
connect the circuit to the microcontroller, turn on the power supply. Now click on Probe. You should
get Test OK message. If not, check your connections again.
So we are done with the settings and testing’s. Everything is working fine :) Now just open the
hex file from File---->Open-Device-File
USBasp is a USB in-circuit programmer for Atmel AVR controllers. It simply consists of an
ATMega48 or an ATMega8 and a couple of passive components. The programmer uses a firmware-
only USB driver; no special USB controller is needed.
Preprocessing
Compilation
Assembly
Linking
Object Translation
Text Editor
If we just use compiler and linker independently we still need to get a text editor. So
combining everything will actually mess things up. So the best way is to get Software which
has it all. That’s called an Integrated Development Environment, in short IDE.
I consider Code-Vision-AVR to be the best IDE for getting started with AVR
programming on Windows XP, Vista. It has a very good Code Wizard which generate codes
automatically ! You need not mess with the assembly words. So in all my tutorials I will be
using CVAVR. You can download evaluation version for free which has code size limitation
but good enough for our purpose.
For all my examples I will be using Atmega-16 as default microcontroller because it very
easily available and is powerful enough with sufficient number of pins and peripherals we
use. You can have a look on the datasheet of Atmega-16 in the datasheet section.
Let’s take a look on the software. The main window looks like following,
A pop up window will come asking whether you want to use Code Wizard AVR,
obviously select yes because that is the reason we are using CVAVR !
Now have a look on this Wizard. It has many tabs where we can configure PORTS,
TIMERS, LCD, ADC etc. I am explaining some of them
5.1 CHIP:
Select the chip for which you are going to write the program. Then select the frequency at
which Chip is running. By default all chips are set on Internal Oscillator of 1 MHz so select 1
MHz if that is the case. If you want to change the running clock frequency of the chip then
you have to change its fuse bits (I will talk more about this in fuse bits section).
From this tab you can select which pin you want to configure as output and which as
input. It basically writes the DDR and PORT register through this setting. Registers are
basically RAM locations which configure various peripherals of microcontroller and by
changing value of these registers we can change the function it is performing. I will talk more
about registers later. All the details are provided in the datasheet.
So you can configure any pin as output or input by clicking the box.
For Atmega-16 which has 4 Ports we can see 4 tabs each corresponding to one Port. You
can also set initial value of the Pins you want to assign. or if you are using a pin as input then
whether you want to make it as pull-up or tristated, again I will talk in details about these
functions later.
Similarly using this code wizard you can very easily configure all the peripherals on the
Atmega.
Now for generating code just go to File ---->Generate, Save and Exit (of the code
wizard)
Now it will ask you name and location for saving three files. Two being project files and
one being the .C file which is your program. try to keep same names of all three files to avoid
confusion. By default these files are generated in C:\CVAVR\bin
The generated program will open in the text editor. Have a look it has some declarations
like PORT, DDR, TCCR0 and many more. These are all registers which configures various
functions of Atmega and by changing these value we make different functions. All the details
about the registers are commented just below them. Now go down and find following infinite
while loop there. We can start writing our part of program just before the while loop. And as
for most of the applications we want microcontroller to perform the same task forever we put
our part of code in the infinite while loop provided by the code wizard !
while (1)
{
// Place your code here
};
}
See how friendly this code wizard is, all the work (configuring registers) automatically
done and we don’t even need to understand and go to the details about registers too !
Now we want to generate the hex file, so first compile the program. Either press F9 or go
to Project--->Compile.
It will show compilation errors if any. If program is error free we can proceed to making
of hex file. So either press Shift+F9 or go to Project---->Make. A pop up window will come
with information about code size and flash usage etc.
So the machine file is ready now ! It is in the same folder where we saved those 3 files.
6.1 Features
RESET: Reset Input. A low level on this pin for longer than the minimum pulse length will
generate a reset, even if the clock is not running.
AVCC: AVCC is the supply voltage pin for Port A and the A/D Converter. It should be externally
connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC
through a low-pass filter.
AREF: AREF is the analog reference pin for the A/D Converter.
So let’s start with understanding the functioning of AVR. We will first discuss about I/O
Ports. Again I remind you that I will be using and writing about Atmega-16. Let’s first have
a look at the Pin configuration of Atmega-16. Image is attached, click to enlarge.
You can see it has 32 I/O (Input/Output) pins grouped as A, B, C & D with 8 pins in each
group. This group is called as PORT.
Notice that all these pins have some function written in bracket. These are additional function
that pin can perform other than I/O. Some of them are.
6.6 Registers
All the configurations in microcontroller is set through 8 bit (1 byte) locations in RAM
(RAM is a bank of memory bytes) of the microcontroller called as Registers. All the
functions are mapped to its locations in RAM and the value we set at that location that is at
that Register configures the functioning of microcontroller. There are total 32 x 8bit registers
in Atmega-16. As Register size of this microcontroller is 8 bit, it called as 8 bit
microcontroller.
Input Output functions are set by Three Registers for each PORT.
Go to the page 50 in the datasheet or you can also see the I/O Ports tab in the Bookmarks.
First of all we need to set whether we want a pin to act as output or input. DDRX register sets
this. Every bit corresponds to one pin of PORTX. Let’s have a look on DDRA register.
Bit 7 6 5 4 3 2 1 0
PIN PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
Now to make a pin act as I/O we set its corresponding bit in its DDR register.
If I write DDRA = 0xFF (0x for Hexadecimal number system) that is setting all the bits of
DDRA to be 1, will make all the pins of PORTA as Output.
Similarly by writing DDRD = 0x00 that is setting all the bits of DDRD to be 0, will make all
the pins of PORTD as Input.
Now let’s take another example. Consider I want to set the pins of PORTB as shown in table,
For this configuration we have to set DDRB as 11010001 which in hexadecimal isD1. So we
will write DDRB=0xD1
Summary
This register sets the value to the corresponding PORT. Now a pin can be Output or Input. So
let’s discuss both the cases.
If a pin is set to be output, then by setting bit 1 we make output High that is +5V and by
setting bit 0 we make output Low that is 0V.
Let’s take an example. Consider I have set DDRA=0xFF, that is all the pins to be Output.
Now I want to set Outputs as shown in table,
For this configuration we have to set PORTA as 11000110 which in hexadecimal isC6. So
we will write PORTA=0xC6;
If a pin is set to be input, then by setting its corresponding bit in PORTX register will make it
as follows,
Tristated means the input will hang (no specific value) if no input voltage is specified on that
pin.
Pull Up means input will go to +5V if no input voltage is given on that pin. It is basically
connecting PIN to +5V through a 10K Ohm resistance.
Summary
This register is used to read the value of a PORT. If a pin is set as input then corresponding
bit on PIN register is,
For an example consider I have connected a sensor on PC4 and configured it as an input pin
through DDR register. Now I want to read the value of PC4 whether it is Low or High. So I
will just check 4th bit of PINC register.
We can only read bits of the PINX register; can never write on that as it is meant for reading
the value of PORT.
Summary
I hope you must have got basic idea about the functioning of I/O Ports. For detailed reading
you can always refer to datasheet of Atmega.
Now we need to interface an LCD to our microcontroller so that we can display messages, outputs,
etc. Sometimes using an LCD becomes almost inevitable for debugging and calibrating the sensors
(discussed later). We will use the 16x2 LCD, which means it has two rows of 16 characters each.
Hence in total we can display 32 characters.
In recent year the LCD is finding widespread use replacing LEDs (seven segment LEDs or
multisegment LEDs).
This is due to the following reasons:
a)The declining prices of LCDs.
b)The ability to display the numbers, characters and graphics. This is not possible in LEDs,which
can display the numbers and few characters.
c)Incorporation of a refreshing controller into the LCD, Thereby reliving the CPU of the task of
refreshing the LCD.In contrast,the LED must be refreshed by the CPU (or in some other way) to keep
displaying the data.
Theinterfacing of LCD is quite difficult.But we will try to make it simple and let us explain it for
you.
We will learn how to interface the text intelligent LCD display. These displays are available in the
market of 16 column and one Row and more than one row displays.
DATA RAM:
This RAM is storing the ASCII values of corresponding characters which will be displayed on the LCD .
For each column there is one location in the RAM. When we will store the ASCII value at that
location than its corresponding character will be displayed on the screen.
CODE RAM:
This RAM stores the binary pattern according to the character.
ROM:
This ROM stores the binary pattern which is according to the Pixels of LCD and there are patterns of
every character.
COMMAND REGISTER:
It stores various commands for proper functioning.
DATA REGISTER: This register work as buffer for data lines and the internal buses of LCD. The ASCII
values of characters will be given to the data register.
BF (BUSY FLAG):
It indicates the internal working of the LCD. It show whether LCD is busy in any operation or not.
If BF=0 (LCD is idle we can proceed for next operation)
If BF=1 (LCD is busy we cannot proceed for next operation and we have to wait unless operation
completes).
RS (REGISTER SELECT):
The RS pin is used to select Data Register or Command Register.
If RS=0, CR Register is selected, allowing the user to send a command such as clear display,curser at
the home etc.
If RS=1, DR Register is selected, allowing the user to send data to be display on the LCD.
R/W (READ/WRITE):
When R/W=0, Write operation..
When R/W=1 Read Operation
The Enable pin is used by the LCD to latch binary bits available on its data pins. When data is
supplied to data pins, a negative edge is applied to this pin So that the LCD latches in the data
present at the data pins. This pulse must be a minimum of 450 ns wide.
There should be positive edge at EN pin when read operation is required.
D7-D0:
This is 8-bit data pins. D7-D0 are used to send information to the LCD or read the contents of the
LCD’s internal registers.
There are 16 pins in an LCD; See reverse side of the LCD for the PIN configuration.
The connections have to be made as shown below:
When we connect an LCD to Atmega16, one full PORT is dedicated to it, denoted by PORT-X in
the figure. To enable LCD interfacing in the microcontroller, just click on the LCD tab in the Code
Wizard and select the PORT at which you want to connect the LCD. We will select PORTC. Also select
the number of characters per line in your LCD. This is 16 in our case. Code Wizard now shows you
the complete list of connections which you will have to make in order to interface the LCD. These are
nothing but the same as in the above figure for general PORT-X.
As you can see, there are some special connections other than those to uC, Vcc and gnd. These
are general LCD settings. Pin 3 (VO) is for the LCD contrast, ground it through a <1kΩ resistance/
potentiometer for optimum contrast. Pin 15 & 16 (LEDA and LEDK) are for LCD backlight, give them
permanent +5V and GND respectively as we need to glow it continuously.
Now once the connections have been made, we are ready to display something on our screen.
Displaying our name would be great to start with. Some of the general LCD functions which you must
know are:
8.4.1 lcd_clear()
Clears the lcd. Remember! Call this function before the while(1) loop, otherwise you won’t be
able to see anything!
8.4.2 lcd_gotoxy(x,y)
Place the cursor at coordinates (x,y) and start writing from there. The first coordinate is (0,0).
Hence, x ranges from 0 to 15 and y from 0 to 1 in our LCD. Suppose you want to display something
starting from the 5th character in second line, then the function would be
lcd_gotoxy(5,1);
8.4.3 lcd_putchar(char c)
lcd_putsf(“IIT Kanpur”);
To display a variable string, which is nothing but an array of characters (data type char) in C
language . e.g., You have an array char c[10] which keeps on changing. Then to display it, the
function would be called as
lcd_puts(c);
Now we have seen that only characters or strings (constant or variable) can be displayed on the
LCD. But quite often we have to display values of numeric variables, which is not possible directly.
Hence we need to first convert that numeric value to a string and then display it. For e.g., if we have
a variable of type integer, say intk, and we need to display the value of k (which changes every now
and then, 200 now and 250 after a second... and so on). For this, we use the C functions itoa() and
ftoa(), but remember to include the header file stdlib.h to use these C functions.
It stores the value of integer val in the character array arr. E.g., we have already defined int i and
char c[20], then
Similarly we have
It stores the value of floating variable f in the character array arr with the number of decimal places
as specified by second parameter. E.g., we have already defined float f and char c[20], then
Now we are ready to display anything we want on our LCD. Just try out something which you
would like to see glowing on it!
Figure 16 illustrates a basic UART data packet. While no data is being transmitted, logic 1 must be
placed in the Tx line. A data packet is composed of 1 start bit, which is always a logic 0, followed by a
programmable number of data bits (typically between 6 to 8), an optional parity bit, and a
programmable number of stop bits (typically 1). The stop bit must always be logic 1.
Most UART uses 8bits for data, no parity and 1 stop bit. Thus, it takes 10 bits to transmit a byte of
data.
Figure 17: Basic UART packet format: 1 start bit, 8 data bits, 1 parity bit, 1 stop bit.
BAUD Rate: This parameter specifies the desired baud rate (bits per second) of the UART. Most
typical standard baud rates are: 300, 1200, 2400, 9600, 19200, etc. However, any baud rate can be
used. This parameter affects both the receiver and the transmitter. The default is 2400 (bauds).
In the UART protocol, the transmitter and the receiver do not share a clock signal. That is, a clock
signal does not emanate from one UART transmitter to the other UART receiver. Due to this reason
the protocol is said to be asynchronous.
Since no common clock is shared, a known data transfer rate (baud rate) must be agreed upon prior
to data transmission. That is, the receiving UART needs to know the transmitting UART’s baud rate
(and conversely the transmitter needs to know the receiver’s baud rate, if any). In almost all cases the
receiving and transmitting baud rates are the same. The transmitter shifts out the data starting with
the LSB first.
Once the baud rate has been established (prior to initial communication), both the transmitter and the
receiver’s internal clock is set to the same frequency (though not the same phase). The receiver
"synchronizes" its internal clock to that of the transmitter’s at the beginning of every data packet
received. This allows the receiver to sample the data bit at the bit-cell center.
A key concept in UART design is that UART’s internal clock runs at much faster rate than the baud
rate. For example, the popular 16450 UART controller runs its internal clock at 16 times the baud rate.
This allows the UART receiver to sample the incoming data with granularity of 1/16 the baud-rate
period. This "oversampling" is critical since the receiver adds about 2 clock-ticks in the input data
synchronizer uncertainty. The incoming data is not sampled directly by the receiver, but goes through
a synchronizer which translates the clock domain from the transmitter’s to that of the receiver.
Additionally, the greater the granularity, the receiver has greater immunity with the baud rate error.
Once the start bit is detected, the subsequent data bits are assembled in a de-serializer. Error
condition maybe generated if the parity/stop bits are incorrect or missing.
The standard used for serial communication is RS-232 (Recommended Standard 232). The RS-
232 standard defines the voltage levels that correspond to logical one and logical zero levels. Valid
signals are plus or minus 3 to 15 volts. The range near zero volts is not a valid RS-232 level; logic one
is defined as a negative voltage, the signal condition is called marking, and has the functional
significance of OFF. Logic zero is positive; the signal condition is spacing, and has the function ON.
Now we know that this is not the voltage level at which our microcontroller works. Hence, we
need a device which can convert this voltage level to that of CMOS, i.e., logic 1 = +5V and logic 0 =
0V. This task is carried out by an IC MAX 232, which is always used with four 10uF capacitors. The
circuit is shown:
The Rx and Tx shown in above figure (pins 11 and 12 of MAX232) are the Rx and Tx of Atmega
16 (PD0 and PD1 respectively).
Once our electronic circuit is complete, we can start with coding. To enable UART mode in
Atmega16, click on the USART tab in Code Wizard. Now depending upon your requirement, you can
either check receiver, transmitter or both. You get a list of options to select from for the baud rate.
Baud Rate is the unit of data transfer, defined as bits per second. We will select 9600 as it is fair
enough for our purpose, and default setting in most of the applications (like Matlab, Docklight, etc.).
Keep the communication parameters as default, i.e., 8 data, 1 stop and no parity and mode
asynchronous. You also have option of enabling Rx and Tx Interrupt functions, but we won’t do at
this point.
9.3.1 putchar()
To send one character to the buffer, which will be received by the device (uC or computer)?E.g.,
9.3.2 getchar()
To receive one character from the buffer, which might have been sent by the other uC or the
computer.E.g., if we have already defined a variable char c, then
9.3.3 putsf()
putsf(“Robocon Team”);
To communicate with the computer, you need a terminal where you can send data through
keyboard and the received data can be displayed on the screen. There are many softwares which
provide such terminal, but we will be using Docklight. Its evaluation version is free for download on
internet, which is sufficient for our purpose.
To start with, check the Terminal Settings in Docklight. Go to Tools-> Project Settings. Select the
Send/Receive communication channel, i.e., the name by which the serial port is known in your
computer (like COM1…). In the COM port settings, select the samevalues as you had set while
coding Atmega 16. So, we will select Baud Rate 9600, Data Bits 8, Stop Bits 1, Parity Bits none. You
can select ‘none’ in Parity Error Character. Click OK.
We are now ready to send/receive data, so, select Run->Start Communication, or, press F5. If your
uC is acting as a transmitter, then the characters it sends will appear in the Communication window
of Docklight. E.g.,
putchar(‘K’);
delay_ms(500); // Sends character K after every 500ms
Hence what you get on the screen is a KKKKKKKKKKKKKKKKKKKKKKKKK…….. one K increasing every
500ms. To stop receiving characters, select Run->Stop Communication, or press F6.
If the receiver option is also enabled in Atmega16, then whatever you type from keyboard will be
received by it. You can either display these received characters on an LCD, control motors depending
on what characters you send, etc. e.g.,
When you are done with sending data, select Run->Stop Communication, or press F6.
Timer 0, 8 bit
Timer 1, 16 bit consisting of two 8 bit parts, A and B
Timer 2, 8 bit
1. System Clock (fs): This is the clock frequency at which Atmega is running. By default it is 1 MHz
which can be changed by setting fuse bits.
Now ft can be in ratios of fs. That is, ft = fs, fs/8, fs/64 ...
Basically each Timer has a counter unit with size 8 bit for Timer 0, 2 and 16 bit for Timer 1.I will be
talking about Timer 0 and same will follow for other Timers.
Each counter has a register which increments by one on every rising edge of timer clock. After
counting to its full capacity, 255 for 8 bit, it again starts from 0. By using this register we can have
different modes.
Timer/Counter (TCNT0) and Output Compare Register (OCR0) are 8-bit registers.
TOP: The counter reaches the TOP when it becomes equal to the highest value in the count
sequence. The TOP value can be assigned to be the fixed value 0xFF (MAX) or the value stored in
the OCR0 Register. The assignment is dependent on the mode of operation.
F = Ft / 256
0 ≤ OCR0 ≤ 255
𝐟𝐭
F=
𝟐 (𝑶𝑪𝑹𝟎+𝟏)
D= 0.5
0 ≤ OCR0 ≤ 255
The Serial Peripheral Interface Bus or SPI bus is a synchronous serial data link used to communicate
between two or more microcontroller and devices supporting SPI mode data transfer. Devices
communicate in master/slave mode where the master device initiates the data frame. Multiple slave
devices are allowed with individual slave select (chip select) lines.
1. MOSI : Master Out Slave In (Tx for Master and Rx for Slave)
2. MISO : Master In Slave Out (Rx for Master Tx for Slave)
3. SCK : Serial Clock (Clock line)
4. SS: Slave Select (To select Slave chip) (if given 0 device acts as slave)
Master: This device provides the serial clock to the other device for data transfer. As a clock is used
for the data transfer, this protocol is Synchronous in nature. SS for Master will be disconnected.
Slave: This device accepts the clock from master device. SSfor this has to be made 0 externally.
MOSI MOSI
MISO MISO
Master Slave
SCK SCK
0 SS
Open Code Wizard and go to SPI tab. Enable SPI and choose
Master in SPI Type.
Open Code Wizard and go to SPI tab. Enable SPI and choose
Slave in SPI Type.
What we have seen till now that the input given to uC was digital, i.e., either +5 V (logic 1) or 0V
(logic 0). But what if we have an analog input, i.e., value varies over a range, say 0V to +5V? Then we
require a tool that converts this analog voltage to discrete values. Analog to Digital Converter (ADC)
is such a tool.
ADC is available at PORTA of Atmega16. Thus we have 8 pins available where we can apply
analog voltage and get corresponding digital values. The ADC register is a 10 bit register, i.e., the
digital value ranges from 0 to 1023. But we can also use only 8 bit out of it (0 to 255) as too much
precision is not required.
Reference voltage is the voltage to which the ADC assigns the maximum value (255 in case of 8
bit and 1023 for 10 bit). Hence, the ADC of Atmega16 divides the input analog voltage range (0V to
Reference Voltage) into 1024 or 256 equal parts, depending upon whether 10 bit or 8 bit ADC is
used. For example, if the reference voltage is 5V and we use 10bit ADC, 0V has digital equivalent 0,
+5V is digitally 1023 and 2.5V is approximately equal to 512.
To enable ADC in Atmega16, click on the ADC tab in Code Wizard and enable the checkbox. You
can also check “use 8 bits” as that is sufficient for our purpose and 10 bit accuracy is not required. If
the input voltage ranges from 0 to less than +5V, then apply that voltage at AREF (pin 32) and select
the Volt. Ref. as AREF pin. But if it ranges from 0 to +5 V, you can select the Volt. Ref. as AVCC pin
itself. Keep the clock at its default value of 125 kHz and select the Auto Trigger Source as Free
Running. You can also enable an interrupt function if you require.
Now when you generate and save the code, all the register values are set automatically along
with a function:
This function returns the digital value of analog input at that pin of PORTA whose number is
passed as parameter, e.g., if you want to know the digital value of voltage applied at PA3, and then
just call the function as,
read_adc(3);
If the ADC is 8 bit, it will return a value from 0 to 255. Most probably you will need to print it on
LCD. So, the code would be somewhat like
a=read_adc(3);
itoa(a,c);
lcd_puts(c);
An interrupt is a signal that stops the current program forcing it to execute another program
immediately. The interrupt does this without waiting for the current program to finish. It is
unconditional and immediate which is why it is called an interrupt.
The whole point of an interrupt is that the main program can perform a task without worrying about
an external event.
Example
13.1 Polling
If however you had to do some long calculation then a keyboard press could be missed while the
processor is busy. With polling you have to be more aware of the processor activity so that you allow
enough time for each essential activity.
By using a hardware interrupt driven button reader the calculation could proceed with all button
presses captured. With the interrupt running in the background you would not have to alter the
calculation function to give up processing time for button reading.
The interrupt routine obviously takes processor time – but you do not have to worry about it while
constructing the calculation function.
You do have to keep the interrupt routine small compared to the processing time of the other
functions - it’s no good putting tons of operations into the ISR. Interrupt routines should be kept
short and sweet so that the main part of the program executes correctly e.g. for lots of interrupts
you need the routine to finish quickly ready for the next one.
The benefit of the hardware interrupt is that processor time is used efficiently and not wasted
polling input ports. The benefit of polling is that it is easy to do.
Another benefit of using interrupts is that in some processors you can use a wake-from-sleep
interrupt. This lets the processor go into a low power mode, where only the interrupt hardware is
active, which is useful if the system is running on batteries.
Hardware interrupt Common terms
Terms you might hear associated with hardware interrupts are ISR, interrupt mask, non maskable
interrupt, an asynchronous event, and interrupt vector and context switching.
2. Falling Edge:In this mode interrupt occurs whenever it detects a falling edge that is ‘1’ to ‘0’ logic
change at INT pin.
3. Rising Edge:In this mode interrupt occurs whenever it detects a falling edge that is ‘0’ to ‘1’ logic
change at INT pin.
After generating the code, you can see the following function,
You can place your code in the function, and the code will be executed whenever interrupt occurs.
Robotics
Includes wheeled or any type of chassis with all the necessary actuators fitted on the chassis to
achieve desired goal. We mostly use DC geared motors as actuators.
2. Electronics
Electronics includes Sensors, motion control circuits, power management system etc.
3. Power Source
Usually battery pack consisting of Lead acid, Nickel cadmium, Nickel metal hydride or Lithium
batteries is used.
4. Intelligence
This is the most important part of the autonomous robots. Usually intelligence is achieved by using
Microcontroller.
First step in making an autonomous robot is to chalk out what tasks we are expecting the robot
to perform. After gauging these we get a vague idea about the design and appearance of the robot.
Power for motion is provided by back wheels and turning is achieved using front wheels.
1. When path to be followed is straight in nature with curved turns this configuration gives fastest
speed and graceful path following.
2. Don’t need to modify left or right wheels velocity to follow the path. This is very advantageous
when we want precision velocity control. In this case back wheels take care of velocity control
and front wheels take care of direction control.
Disadvantages:
1. It will not able to take very sharp turns. Hence it is difficult to move robot on the grid of lines.
A method of controlling a robot where the left and right wheels are powered independently.
The Three Wheel Differential drive uses two motors and a caster or an omni-directional wheel
easiest to design and program.
Figure 23: Ball bearing caster, wheel based swivel caster and omni directional wheel
The radius and centre of rotation can be varied by the varying the relative speed of rotation
between the two motors.
For a smooth turn, rotate the wheels in the same direction but with different speeds. Greater
the difference in speeds, smaller the radius of rotation.
Advantages:
2. Easy to move when path to be followed is contoured and zigzag in nature. E.g., navigating along
the maze of lines.
Disadvantages:
1. If we want to move along curved path we have to control left and right motor’s velocity
independently. Hence precision velocity control becomes difficult as actual velocity of the robot
will be average of the both wheels.
Device used to convert electrical energy into mechanical energy is called a motor. A motor is
very useful in robotics and embedded systems to give movement and designing control systems.
Some Motors used in embedded systems and robotics are described as below:
i. Stepper motors
ii. Servo motors
iii. Geared DC Motors
Stepper motors
A motor which divides its full rotation into a large number of steps is called a stepper motor.
These steps help in precise, step by stepmovement of the rotor
giving precise control over movement.
The shaft of stepper motor has permanent magnets attached to
it. The rotor is surrounded by series of coils which can be turned on
and off and the magnetic field change causes the rotor to move.As
the movement is controlled by turning coils on or off, it is easier to
program the movements of stepper motor using microcontrollers.
These motors are also called open loop systems and do not have
any feedback mechanism. These have very simple design and are
often less reliable.Such motors are used in variety of devices like linear actuators, printers etc.
Servo motors
A servo motor is defined as the motor that allows more precise control of position, velocity, or
torque using feedback loops. These feedback loops help in stability analysis and give better control
over movement. These are also called closed loop systems.
These motors cannot rotate continually and hence cannot be
used for driving wheels. These motors usually have a 90-180
degree movement. Servo motors are normally used in machine
tools and automation robots.
Programming these motors is more complex. Also the design
is more complex. These are more reliable than Stepper motors.
Geared DC motors
Gear motors are motors with an integrated gearbox. The function of gearbox is to increase
torque generating capacity of the motor reducing its output speed. Hence,
the need for speed reducing arrangement is eliminated.
Geared motors have a variety of applications. Some of its uses are as in
wheelchairs, stair wheels etc.
It allows a circuit full control over a standard electric DC motor. That is, with an H-bridge, a
microcontroller, logic chip, or remote control can electronically command the motor to go
forward, reverse, brake, and coast.
H-bridges are available as integrated circuits, or can be built from discrete components.
A "double pole double throw" relay can generally achieve the same electrical functionality as
an H-bridge, but an H-bridge would be preferable where a smaller physical size is needed,
high speed switching, low driving voltage, or where the wearing out of mechanical parts is
undesirable.
The term "H-bridge" is derived from the typical graphical representation of such a circuit,
which is built with four switches, either solid-state (eg, L293/ L298) or mechanical (eg,
relays).
S1 S2 S3 S4 Result
1 0 0 1 Motor rotates in one
direction
0 1 1 0 Motor rotates in
opposite direction
0 0 0 0 Motor free runs
(coasts)
0 1 0 1 Motor brakes
1 0 1 0 Motor brakes
To power the motor, you turn on two switches that are diagonally opposed.
The current provided by the MCU is of the order of 5mA and that required by a motor is
~500mA. Hence, motor can’t be controlled directly by MCU and we need an interface
between the MCU and the motor.
A Motor Driver IC like L293D or L298 is used for this purpose which has two H-bridge drivers.
Hence, each IC can drive two motors.
Note that a motor driver does not amplify the current; it only acts as a switch (An H bridge is
nothing but 4 switches).
Drivers are enabled in pairs, with drivers 1 and 2 beingenabled by the Enable pin. When an
enable input is high (logic 1 or +5V), the associated drivers areenabled and their outputs are
active and in phase with their inputs.
When the enable pin is low, the output is neither high nor low (disconnected), irrespective
of the input.
Direction of the motor is controlled by asserting one of the inputs to motor to be high (logic
1)and the other to be low (logic 0).
To move the motor in opposite direction just interchange the logic applied to the two inputs
of the motors.
Resistance of our motors is about 26 ohms i.e. its short circuit current will be around.
0.46Amp which isbelow the maximum current limit.
It is always better to use high capacitance (~1000µF) in the output line of a motor driver
which acts as a small battery at times of current surges and hence improves battery life.
Difference between L293 and L293D: Output current per channel = 1A for L293 and 600mA
for L293D.
L293 is quadruple half-H driver while L298 is dual full-H driver, i.e, in L293 all four input-
output lines are independent while in L298, a half H driver cannot be used independently,
only full H driver has to be used.
Output current per channel = 1A for L293 and 2A for L298. Hence, heat sink is provided in
L298.
Protective Diodes against back EMF are provided internally in L293D but must be provided
externally in L298.
To control motor speed we can use pulse width modulation (PWM), applied to the enable
pins of L293 driver.
PWM is the scheme in which the duty cycle of a square wave output from the
microcontroller is varied to provide a varying average DC output.
What actually happens by applying a PWM pulse is that the motor is switched ON and OFF at
a given frequency. In this way, the motor reacts to the time average of the power supply.
The output varies from 0V to 5V depending upon the amount of IR it receives, hence the name
analog.
The output can be taken to a microcontroller either to its ADC (Analog to Digital Converter) or LM
339 can be used as a comparator.
TSOP 1738 Sensor is a digital IR Sensor; It is logic 1 (+5V) when IR below a threshold is falling
on it and logic 0 (0V) when it receives IR above threshold.
It does not respond to any stray IR, it only responds to IR falling on it at a pulse rate of
38KHz. Hence we have a major advantage of high immunity against ambient light.
No comparator is required and the range of the sensor can be varied by varying the intensity
of the IR emitting diode (the variac in figure).
A Line following robot is a machine which can follow a given path. A Path can be in the form of a
black line on a white surface or reverse of it. The Path can also be in the form of magnetic lines
which is out of scope of this course. Such robot
is a closed loop system having a feedback
mechanism to correct wrong moves. Line
following robots can be driven using analog
comparator based circuit like opamp or by
microcontroller both using feedback from
analog or digital sensors.
Detection of line is usually done by emitting
light on the surface. If light gets reflected back,
then it is white surface else the surface is black.
Emission of light is usually done with the help of
IR LEDs (Light Emitting Diodes). An array of such
LEDs is used. The emitted light is then received
using phototransistors, LDR (Light Dependent
Register), TSOP. Based on the value of light received, the received energy is converted to electrical
energy.
If the robot gets off the track, the speed of wheel motors is proportionally varied to make it back
on the track.
Line following property of a robot is very useful in designing automated cars. Also, industrial
robots may use such mechanism in order to be on proper path.