Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Measuring Time between two IR sensor

Status
Not open for further replies.

Mohamed Slama

Member level 4
Member level 4
Joined
Nov 8, 2013
Messages
72
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
443
Hi

I have 2 IR sensor(with its receiver) the distance between is 1Cm and i have a coin pass through them

i want to calculate the time from the coin hit the first IR sensor to leave the second IR sensor .

using MicroC Pro , 16f877A

Thanks
 

Just make the first event as interrupt and run the timer from there till the second event occurs. its simple

thank u for reply

can u write MicroC Code for interrupt and timer .because my major knowledge in image processing and c# >
 

i used one ir led connected to portb.fo

but the code didnt work
Code:
// LCD module connections
sbit LCD_RS at RC6_bit;
sbit LCD_EN at RC7_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISC6_bit;
sbit LCD_EN_Direction at TRISC7_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections


//variables
char Freq_txt[11];
unsigned int tmr1_Val=0;
float  Time_elapsed=0;
unsigned int OverNumb=0;
unsigned long Freq=0;
unsigned long Time=0;
unsigned short tmr0_cnt=100;
bit flag;
char TPer_txt[15];
float TPer=0;

void _Init()
{
  trisd.f0=0;
  lcd_init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Cmd(_LCD_CLEAR);




  //timer1 config
  intcon.f7=1;   //enable global interrupt
  intcon.f6=1;  //enable pref interrupt
  PIE1.f0=1; //Enables the TMR1 overflow interrupt
  //t1con.f1=0; //internal clock (f/4)
  //t1con.f3=1; //Oscillator is shut-off
  t1con=0b10111001;
 // t1con.f2=1; //Synchronize external clock input
  tmr1l=0; tmr1h=0; //clear timer1
}


//ISR
void interrupt()
{



 if(pir1.f0==1) //if timer1 is overlfowed
 {
   OverNumb++;  //increment number of overflow
   pir1.f0=0; //reset timer1 flag
 }

}




void main()
{
 trisb=1;
       _Init();





   // intcon.f7=0; t1con.f0=0;  //reenabling counting and global interrupts
   lcd_out(1,1, "Time Counter");
   delay_ms(100);
   for(;;)
   {

    if (portb.f0==0){

           t1con.f0=1;
          while(portb.f0==0);
            intcon.f7=0; t1con.f0=0;  // glopal interrupt off - stop timer 1
                      }

               tmr1_Val = (TMR1H << 8) + TMR1L; //get high and low from timer1
                Time_elapsed =(OverNumb*65536)+10 ;
                            Time_elapsed/=100;

                floatToStr(Time_elapsed,TPer_txt);   //convert Period to string
              lcd_out(4,1, TPer_txt); lcd_out_cp("S");




           tmr1l=0; tmr1h=0; tmr1_Val=0;  OverNumb=0; Freq=0; TPer=0; //reset variables
           Time_elapsed=0;

           intcon.f7=1; t1con.f0=1;  //reenabling counting and global interrupts
        }
   }





/*
To count more than 65536Hz using timer1 16bit use this formula:

Freq = (2^16  * OverflowNumber ) + timer1 count

*/

/*
To combine to 8bit into a 16 bit use:

TMR1_value = (TMR1H << 8) + TMR1L;

*/



/*
To calculate the PRELOAD value use this:

PRELOAD = 256 - ( Time you need * Frequency ) / ( 4 * Prescaler)

Example: if 10ms is needed we do this: 256-(0.010*16000000)/(4*256)= 99
so  99 should be the RTCC_PRELOAD value.

*/
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top