Posts Tagged led

Blink LED using 8051

8051… this is historically one of the most important microcontroller the world has seen so far. To say it in one sentence..Its a piece of beauty.

the microcontroller p89v51rd2

What I present in this article is the first assembly language program that I ran on the 8051 microcontroller. If you have seen my “Blinking LED using Arduino”, we do a very similar thing here. However the difference is, blinking an LED using an Arduino board is just too easy and for the most part of it we are unaware of what is happens in the various registers. Although there is an easier way to program an 8051 using the C language, I intend to program it using the assembly language here simply because it gives me a better sense of control over the registers and also it is a fairly easy program to be implemented in assembly. Also programming in assembly makes you think a bit harder which can be fun if you want it to be.

Okay enough of the intro .. lets start.

The following components are required in this project:

  • An 8051 board. I am using the 89V51RD2 starter kit. I got it from here: 8051 Starter Kit
  • LEDs
  • A programmer
  • Programs like Keil and flashmagic to write the program and upload it to the microcontroller.
  • Connecting wires.

First things first, the objective. Our aim here is to connect  LEDs to one of the i/o ports and program the microcontroller such that the LEDs glow for 1 sec and turn off for the next second and they keep doing until the end of time (.. or as long as we supply power to the microcontroller)

Now.. the crystal that is used in my 8051 board oscillates at 11.0592MHz frequency. In other words there are 11.0592 million crystal pulses every second.

Next we look at the two timers (T0 & T1). Irrespective of which mode they are used in, the timers in the 8051 only keep incrementing and they increment by 1 every “machine cycle”. A machine cycle in 8051 requires 12 crystal pulses always. So although different instructions in the “Instruction set” require different number of machine cycles, a timer increments after every machine cycle.

So doing some math here a timer increments

11059200/12 = 921600 times every second

In other words it increases by 1 in 1.085 micro seconds. Here we will be using Timer 0 and will be using it in the 16 bit mode( Timer 0 and Timer 1 each are actually a combination of two 8 bit registers. Timer 0 -TH0 & TL0, Timer 1 – TH1 & TL1). Okay so 16 bits… which means it can count from 0 to (2^16) – 1 i.e from 0 to  65535, after which it will overflow, reset itself to 0 and start all over again. So lets check how much time does it take to do that:

65536 / 921600 = 0.07 sec

Well this is an odd value and it might be a bit tedious to work with such a number. So lets go the other way round. Lets check how many times does it increment in 0.05sec

0.05 * 921600 = 46080 increments.

Since it takes 1/20 th of a second to have 46080 increments, what we need to do is carry out 46080 increments of the timer 20 times to have a delay of 1 sec.

All right then now that we have an algorithm to measure time, now all we have to do is implement it in the timers.

This is done using two Special Function Registers ( SFRs), TCON and TMOD registers. Each one of them has eight bits and every bit has a particular function. The details of the TMOD timer are given below:

TMOD register

Timer modes

Next is the TCON register. In this register only two bits are useful for us at the moment and both of them can be accessed by specially assigned names.

TF0 – This bit sets when the timer 0 overflows.

TR0 – This bit must be set by us to enable the timer.

In our earlier derivation, we said that we need the timer to increment 46080 times  to introduce a delay of 0.05s. So we need to determine the starting point for the timer which is (65535 – 46080) = 19455( which in hexadecimal is 4BFFh) i.e. this is the value with which the timer needs to be initialized.

Now that we have all the bits and pieces, here is the algorithm for blinking an led every two seconds(“on” for 1 sec and “off” for the next second)

  • Set a flag bit ..say the bit at 20h and set the timer in mode1.
  • Store 20 (14 hex) in R0. This is the initialization step.
  • Initialize timer0 to 4BFF hex
  • Start the timer ( Set TR0)
  • Check the TF0 bit. Every time it overflows decrement R0 by 1.
  • If R0 is not zero jump back to the initialization process. Else  if it is zero depending upon the flag jump to instructions that turn on the led or turn off the led. Change the flag bit to the other state(if flag = 0 initially set it to 1 and vice verse)
  • Jump back to the point of initialization.

Here is the final code that I came up with and it appears to be working all right:

I must confess though, that the time delay is not exactly 1 sec. There is an error of a few milliseconds but even then its a pretty good result. Now all that needs to be done is to convert this asm file to a hex file and upload it onto the microcontroller.

There you have it.. blinking LED using 8051. Here is the video Video

Advertisements

, , , , , ,

Leave a comment

Intensity control of an LED using LDR and Arduino board

This is another simple project that you might want to try out using your Arduino board.

So what is exactly our goal here?

As the title says, we are going to control the intensity of an LED(Light Emitting Diode) using an LDR (Light Dependent Resistor).
But more importantly we are going to look at how we take in an analog input, make sense of that input, and output what appears to be analog signal ( …but it ‘s not !!..its actually PWM) using  an Arduino board.

Some Theory

Okay it might be possible that there were a few terms in the above paragraph that might be new to you. In case you have completely understood it, you may skip ahead but in case you haven’t this might clear it up a bit.

LDR:

It stands for “Light Dependent Resistor”. It ‘s a type of resistor whose value changes with intensity or the amount of light falling on it. As the amount of light falling on it increases the its resistance decreases and the other way round. Understanding why it happens will require going into the depths of the material with which it is made and this isn’t really an article for that. However there are many articles which will solve the question but for now you only need to remember that it ‘s resistance value changes with the amount of light falling on it.

Analog to Digital Converter:

It takes in an analog value( in this case the voltage across the LDR) and converts it to a 10 bit digital. Since we have 10 bits, the output of the ADC ranges from 0-1023 (i.e. 1024 values 2^10).  Every voltage between 0 – 5V is mapped to a value between 0-1023. Why till 1023? The reason is the resolution of our ADC. Here we represent every value with a combination of 10 bits. As the number of bits used to represent a value increases, the output value gets much more accurate. The following figure gives an idea of what happens in an ADC using 2 bit resolution.

Value         Bit Representation

0 – 1.25             00

1.25-2.5            01

2.5-3.75            10

3.75-5                11

PWM:

Pulse Width Modulation is a technique in which the width of the pulses can be varied according to the message signal. In this case the led is connected to a PWM output pin of the arduino board and using the analogWrite() function we make the width of the pulses on the pin vary. Varying the width of the pulses can be seen as varying the average voltage on the pin. So although we are only changing the amount of time for which the led is on or off, due to the persistence of vision it is as if we are varying the voltage across the led which causes it to fade and brighten up.

How do we get there?

Okay so lets get started. We are going to require the following items:

  • Resistors
  • Light Emitting Diode
  • Light Dependent Resistor
  • Arduino board
  • Connecting wires
  • Breadboard

The connections are as follows:

  • Connect one end of a resistor ( I have a 1k one…you can use any other value if you prefer.. just make sure it is not too high or too low) to the 5V pin of the arduino board. Connect the other end of the resistor to one end of the LDR. The other end of the LDR should be connected to the ground (GND).
  • Take a wire from the junction of the resistor & the LDR connected earlier and connect it to the Analog Input 5 on the arduino board.
  • Next take a wire from any of the PWM pins on your board and connect it to the Anode of the LED. Connect the cathode of the LED to one end of a resistor with the other end connected to the GND.

Those are all the connections we have to make.

Next we need to write a program to make it work.

The program is quite self explanatory

Some things to note are

  • When I uploaded the program to the board I found that the value in the variable “value” varied over a range of 990 – 1010. This is a very small range in comparison to 0 – 1023. So I constrained it between 990 – 1010 before mapping it to 0 – 255. If I had not done this  the value written to the ledPin would have varied over a much smaller range and this would not have been noticeable in the varying brightness of the led.
  • I have also put in the Serial.println() function. It ‘s a good idea to use some of these when you want to check the values being read or written. Helps in debugging.

    The circuit in sufficient light

Now when I cover the circuit the led begins to glow. Its brightness increases as I continue enclosing the LDR more.Until the point..

In the dark

So…there you go controlling the intensity of the LED using an LDR.

You can check out the video here: Here ‘s the Video

Credits google for the first two pics.

, , , , ,

Leave a comment

Arduino 101 – Blinking LED

HI….If you are reading this page, i assume that you either have an Arduino microcontroller board or are looking to get one. Well ..for those of you who are new to microcontrollers and are looking to get ones board for themselves, let me tell you that Arduino is the perfect way to begin. It uses the Atmega microcontroller and is very easy to use. Also there are tons of Arduino projects posted on the internet which you can and should check out on your time.

Ok…so lets begin..Some knowledge of any of the programming languages out there would make things easier for you to understand but its not the end of the world if you don’t.

In this post i ll tell you how to get an LED blinking with the help of your Arduino board.

In  order to do this you ll require the following items:

  • An Arduino board.
  • USB cable
  • Resistor
  • LED
  • Some single strand wires
  • Bread board

The circuit for this implementation is quite simple.

Connect the pin3 to the anode of the led. The cathode ( the leg towards the blunt side when you look from the top ) is connected to one end of the resistor. The other end of the resistor is connected to the GND pin on the board.

Now that you have all the components, the next step is to download the arduino software from this link:

http://arduino.cc/hu/Main/Software

Once you are done with it, start the application. The interface is really simple to understand. There is a text editor, where you type in your code, and a few button above that let you verify and upload your program to the board.

The following figure shows you the code that we have used here.

Lets go through the code line by line.

int led =3;

This line declares an integer variable led and we assign to it the digital pin number that we are going to use. (In this case the 3rd digital pin)

void setup(){

pinMode(led, OUTPUT);

}

This “setup” is a function/method which runs, only once, whenever you load a new program onto your board or whenever you “power on” the board before moving to the loop() method. Also it returns nothing (“void”). In this method we define all the stuff necessary for a program to run properly eg. configuring the pins as inputs/outputs, setting the baud rate etc. (Here in the setup() method we define our int variable “led” as an “Output” using the pinMode() method,  since  well…it is gonna be our output pin)

Next we move on to the loop() function.

This is where you write the code that you want your microcontroller to follow. The loop function repeats itself as long as the board has power (that s why the “loop”). As mentioned earlier the loop() function executes after the setup() function.

In this example we want our LED to blink continuously…so here s the code that makes it happen:

void loop (){

digitalWrite(led,HIGH);

delay(500);

digitalWrite(led,LOW);

delay(500);

}

Remember that the variable “led” is used to denote the 3rd digital pin here. So the first line tells the microcontroller to set the voltage on that pin to “High” value or 5V. This action forward biases the LED and it starts emitting light.

Next is the delay() statement. The argument to this function is the number of milliseconds it must wait before executing the next statement. Here the microcontroller waits for 500 ms before setting the voltage of the pin to “Low” or 0V which turns off the diode. This is followed by another delay of 500ms.

And then it again goes to digitalWrite(led, HIGH); And so the cycle continues.

Once we are done typing in the code, we ll need to verify it. This is done by clicking on the button which has a tick mark on it (refer to the figure). If everything s all right we need to upload the code to the board, but before doing that make sure that you have selected the correct board and the port. In order to check which COM port the board is using go to Start -> Right click on Computer ->  manage -> Device manager. You will see “COM” in the list. See the one that your board is using and then in the Arduino window go to Tools and select your board and the COM port that you just verified.

Now for the last step….click on the Upload button (the one with the arrow, next to the verify button).

The result is … we have an LED that stays on for half a second and turns off for the next half repeatedly…hence a blinking LED.

, , , ,

Leave a comment