Challenge

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

/*

* GccApplication3.cpp

*

* Created: 23-11-2023 12:21:51 PM

* Author : OMKAR

*/

#define F_CPU 8000000UL

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <string.h>

#include <stdlib.h>

#define LCD_Data_Dir DDRD

#define LCD_Command_Dir DDRC

#define LCD_Data_Port PORTD

#define LCD_Command_Port PORTC

#define EN PC2

#define RW PC3

#define RS PC4

void LCD_Command (char);

void LCD_Char (char);

void LCD_Init (void);

void LCD_String (char*);

void LCD_String_xy (char,char,char*);

void LCD_Command (char cmd)

{

LCD_Data_Port = cmd;

LCD_Command_Port &= ~((1<<RS)|(1<<RW));

LCD_Command_Port |= (1<<EN);

_delay_us(1);

LCD_Command_Port &= ~(1<<EN);

_delay_ms(3);

}

void LCD_Char (char char_data)

{

LCD_Data_Port = char_data;

LCD_Command_Port &= ~(1<<RW);

LCD_Command_Port |= (1<<EN)|(1<<RS);

_delay_us(1);

LCD_Command_Port &= ~(1<<EN);

_delay_ms(1);

}

void LCD_Init (void)

{

LCD_Command_Dir |= (1<<RS)|(1<<RW)|(1<<EN); /* Make LCD command port direction as o/p */

LCD_Data_Dir = 0xFF; /* Make LCD data port direction as o/p */

_delay_ms(20);

LCD_Command (0x38);

LCD_Command (0x0C);

LCD_Command (0x06);

LCD_Command (0x01);

LCD_Command (0x80);

}

void LCD_String (char *str)

{

int i;

for(i=0;str[i]!=0;i++)

{

LCD_Char (str[i]);

}

}

void LCD_String_xy (char row, char pos, char *str)

{

if (row == 1)

LCD_Command((pos & 0x0F)|0x80);

else if (row == 2)

LCD_Command((pos & 0x0F)|0xC0);

LCD_String(str);

}

#define Trigger_pin PA0 /* Trigger pin */

int TimerOverflow = 0;

ISR(TIMER1_OVF_vect)

{

TimerOverflow++; /* Increment Timer Overflow count */

}

int main(void)

{

char string[10];

long count;

double distance;

DDRA = 0x01; /* Make trigger pin as output */

PORTB = 0xFF; /* Turn on Pull-up */

LCD_Init();

LCD_String_xy(1, 0, "Ultrasonic");

sei(); /* Enable global interrupt */

TIMSK = (1 << TOIE1); /* Enable Timer1 overflow interrupts */

TCCR1A = 0; /* Set all bit to zero Normal operation */

while(1)

{

PORTA |= (1 << Trigger_pin);

_delay_us(10);

PORTA &= (~(1 << Trigger_pin));

TCNT1 = 0; /* Clear Timer counter */

TCCR1B = 0x41;

TIFR = 1<<ICF1;

TIFR = 1<<TOV1;

while ((TIFR & (1 << ICF1)) == 0);

TCNT1 = 0;

TCCR1B = 0x01;

TIFR = 1<<ICF1;

TIFR = 1<<TOV1;

TimerOverflow = 0;

while ((TIFR & (1 << ICF1)) == 0);

count = ICR1 + (65535 * TimerOverflow);

distance = (double)count / 466.47;

dtostrf(distance, 2, 2, string);

strcat(string, " cm ");

LCD_String_xy(2, 0, "Dist = ");

LCD_String_xy(2, 7, string);

_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.