LR 11
LR 11
MP
Lab # 10
Ahmad Hassaan
Name
FA18-BEE-230
Registration Number
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <string.h>
#include <math.h>
#include "debug_prints.c"
#define BAUD0 9600
#define MYUBRR (F_CPU/8/BAUD0-1)
#define TRUE 1
#define FALSE 0
void timer_init(void);
void display_counter_values(void);
void calculate_signal_param(void);
void display_signal_parameters(void);
int main(void)
{
DDRB &=(1<<PB0);
PORTB|=(1<<PB0);
UART0_init(MYUBRR);
printSerialInt(MYUBRR);
printSerialStrln("");
printSerialStr("F_CPU=");
printSerialInt((int)(F_CPU/1000000));
printSerialStrln("MHZ");
printSerialStrln("lab 10=input capture");
timer_init();
EICRA|=(1<<ISC01);
EIMSK|=(1<<INT0);
SREG=(1<<7);
int i=0;
while(1)
{ if (capture_complete == TRUE)
display_signal_parameters();
capture_complete = FALSE;
for (i=0;i<8;i++)
{
_delay_ms(250);
printSerialStrln("press the button..");
}
}
}
void_timer_init(void)
{
ACSR &=~(1<<ACIC);
TCCR1A=0x00;
TCCR1B|=(1<<ICES1);
TCCR1B|=(1<<CS11);
TCNT1L=0;
TCNT1H=0;
TIMSK1|=(1<<ICIE1);
}
ISR(INT0_vect)
{
//printSerialStrln("Processing External Interrupt 0: ");
rising1=0;
rising2=0;
falling1=0;
capture_complete - FALSE;
input_capt_counter=0;
sig_freq=0;
sig_dc=0;
TCCR1B|=(1<<ICES1);
TCNT1=0;
TIMSK1|= (1<<ICIE1);
}
ISR(TIMER1_CAPT_vect)
{
printSerialStrln("Processing Timer Interrupt: ");
icp_low=ICR1L;
icp_high=ICR1H;
input_capt_counter ++;
printSerialInt((int)input_capt_counter);
printSerialStrln("");
if (input_capt_counter==2)
{
rising2=(ICR1H<<8)|(ICR1L);
}
if (input_capt_counter==3)
{
rising2=(ICR1H<<8)|(ICR1L);
TCCR1B&=~(1<<ICES1);
TIFR1=(1<<ICF1);
}
if (input_capt_counter==4)
{
falling1=(ICR1H<<8)|(ICR1L);
TIMSK1&=~(ICIE1);
capture_complete=TRUE;
calculate_signal_param();
}
}
void display_counter_values()
{
printSerialStr("Rising 1: ");
printSerialLong((long int) rising1);
printSerialStrln("");
printSerialStr("Rising 2: ");
printSerialLong((long int) rising2);
printSerialStrln("");
printSerialStr("Falling 1: ");
printSerialLong((long int) falling1);
printSerialStrln("");
}
void display_signal_parameters(void)
{
printSerialStr("Frequency = ");
printSerialFloat(sig_freq);
printSerialStrln(" Hz");
printSerialStr("Duty Cycle = ");
printSerialFloat(sig_dc);
printSerialStrln(" %");
}
void calculate_signal_param()
{
printSerialStrln("Calculating Signal Parameters ... ");
if((rising2-rising1) !=0)
{
sig_freq=F_CPU/(8*(float)(rising2-rising1));
sig_dc=100.0*((float)(falling1-rising2)/(float)(rising2-rising1));
}
else
{
sig_dc=0;
sig_freq=0;
}
display_counter_values();
display_signal_parameters();
}
Proteus simulation:
Post lab:
Find out how input capture feature of microcontrollers can be used to
record a signal from a TV remote control. Submit a report of your
findings
Answer:
Critical Analysis:
We have learnt how to capture periodic signal using our microcontroller
and have later learnt how to simulate them on proteus design tool.