I am trying to make a pwm using 8051. I am using external interrupt 0 (pin 3.1) to increase speed and interrupt 1 (pin 3.2) to decrease speed. My code is working fine for increasing speed but it does not work for decreasing speed. i.e interrupt 1 is not working properly.
Rich (BB code):
#include<reg51.h>
unsigned char inc = 0;
void MSDelay(unsigned int);
void ex0_isr (void) interrupt 0
{
inc++; // Increment the count
}
void ex1_isr (void) interrupt 1
{
inc=inc--; // Deccrement the count
}
sbit pwm=P2^0;
sbit pwmn=P2^1;
sbit enable=P2^2;
void universal_delay(unsigned int);
void main( )
{ IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
IT1 = 1; // Configure interrupt 1 for falling edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EX1 = 1;
EA = 1; // Enable Global Interrupt Flag
enable=1;
pwm=0; // making outputs
pwmn=0;
while(1)
{
universal_delay(inc);
}
}
void universal_delay(unsigned int d)
{
if (d==1)
{
pwm=1;
pwmn=0;
MSDelay(50); // 50 ms delay
pwm=0;
pwmn=1;
MSDelay(50);
}
else if (d== 2)
{
pwm=1;
pwmn=0;
MSDelay(55);
pwm=0;
pwmn=1;
MSDelay(45);
}
else if (d== 3)
{
pwm=1;
pwmn=0;
MSDelay(60);
pwm=0;
pwmn=1;
MSDelay(40);
}
else if (d==4)
{
pwm=1;
pwmn=0;
MSDelay(65);
pwm=0;
pwmn=1;
MSDelay(35);
}
else if (d==5)
{ pwm=1;
pwmn=0;
MSDelay(70);
pwm=0;
pwmn=1;
MSDelay(30);
}
else if (d== 6)
{
pwm=1;
pwmn=0;
MSDelay(75);
pwm=0;
pwmn=1;
MSDelay(30);
}
else if (d== 7)
{
pwm=1;
pwmn=0;
MSDelay(75);
pwm=0;
pwmn=1;
MSDelay(25);
}
else if (d== 8)
{
pwm=1;
pwmn=0;
MSDelay(80);
pwm=0;
pwmn=1;
MSDelay(20);
}
else if (d== 9)
{
pwm=1;
pwmn=0;
MSDelay(85);
pwm=0;
pwmn=1;
MSDelay(15);
}
else if (d== 10)
{
pwm=1;
pwmn=0;
MSDelay(90);
pwm=0;
pwmn=1;
MSDelay(10);
}
else if (d>10)
{
pwm=1;
pwmn=0;
MSDelay(100);
pwm=0;
pwmn=1;
MSDelay(0);
}
}
void MSDelay(unsigned int itime)
{
unsigned int i,j;
for (i=0;i<itime;i++)
for (j=0;j<1275;j++);
}