Challenge

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

// the Atmega328p is not availabe in simulide so the program is written for Atmega32.

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.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_ms(1);

lcd_command_port&=~(1<<EN);

_delay_ms(2);

}

void lcd_char(char char_data)

{

lcd_data_port= char_data;

lcd_command_port&=~(1<<RW);

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

_delay_ms(1);

lcd_command_port&=~(1<<EN);

_delay_ms(1);

}

void lcd_init(void)

{

lcd_command_dir|= (1<<RS)|(1<<RW)|(1<<EN);

lcd_data_dir = 0xff;

_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

int TimerOverFlow = 0;

ISR(TIMER1_OVF_vect)

{

TimerOverFlow++;

}

int main (void)

{

char string[10];

long count;

double distance;

DDRA = 0x01;

DDRB = 0xFF; // Set PORTB as output for LCD

lcd_init();

lcd_string_xy(1,0,"ultrasonic");

sei();

TIMSK = (1<< TOIE1);

TCCR1A = 0;

while(1)

{

PORTA |= (1<< trigger_pin);

_delay_ms(10);

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

TCNT1 = 0;

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.