Project 1 - Controlling a DC motor using PWM and monitoring its Running status
#include <avr/io.h>
#define F_CPU 8000000L
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int n,duty;
#define rs_high() PORTA |=(1<<2);
#define rs_low() PORTA &= ~(1<<2);
#define en_high() PORTA |= (1<<3);
#define en_low() PORTA &= ~(1<<3);
#define lcdport PORTC
void lcd_command(unsigned char cmd)
{
lcdport = cmd;
rs_low();
en_high();
_delay_ms(1);
en_low();
}
void lcd_data(unsigned char dat)
{
lcdport = dat;
rs_high();
en_high();
_delay_ms(1);
en_low();
}
void lcd_init()
{
lcd_command(0x38);_delay_ms(5);
lcd_command(0x02);_delay_ms(5);
lcd_command(0x01);_delay_ms(5);
lcd_command(0x0c);_delay_ms(5);
lcd_command(0x06);_delay_ms(5);
lcd_command(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_command(0x7F+y);
else
lcd_command(0xBF+y);
}
void lcd_print(char row, char coloumn, unsigned int value, int digits)
{
unsigned int temp;
unsigned int unit;
unsigned int tens;
unsigned char flag=0;
if(row==0||coloumn==0)
{
cursorpos(1,1);
}
else
{
cursorpos(row,coloumn);
}
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);
}
}
void lcd_out(char x,char y,char *str)
{
cursorpos(x,y);
while(*str)
{
lcd_data(*str);
str++;
}
}
int main(void)
{
DDRA=0xff; //Declaring A port pins as output.
DDRD&=~(1<<3); //PD2 as input
PORTD|=(1<<3); //Activate pull up resistor
GICR=(1<<6); //Enable external interrupt 0
MCUCR=0x02; //Make interrupt 0 negative edge
sei(); //enable interrupt
n=128; //50 % duty cycle
TCCR0=0x64; //phase correct pwm, non inverted mode, prescalar 64
DDRB |= (1<<3); //PB3 as output
PORTA=0x01; //enable motor control pins
DDRC=0xff; //set the portB as lcdport output
lcd_init();
while (1)
{
OCR0=n; //Loading duty cycle value
duty=0.39215*n;
lcd_print(1,8,duty,2);//1st row 1st column voltage printing with 4 digits
lcd_out(2,1," Duty cycle "); //2nd row 5th column printing mV unit of voltage
}
}
ISR(INT0_vect)
{
n=n+5;
if(n>=255)
n=128;
}