Challenge

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

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>

#define Trigger_pin PA0 // Trigger pin

#define LCD_Data_Dir DDRD //Define LCD data port direction
#define LCD_Command_Dir DDRC // Define LCD command port direction register
#define lcdport PORTD // Define LCD data port
#define LCD_Command_Port PORTC // Define LCD data port
//#define en_low PC2 // Define Enable signal pin
// #define rw_high PC3 // Define Read/Write signal pin
//#define rs_low PC4 // Define Register Select (data reg./command reg.) signal pin */
#define rs_high() PORTC |=(1<<4);
#define rs_low() PORTC &= ~(1<<4);
#define en_high() PORTC |= (1<<2);
#define en_low() PORTC &= ~(1<<2);


void lcd_cmd(unsigned char cmd)
{
lcdport = cmd;
rs_low();
en_high();
_delay_ms(1);
en_low();
}

void lcd_data(unsigned char data)
{
lcdport = data;
rs_high();
en_high();
_delay_ms(1);
en_low();
}

void lcd_init()
{
lcd_cmd(0x38);_delay_ms(5);
lcd_cmd(0x02);_delay_ms(5);
lcd_cmd(0x01);_delay_ms(5);
lcd_cmd(0x0C);_delay_ms(5);
lcd_cmd(0x06);_delay_ms(5);
lcd_cmd(0x80);_delay_ms(5);
}

void cursorpos(char x, char y)
{
if ( (x < 1 || x > 2) || (y < 1 || y > 16) )
{
x = 1;
y = 1;
}
if(x == 1)
lcd_cmd(0x80+y);
else
lcd_cmd(0xC0+y);
}

void lcd_print(char row, char coloumn, unsigned int value, int digits)
{
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= value/100+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)
{
cursorpos(x,y);
while(*str)
{
lcd_data(*str);
str++;
}
}

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
DDRD =0xFF; // decleare the lcd
DDRC|= (1<<2); // enable
DDRC|= (1<<4); //register select

PORTB = 0xff; // turn on pull up for echo pin

sei(); // Enable global interrupt
TIMSK = (1 << TOIE1); // Enable Timer1 overflow interrupts
TCCR1A = 0; // Set all bit to zero Normal operation
lcd_init();
lcd_out(1,1,"Ult_Sensor_Dist");


while(1)
{
// Give 10us trigger pulse on trig. pin to HC-SR04
PORTA |= (1 << Trigger_pin);
_delay_us(10);
PORTA &= (~(1 << Trigger_pin));
//ACSR = (0<<ACIC);

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
//count = ((ICR1 - 12)*10) /625;
//8MHz Timer freq, sound speed =343 m/s
distance = (double)count / 932.94;

lcd_out(1,1,"Ult_Sensor_Dist");/* distance to string */ lcd_print(2,1,distance,3);//print distance lcd_out(2,5,"cm");//To print cm _delay_ms(200);//Delay function);
}
}

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.