Challenge

Project 1 - Controlling a DC motor using PWM and monitoring its Running status

#include <avr/io.h>
#define  F_CPU 16000000ul   // CPU frequency //
#include "avr/interrupt.h"   // external interrupt pin  //
#include <util/delay.h>     // delay //
#define sw_dir (PIND&(1<<1))
#define sw_spd (PIND&(1<<2))
#define pw  (PINC&(1<<3))
#define lcd_port PORTB
#define RS_high PORTD|=(1<<5)
#define RS_low PORTD&=~(1<<5)
#define EN_high PORTD|=(1<<6)
#define EN_low PORTD&=~(1<<6)
unsigned char i;


void lcd_cmd(char cmd)
{
    lcd_port=(cmd&0xf0);
	RS_low;
	EN_low;
	_delay_ms(1);
	EN_high;
	lcd_port=((cmd<<4)&(0xf0));
	RS_low;
	EN_low;
	_delay_ms(1);
	EN_high;
}
 void lcd_data(char data)
 {
	 lcd_port=(data &0xf0);
	 RS_high;
	 EN_low;
	 _delay_ms(1);
	 EN_high;
	 lcd_port=((data<<4)&(0xf0));
	 RS_high;
	 EN_low;
	 _delay_ms(1);
	 EN_high;  
 }
 void lcd_init()
 {
	 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);
		  lcd_cmd(0x28);_delay_ms(5);
 }
 
 void cursorpos( char x, char y)
 {
	 if  ((x<1||x>2)||(y>16||y<1))
	 {
		 x=1;
		 y=1;	 
	 }
	 if  (x==1)
	 {
		 lcd_cmd(0x7f+y);	
	 }
	 else
	 {
		 lcd_cmd(0xBF+y);		 
	 } 
 
 }
 void lcd_out(char x, char y, char *str)
 {
	 cursorpos(x,y);
	 while ( *str)
	 {
		 lcd_data( *str);
		 str++;
	 }
 }
 int main ()
 {
	 DDRB=0xFF;
	 DDRA|=((1<<0)|(1<<1));
	 DDRD&=~(1<<1);
	 DDRD&=~(1<<2);
	 DDRD |=(1<<5);
	 DDRD |=(1<<6);
	 DDRC&=~(1<<3);
	 PORTD|=(1<<2);
	 PORTC|=(1<<3);
	 i=64;
	 
	 //duty cycle //
	 TCCR0=0x61;
	 GICR=(1<<INT0);
	 MCUCR=0x02;
	 sei ();
	 lcd_init();
	 while (1)
	  {
		  
		  while(pw==0)
		  {
			  if (sw_dir==0)
			  {
				  PORTA=0b00000001;
				  lcd_out(1,1,"Motor is running");
				  lcd_out(2,3,"clockwise");
			  }
			  else
			  {
				  PORTA=0b00000010;
				  lcd_out(1,1,"motor is running");
				  lcd_out(2,3,"anticlockwise");
			  }
			  OCR0=i;
		  }
		  PORTA=0X00;
		  lcd_out(1,1,"motor is off ");
		  lcd_out(2,3,"caution ");
	  }
 } 
 
   
 ISR(INT0_vect)  // interrupt service routine //
{
	i=i+20;
}

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.

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.