Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)
In this project, the implementation of code for “Measuring distance of an object using ultrasonic distance sensor (HC-SR04)
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "avr/interrupt.h"
#define lcdport PORTB
#define rs_high PORTD |= (1<<0);
#define rs_low PORTD &= ~(1<<0);
#define en_high PORTD |= (1<<2);
#define en_low PORTD &= ~(1<<2);
#define Trig_pin PA0
int timerOverflow =0;
void lcd_cmd(unsigned char cmd)
{
lcdport = (cmd & 0xf0);
rs_low;
en_low;
_delay_ms(1); //after 1ms disable LCD
en_high;
lcdport = ((cmd<<4) & (0xf0)); // LCD port
rs_low;
en_high;
_delay_ms(1); //after 1ms disable LCD
en_high; // enable the LCD
}
void lcd_data(unsigned char data)
{
lcdport = (data & 0xf0);
rs_high; //access data register
en_low;
_delay_ms(1);
en_high;
lcdport = ((data<<4) & (0xf0));
rs_high; //access data register
en_low;
_delay_ms(1);
en_high;
}
void lcd_init()
{
lcd_cmd(0X28);
_delay_ms(10);
lcd_cmd(0X38);
_delay_ms(10);
lcd_cmd(0X02);
_delay_ms(10);
lcd_cmd(0X01);
_delay_ms(10);
lcd_cmd(0X0C);
_delay_ms(10);
lcd_cmd(0X06);
_delay_ms(10);
lcd_cmd(0X80); // R0 C0
_delay_ms(10);
}
void cursor_pos(char x, char y)
{
if((x<1||x>2)||(y<1||y>16))
{
x=1;
y=1;
}
if(x==1)
{
lcd_cmd(0X7F+y);
}
else if(x==2)
{
lcd_cmd(0XBF+y);
}
}
void lcd_out(char x, char y, char *str)
{
cursor_pos(x,y);
while(*str)
{
lcd_data(*str);
str++;
}
}
int main(void)
{
char string[10];
long count;
double distance;
PORTC = 0xFF;
PORTA = 0XFF;
TCCR1A = 0;
lcd_init();
lcd_out(1, 0, "Ultrasonic");
sei(); // Enable global interrupt
TIMSK = (1 << TOIE1); // Enable timer1 overflow interrupts
while(1)
{
PORTA |= (1 << Trig_pin);
_delay_us(10);
PORTA &= (~(1 << Trig_pin));
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 */
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;
dtostrf(distance,2,2,string);
lcd_out(2, 0, "Dist = ");
lcd_out(2, 7, string); /* Print distance */
_delay_ms(200);
}
}
