Challenge

Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)

#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h> // for delay fun
#include "avr/interrupt.h" // for interrupt fun


#define rs_high() PORTD |=(1<<0); // register select data mode as high
#define rs_low() PORTD &= ~(1<<0); // register select command mode as low

#define en_high() PORTD |= (1<<1); // enabling data mode as high
#define en_low() PORTD &= ~(1<<1); // enabling command mode as low

#define lcdport PORTB // using portb connecting to lcd

void lcd_command(unsigned char cmd) // function using command mode
{

lcdport = cmd;
rs_low(); // rs_low is command mode
en_high(); // enabling data as high
_delay_ms(1);
en_low(); // enabling command as low
}

void lcd_data(unsigned char data) // function using data mode
{

lcdport = data;
rs_high(); // rs_high is data mode
en_high(); // enabling data as high
_delay_ms(1);
en_low(); // enabling command as low
}

void lcd_init()
{

lcd_command(0x38); // 2 lines 5*7 matrix
_delay_ms(500);
lcd_command(0x02); // return home
_delay_ms(500);
lcd_command(0x01); // clear screen
_delay_ms(5);
lcd_command(0x0c); // Display on, Cursor off
_delay_ms(5);
lcd_command(0x06); // increment cursor
_delay_ms(5);
lcd_command(0x80); // Display off, Cursor off
_delay_ms(5);

}

void cursorpos(char x, char y) // cursor position
{

if( (x < 1 || x > 2) || (y < 1 || y > 16) ) // 2 rows & 16 columns
{
x = 1;
y = 1;
}
if(x == 1)
lcd_command(0x80); // force Cursor begin at 1st line
else
lcd_command(0xC0); // force Cursor begin at 2nd line

}

void lcd_print(char row, char coloumn, unsigned int value, int digits) // fun for printing rows, columns, int value, & no of digits to be printed
{
unsigned int temp;
unsigned int unit;
unsigned int tens;
unsigned int hundred;
unsigned int thousand;
unsigned int million;

unsigned char flag=0;

if(row==0||coloumn==0)
{
cursorpos(1,1);
}
else
{
cursorpos(row,coloumn);

}


if(digits==5|| flag==1)
{

million=value/10000+48;
lcd_data(million);
flag=1;
}
if(digits==4 || flag==1)
{

temp = value/1000;
thousand = temp%10 +48;
lcd_data(thousand);
flag=1;
}
if(digits==3 || flag==1)
{

temp = value/100;
hundred = temp%10 +48;
lcd_data(hundred);
flag=1;
}
if(digits==2 || flag==1)
{

temp = value/10;
tens= temp%10 +48;
lcd_data(tens);
flag=1;
}
if(digits==1 || flag==1)
{

unit = value%10 + 48;
lcd_data(unit);
}
if(digits>5)
{
lcd_data('e');
}
}
void lcd_out(char x,char y,char *str) // fun for printing in lcd x=row, y=column, *str=string to be printed
{

cursorpos(x,y);
while(*str)
{
lcd_data(*str);
str++;
}
}


#define Trigger_pin PA0 // Trigger pin
#define Echo_pin PD6 // Echo pin


int TimerOverflow = 0;

ISR(TIMER1_OVF_vect)
{
TimerOverflow++; // Incrementing Timer Overflow count
}

int main(void)
{
char string[10];
long count;
double distance;

DDRA &= (1<<0); // Make trigger pin as output
PORTD = 0xFF; // Turn on Pull-up
sei(); // Enabling global interrupt
TIMSK = (1 << TOIE1); // Enable Timer1 overflow interrupts
TCCR1A = 0; // Set all bit to zero Normal operation
lcd_init(); // initializing lcd
while(1)
{
// Give 10us trigger pulse on trig. pin to HC-SR04
PORTA |= (1 << Trigger_pin);
_delay_us(10);
PORTA &= (~(1 << Trigger_pin)); // clears port pin A0

TCNT1 = 0; // Clear Timer counter
TCCR1B = 0x41; // Capture on rising edge, No prescaler
TIFR = 1<<ICF1; // Clear ICP flag (Input Capture flag)
TIFR = 1<<TOV1; // Clear Timer Overflow flag

/*Calculate width of Echo by Input Capture (ICP) */

while ((TIFR & (1 << ICF1)) == 0); // Wait for rising edge
TCNT1 = 0; // Clear Timer counter
TCCR1B = 0x01; // Capture on falling edge, No prescaler
TIFR = 1<<ICF1; // Clear ICP flag (Input Capture flag)
TIFR = 1<<TOV1; // Clear Timer Overflow flag
TimerOverflow = 0; // Clear Timer overflow count

while ((TIFR & (1 << ICF1)) == 0); // Wait for falling edge
count = ICR1 + (65535 * TimerOverflow); // Take count
/* 8MHz Timer freq, sound speed =343 m/s */
distance = (double)count / 466.47;

lcd_out(1, 1, "ultrasonic_dist");
lcd_print(2, 1,distance,5);
lcd_out(2, 7, "cm"); // Print distance
_delay_ms(200);
}
}

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.