Microprocessor, Microcontroller and
System on Chip
Microprocessor:
Microprocessor is the Central Processing Unit (CPU) of embedded
system. It does arithmetic and logic operations of the digital
binary data.Very old embedded systems circuit/board was
generally made up of separate microprocessor (8085), I/P
interface, O/P interface, memory, clock and timing devices,
power supply devices, and analog/linear devices.
Microcontroller:
In the early days of embedded systems, engineers have built
embedded systems with separate set of devices connected
on a printed circuit board. The complexity involved in manufacturing
and re-engineering was very high with many Integrated Circuits
and other components on-board. Also the advance in technology
has enabled processor manufacturers to add one device after
one into single IC. It started with adding I/O interface
and memory, now we see lot more functions inside the processor
chip. These microprocessors with all the additional support
built-in are called microcontrollers.
To define, Microcontroller is an Integrated Circuit device
with CPU, memory, I/O interface and any other logic and
analog function on a single chip.
System On Chip (SOC)
Even though MCU holds most of the functions, it still lacks
in few special analog functions and application specific
functions. The idea of putting entire system (all the semiconductor
IC functions) on a single chip is called System on chip.
On a printed circuit board, you see a single IC accompanied
with few discrete and passive components.
If we look at the recent microcontrollers released in the
market, most of them are very close to System On Chip. The
concept of SOC is well ticking in the market.
SOC is a common sense solution, that means, why we have
to go for a complex board when we can put everything into
a single IC. SOC saves board space, ease manufacturing,
and score higher in reliability over non-SOC solutions.
It's drawback is, the manufacturer profits from this product
only if it's used in millions. Also it steals some design
flexibility for the design engineer.
Processor Architecture
The two most popular architectures used in embedded world
are Harvard and Van Neumann. Read this separate article
describing the differences between these two architectures.
The
Van Neumann V/S harvard processor architecture.
The popular microcontrollers and companies
There are plenty of microcontroller manufacturers all around
the world. We in India don't have a LOCAL IC manufacturer
who can supply microcontroller chips. However all the major
microcontroller vendors in the world have support offices
in all our metros. To learn about latest trends in microcontrollers
read this report.
Market
and technology trends of microcontrollers in the year 2006
Programming: machine language, assembly language, and
C programming
Throughout this course these below books will be suggested
to you for further reference. We will mention the page number
and book title wherever is required in this course material.
Please buy these or refer them in any nearby library.
The books are,
1) Embedded Systems Building Blocks, by Jean LaBrosse
2) An Embedded Software Primer, by David Simon
3) The Art of Designing Embedded Systems, by Jack Ganssle
4) Fundamentals of Embedded software by Daniel Lewis
Assembly and machine language
Now let's start embedding! We will begin training you
in programming now, and in coming modules we will be covering
on details of functional blocks available on a microcontroller.
The microcontroller is the one, which decides what need
to be done, what need not be done, and how to be done. Basic
rule we need to keep in mind while "instructing"
the microcontroller is - microcontroller is like a very
intelligent child. The child (controller) would do exactly
what was told it to do - nothing more nothing less. If the
instruction is ambiguous then the behavior of the microcontroller
would go haywire.
Example: In a bread toaster, the sequence of operations
is,
a) Turn on the heater
b) Check whether the bread is properly roasted or not (by
checking the temperature or set time)
c) If bread is not yet completely toasted properly again
go to step (b)
d) Stop the heater as the bread is toasted properly.
Now how do you tell this sequence to a microcontroller inside
a bread toaster? You should tell it (microcontroller) in
a way it understands. It is like speaking to a person who
knows some language, which you can't speak. The instant
option left to you to speak to such person is to catch hold
of a translator, who knows both the languages and translate/convert
your language to other's language.
The language what all microcontrollers understand is called
machine language. Here is just a few lines of machine language
for Freescale's 6812 microcontroller.
CF0C00180B8000024D008018030FA008009600847FB1F033260EFE080009
7E080026EE4C008020E918030FA008004D008020DE23F000
Does this jumble of hexadecimal codes dismay you? Obviously
you should be! Any way don't get disheartened by this magic
series of numbers. But make it very clear this (machine
language) is the native language of all the microcontrollers
and you should "instruct" them only in their language.
Also this machine language is different for each microcontroller
families (8051, PIC, ARM etc..).
In the very early stages itself computer scientists/ chip
designers noted this problem instantaneously and came out
with a solution. For each of the operation that microcontroller
can do (execute) they assigned an "English like"
word so that programmer/ designer can easily instruct the
microcontroller. This is called assembly language.
Here below is table of assembly languages instructions
for popular PIC16xx microcontroller. In total it has only
35 instructions.
In this above table, the English type words in the first
column are assembly language instructions and the binary
codes in the fourth column are machine language instructions.
With this background let us do a small exercise. Let us
try to add two numbers, say 3 and 4.
Again remember this,
[Microcontroller is like a very intelligent child. The child
(microcontroller) would do exactly what was told it to do
- nothing more nothing less. If the instruction is ambiguous
then the behavior of the microcontroller would go haywire.]
MOVLW #3; Move value 3 into register W (working register).
What is register?
Register in the context of microcontrollers: Register is
some temporary space which it can be used to keep some value
temporarily. Generally every microcontroller will have some
registers. Some registers have special purpose capability.
In this context the register we are using is called "W"
register or working register.
ADDLW #4; Now the working register content is added with
another value 4.
So now the result 7 is in Working register and it can
be used by programmer in any way he/she wants (like display/
store it future arithmetic operations etc)
Basically assembly level language is all about knowing what
all the instructions are available with particular microcontroller
and write the program (code) according to requirement using
the list of available assembly instructions. So by now we
know little bit of knowledge on how to speak to microcontroller
in their own language.
Now the questions arise. We the programmers use the assembly
language as the instructions to "instruct" the
microcontroller. But it is already mentioned that microcontrollers
only understand machine language as machine language is
the native language of all the microcontrollers and we should
"instruct" them only in their language.
How does the assembly language become machine language?
Here comes the "Assembler" (You language translator
friend): Assembler is a program, which converts assembly
instructions to machine language. It is like a translator
(dhubashi) who would be used when two persons are communicating
in completely different languages.
The C language - very essential
Now we know some basics of machine and assembly language,
so that we can instruct microcontrollers in their own language.
Now let us C!
The assembly language programming would work only for simple
embedded applications, as you develop bigger and complex
applications the assembly language code will be very difficult
to manage and the time and effort required to program and
debug (fixing errors) rises exponentially with the total
code size.
Assembly can still be used for simple programs, only if
you wish to experiment. Otherwise C language is the only
practical and efficient solution. The thumb rule to decide
whether the program is simple or complex is, less than 1000
lines of assembly code than it's simple, greater than 1000
lines of assembly code; better call it complex.
Here few examples of some of the assembly instruction set
of few popular microcontrollers.
680x0 based microcontrollers (680x0 are popular 16 bit
series of microprocessor/ micro microcontrollers from Motorola)
BRA - Branch;
JNOV - Jump on No Overflow;
DBcc - Test Condition, Decrement, and Branch;
STJ - Store jump-register;
Some of the PIC based assembly instructions.
DECFSZ f,d - Decrement f, Skip if 0
BTFSS - Bit Test f, Skip if Set
IORWF f,d - Inclusive OR W with f
RETLW k - Return with literal in W
Some of the 8051 instruction set
DJNZ - Decrement Register and Jump if Not Zero
JBC - Jump if Bit Set and Clear Bit
LCALL - Long Call
LJMP - Long Jump
XCHD - Exchange Digits
What do you think of these instructions? Seems like some
combination of English alphabets isn't it? We immediately
feel intimidated by seeing them in the code. How much ever
comments/ explanation is provided, it would be very difficult
for "new" guy to understand the logic. (New guy
is just an acronym here - if you see the code you have written
in assembly after 6 months - you will be the "new"
guy - In the beginning of my career(author) I have become
"new guy" several times and left the difficult
portion of the code - simply re-wrote the module - which
saved my time and effort). So first problem is its readability.
No matter what ever the clarity in description in the form
of comments/explanation would make a new guy to feel uncomfortable
with the code. So imagine a case of complex embedded application
written by multiple developers. Simply it is hell.
Next problem is its (assembly languages) compatibility.
Assume with great difficulty the embedded application is
developed in assembly language and is fairly working well.
Now suddenly market scenario changes and instead of microcontroller-X(which
is used by you) microcontroller-Y is cheaper/ affordable
(We have seen cases where the microcontroller (and its associated
hardware design) changed overnight as another microcontroller
was available for 10 cents less). Now in no way you can
complete the project as,
--> You need to completely unlearn the assembly
language of microcontroller-X and learn that of microcontroller-Y
--> Logically design the flow and implement the
code using new assembly language
--> Test the entire setup again.
Here comes the silver bullet - C language. Basically C
language is universally known and any "new guy"
can learn the basics of C in couple of weeks and understand
the design / flow. Also if the hardware (controller) is
changed/ redesigned all you need to do is re-compile your
program for the new microcontroller :) Life is very easy.
Again - let us remember our postulate. Microcontrollers
only understand machine language as machine language is
the native language of all the microcontrollers and we should
"instruct" them only in their language. So how
does the C language code become machine language?
Here comes the "Compiler", compiler is a program
which converts C language to machine language. It is like
another (high level) translator
But bear in mind - Assembly language (or machine language)
is the one which gives fastest and compact code. Basically
assembly language is used in these two things.
· The first is for when you need to access hardware.
Writing routines to interact with the hardware can be easier
and cleaner than the equivalent operation in C. It is not
difficult to export the assembly routines to make them callable
from C or some other language, so you can get the advantage
of having precise control over the hardware without having
to write your entire program in assembly.
· The other thing assembly is good for is optimizing
certain parts of a program. If you have an extremely time
critical routine that is called a lot, then it makes sense
to go through it with a fine toothed comb and choke every
possible cycle out of it. You have to look at the speed
gain and compare it to the time you spent optimizing the
code. If you spent three hours optimizing a routine, and
you only get a 2 microsecond speed gain, then you have to
call that routine billions of times to make it worthwhile.
In most cases, it's simply not worth the effort. Embedded
applications and DSP are areas where hand optimization might
make a significant difference, but unless you doing some
extreme number crunching on a PC, it's probably not worth
it.
Other than these two things assembly language does not
play much role in embedded systems. There are some extreme
cases where the complete windows programming is done in
assembly. This just shows how much complexity a person can
handle and remember this can not be done by next (other)
guy.
Ok now we are little bit into the embedded systems. At
this point it would be ideal to have some hardware/ assembler/
compiler to play with. We would provide some of the example
hardware which we would be using (it would be better if
you have them and keep trying the next sections/ examples).
Otherwise it will be like hearing a nice story and forgetting
everything.
Kits to buy to practice this course:
From this module onwards our teaching gets more practical.
If you own a personal computer at home, you can establish
your own lab to practice this course. You got to do little
shopping to establish an embedded lab.
You need microcontroller development and support material.
We have decided to tailor this course for ARM 7 based microcontrollers.
The kit we are using is AME-51 lite (ML67Q4050) from OKI
Semiconductor.
Here are brief specs of the kit:
Kit Name: AME-51 Lite, the kit consists of,
AME-51 Lite CPU Board with processor ML67Q4050 (ARM 7)
RS232 Serial Cable
OKI AME-51 Lite CD (GNU Compiler)
Quick Start Guide
The cost of the kit is with in 6000/- Rs (Inclusive of
taxes)
The contact details to buy this kit are,
Contact person: Amit Agarwal
OKI Semiconductor Singapore Pte. Ltd.
906 Prestige Meridian -1
29 MG Road Bangalore
Ph: 91 -80- 41530990/91/92
Mobile: 91- 99001-59714
However you can continue to learn from this course without
buying kit. There won't be much of a loss except for the
practical exposure. If in case you wish to write few sample
code on yourself (after completing reading of few more modules)
send to us your code/program to get vaidated. We can publish
and reward good programs (both c and assembly).
Also you can buy any other ARM7 kit, and try to intrepret
this course material to that kit.
Our email: editor@eeherald.com
Click on the text below for the next module
ABOUT THIS COURSE:
Totally EEHerald plan to bring 12 modules. You can
be assured of completing basic course in Embedded Systems
after studying and practicing exercises in all the modules.
We will give priority to programming and serial communications
(SPI, USB, CAN etc..) part. To receive a copy of total course
syllabus, please email to us.
This free tutorials on embedded systems is prepared
by embedded professionals with more than10 years of industrial
experience, however we want your feedback on this course
content; please email your questions, suggestions and comments
to editor@eeherald.com. Your questions on present modules
will be answered in the revised modules. We may change the
course content based on the majority of your requests and
feedbacks.
Please let your friends know about this course, we request
you to email this link to your friends and colleagues who
are interested in embedded system.