Saturday, September 03, 2016

USB HID Bootloader for PIC Microcontroller


What is Bootloader?

Bootloader is a small code which stays inside  MCU flash. It is used as programming tools, to load real program code into the MCU.   
Real program code canbe passed from PC to bootloader by specific PC application ("mikroBootloader USB HID") over specific communication interfaces.
 

USB HID Bootloader                                                         

This bootloader communicates with PC over USB HID inteface by using mikroC bootloader protocol. It is designed to work in conjunction with mikroC's 'USB HID Bootloader'    
PC application.


In this Project I will show you ,how to program USB HID Bootloader in to PIC18F2550 & PIC18F2550.
And upload a simple blink program into the PIC via USB Bootloader.

In this project I will use a PIC18F2550 & PIC18F2550.This have a USB communication.
The code I am using is a example code of MikroC's.
You can find it in the example folder of MikroC.I modified it so it can work with 4Mzh crystel and other thing.
It can work with other crystal.You have to make a own code for that.

This project is for those ,who has minimum skill of PIC MCU & know something about code(blink a light i think is minimum skill).

1. Upload the "USB HID Bootloder" code in to the PIC with a PIC Programmer.
    The circuit diagram is like this.Place the PIC.

2. The program we will use to transfer the compiled code to MCU is MikroC's
    "mikroBootloader USB HID".You can find it in MikroC programs>Tool.

3. Connect the USB cable.Open the program.The usb symbol of the program will be red.You can also     hear a sound.Browse the Hex.Select the Hex.Click uplode.

4. You will hear a sound.and a massage box telling "The MCU is restarting".

5. The connected light in PORTB0 will blink.

Conclusion
* You can upload any program/code to PIC. Like plug>uplode>reset.Good to go.
* It can work on PIC18fxxxx chip which has a USB.I think PIC24 could do it.You have to modify it.
   But not the 12F,16F.
* No programmer need to upload the code.You need programmer once to program "USB HID
   Bootloder" code in to the PIC.
* Works on WinXP/7/8/10.
* Driver installs automatically.(I am using windows 10 pro)

N.T.
* The crystal must be same in "USB HID Bootloader" code & your code.(If you want other crystal you    need to set that in MikroC's project editor.)
* If you wanted to make "USB HID Bootloader" code for another MCU,you need a MikroC lisence.
   Because free version can't compile more than 2kb. Shows a "Data limit" massage.But
  "USB HID Bootloader" code is more than 10kb.
* After the usb cable is connected you need to open the "mikroBootloader USB HID" program within    5 second.After 5 second the PIC reset automatically & run the old program .
* After uploading the code you need to reset the PIC.
* You have to set circuit same as picture.The capacitor must be same as shown.
* The project setting in MikroC project edit will configure as the picture.
* The USB Bootloader Driver will be installed automatically.
* It tasted in PIC18F2550 & PIC18F2550.
* The circuit and other component must be need to work usb communication(expect led).
* It dose not work with proteus as showing CPU over load.
* Your code's configuration ,like crystal ,usb power etc in "Tools>Edit project" must be same as bootloder code configuration.
* If is not working,try to restart PC,program the MCU again,check usb wire connection ,crystel,
   capacitors value.Make a permanent PCB to avoid lose connection.
You can find "USB HID Bootloader" code,hex,"mikroBootloader USB HID" program,Circuit & picture etc in that folder.In this folder you can find code for both PIC18F2550 & PIC18F2550.

Link

Wednesday, April 13, 2016

DC Motor's Speed Controlling Using PWM of Microcontroller




We can control the speed of a DC motor through a microcontroller. All we need to know about PWM .That means " Pulse Width Modulation ". It is a very popular technique and most important part of a microcontroller.  In this tutorial we will use PWM to create signal. By changing pulse width of a signal ,we can control the speed  .




Basic Description:

At first we will connect a DC motor with PIC microcontroller and we will also connect two push buttons with it. One of those buttons will be used for increasing speed and another one for decreasing speed. That's all .

Now listen to me carefully, Just keep this in your mind 
1. Increasing duty or Pulse Width will increase the speed of  DC motor .
2.Decreasing duty or Pulse Width will decreasing the speed of DC motor.

Now, we need to know about PWM [ Pulse Width Modulation ]



 

Pulse Width Modulation (PWM)




 We can create various signal through PWM. If we want to create 36KHz signal, that can be done by PWM .We can create any type signal. When we write program for creating signal through MCU, the CPP pin of microcontroller generate the signal according to the instructions. Lets consider, we have a 2Hz frequency signal. That means time period is 1/2=0.5 sec. This signal can be in various form. Look at the pictures :
 DC Motor's Speed Controlling Using PWM and Microcontroller
Pulse width modulation

 DC Motor's Speed Controlling Using PWM and Microcontroller
when Set_Duty(127);
 DC Motor's Speed Controlling Using PWM and Microcontroller
PWM

Pic microcontroller's has two PWM or CPP module look at the picture .


In L293D's  EN1  pin we provide the signal. If you will provide highest pulse width, the speed will be highest. When you will decrease pulse width, the speed will also be decreased.
So if you don't know how to interface DC motor with microcontroller. It's recommended to read this tutorial ,

DC Motor Interfacing with PIC Microcontroller in Proteus [step by step]



 Time Period = Times of ON state + Times of OFF state .



PWM has four functions

1. PWM1_Init( Set_Frequency );

2.  PWM1_Start();

3.PWM1_Set_Duty( Count );

4.PWM1_Stop();

Here most important thing is PWM1_Set_Duty(count) , If we increase the value of count, the speed increases. If we decrease the value of count, the speed decreases. Another important thing is the highest value of count is 255 and lowest is 0.

count proportional to PW
So, count = K * PW ----eq(1) where K = constant .

count/PW=K  

When PW=T , count=255  and when PW=T/2 , count=127.5 or 127

255/T=127/(T/2) = K

and , inserting values of PW and count in eq(1)

255=K * T----eq(2)
127.5=K * (T/2)------eq(3)

Now eq(2)+eq(3) : 382.5= K { T +(T/2)}

or 382.5=K*(3T/2)
or 765=3*K*T
or T*K=255
or K=255/T
Now inserting value of  K into eq(1) , we get

Finally we get,  count =255*(PW/T), This is the relation between count, PW & T.
That was not very necessary for this tutorial. But I've shared all I knew.



When pulse width is equal to   T it means total time period it remains ON .  Now look at the picture given below :


Now create a project in proteus

# Proteus Circuit :




#MikroC Code :


 void main() {  
  unsigned int count=0;  
 ADCON1=0x0F;  
 CMCON=7;  
 TRISA.F0=1;  
 TRISA.F1=1;  
 TRISC.F1=0;  
 TRISC.F0=0;  
 PWM1_Init(1000);  
  PWM1_Start();  
   PORTC.F0=1;  
   PORTC.F1=0;  
    PWM1_set_duty(count);  
   while(1){  
    if(PORTA.F0==0){  
      delay_ms(100);  
    if(count>=255) {  
    count=255; }else{  
    count=count+15;  
     PWM1_set_duty(count);  
    }  
    }  
    if(PORTA.F1==0){  
      delay_ms(100);  
      if(count<=0){  
      count=0;  }else{  
      count=count-15;  
       PWM1_set_duty(count);  
      }  
    }  
   }  
 }



Watch The Video in You Tube

Download Link of  this Project 

Thank You!

Wednesday, January 06, 2016

IR (Infrared) Communication Between Two Microcontrollers -Step By Step Tutorial : LAST PART

PART 1 : Basic Introduction 

PART 2 : Interrupt 

PART 3 : Timer

PART 4 : Calculation

PART 5 : LED Switching Project [END]

 

IR Controlled LED Switching : 5th & LAST PART



I have to make it quick and I think we have got all required information. I ain't going to describe source code. You have to help yourself. It has become already too long.
I can honestly say that I tried my best. Today I am going to finish this series and it's the last part.

So first of all, take a look at calculation part.

Final Calculation :

 

To identify each bit uniquely, we will use another calculation method. You may use as you want. I ain't going to use millisecond. You can use millisecond or microsecond if you want. 

If you want to use millisecond to measure pulse, then for logical 0 you get (562us_on+562us_off)=1.124ms. and for logical 1 you get (562us_on+1687us_off)=2.249ms.

You know, for each task  microcontroller needs time. That's why reading can be varied from calculation. So if you use integer number, you will get 1ms for logical 0 and 2ms for 1. By applying this you may successfully able to make it. Alright.


Now I am going to show about my method that was used on my project:

we know that , 1secon means=750000 pulses. Alright.
So, 1000ms means=750000 pulses and 1000000us means=750000 pulses.

 Now, 1000000us means=750000 pulse
 and   1us     ,,  = (750000/1000000)=0.75 pulses
 and  562us   ,,   =(0.75*562)=421.5=421 pulses

Again,
So, 1000000us means=750000 pulse
 and   1us     ,,  = (750000/1000000)=0.75 pulses
 and  1687us   ,,   =(0.75*1687)=1265.25=1265 pulses



So, for logical 1 :

(562+1687) or (421.5+1265.75)=1686 pulses

Now, we know 255 pulses means 1 interrupt(timer overflow) or Count=1.
 So ,                      1    ,,     ,,    (1/255)
 So ,                    1686   ,,     ,,   (1686/255)=6.62

So, we can say 6.62 interrupts means logical 1. In coding we I will use 5 or 6 or 7 to identify logical 1 in proteus.



So, for logical 0 :


(562+562) or (421.5+421.5)=843 pulses

Now, we know 255 pulses means 1 interrupt
(timer overflow) or Count=1.
 So ,          1    ,,     ,,  (1/255) or count=(1/255)
 so ,        843   ,,     ,,   (843/255)=3.31 or count=3

So, we can say 3.31 interrupts means logical 0. In coding we I will use 2 or 3 or 4 to identify logical 0 in proteus.
By using this technique, from count variable we can identify logical 1 or logical 0.



***Transmitter Section(Important):


 In source code of transmitter , 4 commands are used .

  

  #define command_2 0x81 or 10000001
  #define command_3 0x42 or 01000010
  #define command_4 0xC3 or 11000011
  #define command_5 0x24 or 00100100 



Here blue color represents 4bit command and red color represents reverse order of the main 4bit command (blue colored).To avoid noise and to achieve clear signal we need this.



Consider that we have main 4bit command 0001.So the reverse command should be 1000 command .Now we have to attach these and that will be 10000001. Finally we get 8bit command in which a main command and a reverse of that command are saved .


Now We need some knowledge about PWM(Pulse Width Modulation)


We will use PWM to generate 36KHz pulse and that's why we will connect positive(+) pin of Transmitter unit  Microcontroller's  CPP1 pin . Because using that pin of Microcontroller will generate 36KHz pulse .



PWM1_Init(36000); will set up the CPP1 pin for PWM .


PWM1_Set_Duty(127); 


set_duty(127) is used to providing same for both ON and OFF .That means (T/2) time it will ON and (T/2) time it will OFF .If we use set_duty(255) , then total Time period (T) will be remain ON. If we use set_duty(0) , then total Time period (T) will be remain OFF.    
Look at this photo.
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )

IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )

 

Again look at another picture given below

  Here in if statement , an AND operation performed between Command and 0x01 . We are using this to identify each bit of data command.
Suppose , our command is 10000001 and 0x01=00000001.So ,when an AND operation performs the result will be like this.

IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )
Shifting Operation in Programming

Shifting Operation in Programming
Shifting Operation in Programming

 

So, if result is 1 ,then the related bit is 1 and delay should be 1687us.

So, if result is 0 ,then the related bit is 0 and delay should be 562us.

 

***Receiver Section(Important):

Here this part of code is comparing that Data signal commands received in receiver unit are correct .


   if(val[7]==val[0]){  
    txt[7]=val[7];  
   }  
   if(val[6]==val[1]){  
    txt[6]=val[6];  
   }  
   if(val[5]==val[2]){  
    txt[5]=val[5];  
   }  
   if(val[4]==val[3]){  
    txt[4]=val[4];  
  }  

   if(txt[4]=='0' && txt[5]=='0' && txt[6]=='0' && txt[7]=='1') {  
     PORTB.F6=1;  
     PORTB.F5=0;  
     PORTB.F4=0;  
     PORTB.F3=0;  
   }  


 When microcontroller understands about the 4bit command "0001" , consequently it turns ON RB6 pin or First LED .  

# IR-Controlled LED Switching in Proteus 8.

Source Code :

Transmitter:

 


 #define address  0xff  
  #define command_1 0xFF  
  #define command_2 0x81  
  #define command_3 0x42  
  #define command_4 0xC3  
  #define command_5 0x24  
 unsigned int i=0,j=0;  
 void repeat(){  
 PWM1_Start();  
 delay_us(8000);  
 PWM1_Stop();  
 delay_us(8000);  
 }  
  send_data_byte(unsigned char dattt){  
   PWM1_init(36000);  
 PWM1_Set_Duty(127);  
  for(j=0;j<8;j++){  
 PWM1_Start();  
 delay_us(562);  
 PWM1_Stop();  
  if(dattt & 0x01){  
  delay_us(1687);  
  dattt=dattt>>1;  
  }  
 else  
  {  
  delay_us(562);  
   dattt=dattt>>1;  
  }  
  }  
 PWM1_Stop();  
  }  
  void send_data_command(unsigned char dat){  
  PWM1_init(36000);  
 PWM1_Set_Duty(127);  
 PWM1_Start();  
 delay_us(9000);  
 PWM1_Stop();  
 delay_us(4500);  
  send_data_byte(dat);  
  repeat();  
  }  
 void main() {  
 ADCON1=0x0F;  // disable ADC converter  
 CMCON=7; // to disable comparator  
 TRISA.F0=1;  
 TRISA.F1=1;  
 TRISA.F2=1;  
 TRISA.F3=1;  
 TRISC.F2=0;  
  
  PORTC.F2=0;  
 while(1){  
  if(PORTA.F0==0){  
 send_data_command(command_2);  
 while(PORTA.F0==0){  
 repeat();  
 }  
  }  
  if(PORTA.F1==0){  
 send_data_command(command_3);  
 while(PORTA.F1==0){  
 repeat();  
 }  
  }  
   if(PORTA.F2==0){  
 send_data_command(command_4);  
 while(PORTA.F2==0){  
 repeat();  
 }  
  }  
    if(PORTA.F3==0){  
 send_data_command(command_5);  
 while(PORTA.F3==0){  
 repeat();  
 }  
  }  
 }  
 }  

 

Receiver

 

 unsigned int count=0,sgnal=0;  
 int i=7,j=0,xr=0;  
 char txt[]="........";  
 char val[]="........";  
 void timer_routin(){  
 count++;  
  if(count>0xFF){  
   count=0;  
   TMR0L=0;  
  }  
 }  

 void interrupt()  
 {  
 if(INTCON.TMR0IF){  
  timer_routin();  
  INTCON.TMR0IF=0;  
 }  
 if(INTCON.INT0IF){  
  
  xr=count;  
  count=0;  
  TMR0L=0;  
   if(i<0){ i=7; }  
  if(xr==3){ // you may use if(xr==3||xr==4||xr==2){...}
   val[i]='0';  
   i--;  
   if(i<0){ i=7; }  
  }  
  else if(xr==6){  // you may use if(xr==5||xr==6||xr==7){...}
   val[i]='1';  
  i--;  
   if(i<0){ i=7; }  
  }  
  else{  
         /// For start signal or Repeat signal , i=0 and start to count  
   TMR0L=0;  
   i=7;  
   count=0;  
  }  
  INTCON.INT0IF=0;  
 }  
 }  
 void main()  
 {  
  ADCON1=0x0F;  
  CMCON=7;  
   TRISB=0x01;  
   PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=0;  
    T0CON=0xC1;  
  TMR0L=0;  
  INTCON.GIE=1;  
  INTCON.PEIE=1;  
  INTCON.TMR0IE=1;  
  INTCON.INT0IE=1;  
  INTCON.TMR0IF=0;  
  INTCON.INT0IF=0;  
  INTCON2.RBPU=1; // DISABLE PULUP REGISTER  
  INTCON2.INTEDG0=0;  
  while(1){  
  if(val[7]==val[0]){  
   txt[7]=val[7];  
  }  
  if(val[6]==val[1]){  
   txt[6]=val[6];  
  }  
  if(val[5]==val[2]){  
   txt[5]=val[5];  
  }  
  if(val[4]==val[3]){  
   txt[4]=val[4];  
  }  
 if(txt[4]=='0' && txt[5]=='0' && txt[6]=='0' && txt[7]=='1') {  
    PORTB.F6=1;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=0;  
  }  
 if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='0') {  
    PORTB.F6=0;  
    PORTB.F5=1;  
    PORTB.F4=0;  
    PORTB.F3=0;  
  }  
 if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='1') {  
    PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=1;  
    PORTB.F3=0;  
  }  
 if(txt[4]=='0' && txt[5]=='1' && txt[6]=='0' && txt[7]=='0') {  
    PORTB.F6=0;  
    PORTB.F5=0;  
    PORTB.F4=0;  
    PORTB.F3=1;  
  }  
  }  
 }  



Proteus Circuit :

IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : LAST PART ( END )


Watch Video for Proteus 8

 




IR (Infrared) Communication Between Two Microcontrollers -Step By Step Tutorial : Part-4


PART 1 : Basic Introduction 

PART 2 : Interrupt 

PART 3 : Timer

PART 4 : Calculation

PART 5 : LED Switching Project [END

 

 

Time Calculation:Part-4

In this part we will connect a push button with microcontroller which will create an external interrupt and we will calculate the time duration of that interrupt .


Calculation :

Now , we need to know how to calculate duration time of an event .
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-4
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-4

First, we  know that clock frequency will be divided by 4 and secondly, it will go to prescalar. Finally, clock goes to timer register. 
So, if we use 12MHz clock and 1:4 prescalar. First we will get system clock (12/4)=3MHz clock or (12000000/4)=3000000Hz clock. Secondly it goes to prescalar and divided by 4 again. So we get (3000000/4)=750000Hz clock. 
We know that for each pulse TMR0L(Timer0) register is incremented by one. So when 750000 Hz clock successfully go to timer0 register and the TMR0L register increments for 750000 times. Is it clear? We have a problem here, our TMR0L register can only count from 0 to 255.
As we need to count 750000 or greater than 750000. We have to walk in another way. We will set an integer variable count which will be incremented for each overflow interrupt. That means, when TMR0L counts 255 and overflow interrupt occurs. So it gets reset and count is incremented by one. Actually when overflow interrupt occurs, it increases the value of count variable by one. That means count=count+1;

Now consider an External Interrupt situation on RB0 pin where count=3 and TMR0L(8bit Register)=123.


  How many pulses has been passed on that External Interrupt situation ?
Total pulses will be [On that situation]  
tp = (count * 255) + TMR0L;

Think about that, We are using 12MHz clock and finally we get 750000Hz clock from 12MHz clock.

So , What is the meaning of this 750000 Hz clock frequency ? 

It means, when 750000 pulses have been received, time is 1 second. We read the definition of frequency in physics. So the Time period t =(1/f);  The time required for one pulse.


Right Now, we can say that :

 tp=(count * 255)+ TMR0L ;

 750000 total pulses means = 1 second

so   1    ,,     ,,    ,,       =  (1/750000)second.
so  tp    ,,     ,,    ,,   = (tp / 750000)second. 
                          or [ (tp / 750000)*1000] miliseconds
                         or [ (tp / 750000)*1000000] microseconds  
                                                                
Using this method we can measure time duration of the interrupt.


MikroC Code of the Project :



  
 sbit LCD_RS at RB7_bit;  
 sbit LCD_EN at RB6_bit;  
 sbit LCD_D4 at RB5_bit;  
 sbit LCD_D5 at RB4_bit;  
 sbit LCD_D6 at RB3_bit;  
 sbit LCD_D7 at RB2_bit;  
 sbit LCD_RS_Direction at TRISB7_bit;  
 sbit LCD_EN_Direction at TRISB6_bit;  
 sbit LCD_D4_Direction at TRISB5_bit;  
 sbit LCD_D5_Direction at TRISB4_bit;  
 sbit LCD_D6_Direction at TRISB3_bit;  
 sbit LCD_D7_Direction at TRISB2_bit;  
 // End LCD module connections  
 unsigned int count=0,sgnal=0;  
 int chk=7,j=0,tmr=0,cnt=0;  
  float tp=0.00, tr=0.00;  
 char txt[]="    ";  
 char tmrl[]="         ";  
 void interrupt()  
 {  
  if(INTCON.TMR0IF==1){ // checking if overflow interrupt occurs  
  PORTC=0x00;  
  INTCON.TMR0IF=0;  // clearing the overflow intrrupt flag bit  
  count=count+1;  
  if(count>=0xFF){  
 TMR0L=0; // clearing the timer register  
 count=0; // clearing count  
  }  
 }  
 if(INTCON.INT0IF==1){  // checking if external interrupt occur  
 INTCON.INT0IF=0;  // clearing the external intrrupt flag bit  
  // so it will be wise , to reset timer before checking the interrupt flag  
 cnt=count;  
 tmr=TMR0L;  
 tp=0.00;  
 tr=0.00;  
 TMR0L=0; // clearing the timer register  
 count=0; // clearing count  
 tr=(cnt * 255) + tmr ;  
 tp= tr/750000;  
 tp=tp*1000; // sec to mili second  
  sgnal=tp;  
 }  
 }  
 
 void main()  
 {  
  ADCON1=0x0F;  
  CMCON=7;  
   TRISC=0x00;  
  Lcd_Init();  
  Lcd_Cmd(_LCD_CLEAR);        // Clear display  
  Lcd_Cmd(_LCD_CURSOR_OFF);  
  INTCON.GIE=1;  
  INTCON.PEIE=1;  
  INTCON.INT0IE=1;  
  INTCON.INT0IF=0;  
  INTCON2.RBPU=1; // DISABLE PULUP REGISTER  
  INTCON2.INTEDG0=0;  
  T0CON=0xC1;  // setting up the timer0  
  INTCON.TMR0IE=1; // enabling timer overflow interrupt  
  while(1){  
 PORTC=0xFF;  
 inttostr(sgnal,txt);  
 Lcd_Out(1,1,"Time in milisec");  
 Lcd_Out(2,1,txt);  
  }  
 }  


Proteus Circuit of the Project :

IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-4



Note: Perhaps, we can measure the highest time: probably it is [{(255*255)+255}/750000]*1000=87.04 milliseconds. So we can measure the accurate time for 87 milliseconds probably. Actually Push button is not perfect for this. You may use another variable to increase measuring capacity.You may send pulses having time period less than 87 milliseconds on RB0 pin.  I am suggesting you provide signal on RB0 pin from another microcontroller using PWM. It will be good for you! Thank You.

Watch the Video :



Saturday, January 02, 2016

IR (Infrared) Communication Between Two Microcontrollers -Step By Step Tutorial : Part-3



PART 1 : Basic Introduction 

PART 2 : Interrupt 

PART 3 : Timer

PART 4 : Calculation

PART 5 : LED Switching Project [END

 

Timer :Part-3


 

 

Microcontroller Clock tutorial

Microcontroller Clock tutorial



Today I will discuss about Timer. It's very important part of microcontroller . Basically Timer is used to measuring time. Microcontroller performs time related operations using timer . As we need to measure the time of each falling edge of IR-Signal .In this tutorial we will use timer0 of pic18f2550 and we will use 8bit mode. You may use 16bit mode, but first time skip complexity. Both TMROL and TMROH registers works with 16bit mode.
PIC 18f2550 microcontroller has 4 timer modules. Timer0,Timer1,Timer2 and Timer3 . I will only describe about Timer0 and i will try to make it easy so that you can make it by yourself . 

Generally Timer0 is controlled by T0CON register of pic18f2550 and TMR0L is Timer0 register low byte . In 16bit mode both TMR0L(8bit) and TMR0H(8bit) works. But in 8bit mode we can use only TMR0L. This timer0 register is incremented for each pulse comes to it and can count from 0 to 255 (0xFF).


Now we need to take a look about Timer0's control register and some necessary information . Next we will see how timer works and that will be good for us . 

Read all information carefully provided on these images!!



IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3

Just keep in your mind , all those given in previous steps.We will need those in source code .

Now we will see how timer works 

IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3


Generally We connect crystal clock with microconteroller so that it can work with time. Consider that we are using 12MHz clock. So, that means 12000000 pulses are passing to the microcontroller . Is that clear ?

Prescalar:


Prescalar is used to measuring frequency. Look at the picture named ratio. When (fosc/4) or (12/4=3MHz) frequency pulse comes to the the microcontroller we need make this smaller to make the calculation easy. So at this stage we need prescalar . Alright! 
There is another scaler "Postscalar" . Postscalar works after signal has come to the microcontroller .It isn't very necessary in this tutorial.


On that picture clock cycle  represents (Clock/4) or (12/4=3MHz) frequency . If we use 1:2 to scale , then 2 pulses is considered as 1 pulse . In 1:4 , 4 pulses is considered as one pulse. For 1:8 , eight pulses will be considered as one pulse.

Working of Timer0




Note:To Understand Clearly about Timer0 . You have to keep this picture in your memory . All we see in that part are the details of this Picture and save the Picture .

For Clock frequency we could use T0CKL pin (External Source) but Crystal frequency (12 MHz Crystal Clock) is good for us .

When we connect a crystal (we are using 12MHz Crystal Clock) with our microcontroller , microcotnroller receives pulse continuously. At this case we know the frequency and we can calculate the time period of each pulse from (T=1/f). So if we know how many pulse are received, we can calculate time by multiplying. We will see this later .
Generally , Crystal clock frequency divided by 4. It's a rule. That means first time clock frequency prescaled by 4. Look at the picture and you can see that "clock/4" or "System Clock"

IR (Infrared) Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
After this stage signal comes to prescalar. In this tutorial we will use 1:4 prescalar. That means we are dividing the system clock by 4. So, it means when 4 system clock pulse comes to prescalar, it sends out 1 pulse to Timer0 register . In this way timer0 register is being incremented .

Basically, when one pulse enters into the  Timer0 register, TMR0L  register is incremented by 1. The capacity of this register is 0 to 255. So when TMR0L will count 255, there will be an  overflow interrupt. In the interrupt function routine we will reset TMR0L register and we will increase (int count variable) by 1. We need this variable to remember that how many times interrupt occurred. When we perform [count * TMR0L], we get the total number of pulses. From this information we can measure time of "1" and "0"


We will create a project  in Calculation(4th Part)

Setup Timer0 Register :

Bit 0 to 2 are used to select prescalar. As we are using 1:4 prescalar , we need to set 001

Now set 3rd bit to 0 . So bit comes 0001.

Now set 4th bit to 0 and  we get   00001.

Now set 5th bit to 0 and we get   000001

Now set 6th bit to 1 , because we are using 8 bit mode . You may use 16bit mode. and  we get      1000001

Now set 7th bit to  1, because we need to start timer . Finally we get : 11000001 or 0xc1 (hexadecimal).


IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3
IR (Infrared) Remote Controlled Communication Between Two Microcontroller -Step By Step Tutorial : Part-3

 Setup Timer0 overflow flag :

When overflow happens timer overflow interrupt flag bit becomes 1. When Overflow Register flag bit becomes 1 and microcontroller understand that interrupt occurred. So microcontroller goes to perform timer interrupt routine. When flag becomes 0 , microcontroller understand that everything is fine and there is no interrupt.
To enable overflow interrupt we need to set that enable. Unless the overflow interrupt will not work.

So first set INTCON.TMR0IE=1;

Note: you can find INTCON register on Interrupt section in Datasheet or in Interrupt tutorial i had described about INTCON register.


We set INTCON.TMR0IF bit to 0 and that sets the Flag as 0 .

First we need to enter on the INTCON register and then set TMR0IF=0;


 >>Continue to 4th PART<<

Ain't getting any visitors!
Please Share and Bookmark posts.

Tags

: (1) 18F2550 (1) 36KHz (3) and (1) arduino (1) Based (1) battery (1) Bipolar (1) Blinking (1) blinks (1) Bluetooth (1) bluetooth device interfacing (1) bluetooth module (1) button (1) circuit (1) clock (1) control (1) crystal oscillator (3) Db9 (1) DC Motor (2) digital (2) Digital Voting Machine (1) digital voting machine using pic (1) display (2) DS1307 (1) electronic (1) embedded c programming tutorial (11) embedded c tutorial (11) experiment kit (4) external interrupt (4) flash (1) flashing (1) Gas Leakage detector (1) HC-06 (1) home (1) how (1) How to (10) i2c tutorial (1) in (1) indicator (1) infrared Connection (3) interface (8) interfacing (3) Interrupt (3) Introduction (1) IR Connection (3) IR Receiver (4) IR Transmitter (4) key pad (1) keyboard (1) keypad (1) lavel (1) Lcd 16x2 (2) lcd 2x16 (2) led (1) lm35 (2) LPG (1) machine (1) make (1) Make bootloader (1) making (1) matrix (1) max232 (1) membrane keyboard (2) meter (2) Micocontroller (1) microchip (4) microchip pic (2) microchips (3) microcontroller (9) microcontroller based (3) microcontroller programming (3) Microcontroller Project (4) Microcontroller Projects (1) microcontroller_project (2) microcontrollers (4) Microprocessor (2) mikroC (5) mikroc code to start and stopstart and stop dc motor (1) mikroc pro for pic (2) Motion detector (1) MQ-9 Gas Sensor (1) musical (1) NEC Protocol (4) pcb (5) PIC (3) pic controller (11) pic microcontroller (11) pic microcontroller tutorial (11) pic programming (1) pic programming in c (12) pic proteus (1) Pic Tutorial (12) pic18 (2) pic18f2550 (11) picmicrocontroller (4) picRFモジュール (1) PIR Motion Sensor (1) printed circuit board (1) proteus (6) pulse width modulation (1) push (1) push button (1) PWM (1) real (1) rf transmitter (3) Rs 232 (1) Rs232 (1) scroll (1) scrolling (1) Serial communication (1) Serial Connection (1) Serial Port (1) serial port rs232 (1) Servo Motembedded c programming tutorial (1) simulation (2) Soil Moisture Meter (1) speed control (1) step by step (7) step bystep (1) Stepper Motor (2) text (2) Thief Detector (1) time (1) timer (4) timer0 (4) tone (1) TSOP38236 Receiver (4) tutorial (2) Unipolar (1) USART Connection (1) USB (1) usb 1.0 (1) USB bootloadere (1) USB HID (1) using (9) voltmeter (1) voting (1) water level indicator (3) with (2) work (1)

Traffic Feed


Live Traffic Feed
Visitor Tracking

Leave Your Message Here

Name

Email *

Message *

Like on Facebook