Help needed! PWM speed increases but does not decreses

Discussion in 'Embedded Systems and Microcontrollers' started by 0killingsoul0, Mar 1, 2012.

  1. 0killingsoul0

    Thread Starter New Member

    Mar 1, 2012
    2
    0
    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.


    [​IMG]
    [​IMG]


    Code ( (Unknown Language)):
    1. #include<reg51.h>
    2.  
    3.  
    4.  
    5.  
    6. unsigned char inc = 0;
    7.  
    8. void MSDelay(unsigned int);
    9. void ex0_isr (void) interrupt 0
    10. {
    11. inc++;   // Increment the count
    12. }
    13.  
    14.  
    15. void ex1_isr (void) interrupt 1
    16. {
    17. inc=inc--;   // Deccrement the count
    18. }
    19.  
    20.  
    21.  
    22. sbit pwm=P2^0;
    23. sbit pwmn=P2^1;
    24. sbit enable=P2^2;
    25.  
    26.  
    27.  
    28.  
    29.  
    30. void universal_delay(unsigned int);
    31.  
    32. void main( )
    33. {     IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
    34.       IT1 = 1;   // Configure interrupt 1 for falling edge on /INT0 (P3.2)
    35.      
    36.      
    37.       EX0 = 1;   // Enable EX0 Interrupt
    38.       EX1 = 1;
    39.      
    40.       EA = 1;    // Enable Global Interrupt Flag
    41.      
    42.      enable=1;          
    43.      
    44.      pwm=0;       //  making outputs
    45.      pwmn=0;
    46.  
    47.  
    48.  
    49.    
    50.  
    51.     while(1)
    52.     {    
    53.         universal_delay(inc);
    54.     }
    55.  
    56. }
    57.  
    58.  
    59.  
    60. void universal_delay(unsigned int d)
    61. {
    62.             if (d==1)
    63.             {  
    64.                
    65.                 pwm=1;
    66.                 pwmn=0;
    67.                
    68.                 MSDelay(50);      //  50 ms delay
    69.                    
    70.                 pwm=0;
    71.                 pwmn=1;
    72.  
    73.                 MSDelay(50);
    74.                
    75.            
    76.             }
    77.  
    78.         else if (d== 2)
    79.        
    80.         {  
    81.              pwm=1;
    82.                 pwmn=0;
    83.                
    84.                 MSDelay(55);
    85.                    
    86.                 pwm=0;
    87.                 pwmn=1;
    88.  
    89.                 MSDelay(45);    
    90.                    
    91.             }
    92.  
    93.  
    94.         else if (d== 3)
    95.             {  
    96.                  pwm=1;
    97.                 pwmn=0;
    98.                
    99.                 MSDelay(60);    
    100.                    
    101.                 pwm=0;
    102.                 pwmn=1;
    103.  
    104.                 MSDelay(40);
    105.         }
    106.  
    107.        
    108.         else if (d==4)
    109.             {    
    110.                                 pwm=1;
    111.                 pwmn=0;
    112.                
    113.                 MSDelay(65);    
    114.                    
    115.                 pwm=0;
    116.                 pwmn=1;
    117.  
    118.                 MSDelay(35);
    119.             }
    120.  
    121.             else if (d==5)
    122.        
    123.             {    pwm=1;
    124.                 pwmn=0;
    125.                
    126.                 MSDelay(70);    
    127.                    
    128.                 pwm=0;
    129.                 pwmn=1;
    130.  
    131.                 MSDelay(30);
    132.            
    133.             }
    134.  
    135.         else if (d== 6)
    136.        
    137.             {  
    138.                  pwm=1;
    139.                 pwmn=0;
    140.                
    141.                 MSDelay(75);    
    142.                    
    143.                 pwm=0;
    144.                 pwmn=1;
    145.  
    146.                 MSDelay(30);
    147.             }
    148.  
    149.         else if (d== 7)
    150.               {
    151.                  pwm=1;
    152.                 pwmn=0;
    153.                
    154.                 MSDelay(75);    
    155.                    
    156.                 pwm=0;
    157.                 pwmn=1;
    158.  
    159.                 MSDelay(25);
    160.                 }
    161.  
    162.                     else if (d== 8)
    163.               {
    164.                  pwm=1;
    165.                 pwmn=0;
    166.                
    167.                 MSDelay(80);    
    168.                    
    169.                 pwm=0;
    170.                 pwmn=1;
    171.  
    172.                 MSDelay(20);
    173.                 }
    174.  
    175.                 else if (d== 9)
    176.               {
    177.                  pwm=1;
    178.                 pwmn=0;
    179.                
    180.                 MSDelay(85);    
    181.                    
    182.                 pwm=0;
    183.                 pwmn=1;
    184.  
    185.                 MSDelay(15);
    186.                 }
    187.                 else if (d== 10)
    188.               {
    189.                  pwm=1;
    190.                 pwmn=0;
    191.                
    192.                 MSDelay(90);    
    193.                    
    194.                 pwm=0;
    195.                 pwmn=1;
    196.  
    197.                 MSDelay(10);
    198.                 }
    199.        
    200.  
    201.                     else if (d>10)
    202.               {
    203.                  pwm=1;
    204.                 pwmn=0;
    205.                                
    206.                 MSDelay(100);  
    207.                    
    208.                 pwm=0;
    209.                 pwmn=1;
    210.  
    211.                 MSDelay(0);
    212.                 }
    213.  
    214.  
    215.        
    216.    
    217. }
    218.  
    219.  
    220.  
    221. void MSDelay(unsigned int itime)
    222. {
    223. unsigned int i,j;
    224. for (i=0;i<itime;i++)
    225. for (j=0;j<1275;j++);
    226. }
     
  2. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,394
    1,607
    Now this is a curious bit of code:
    Code ( (Unknown Language)):
    1.     inc=inc--;   // Deccrement the count
    Literally it says "assign the value of inc to inc, then decrement the value of inc." Exactly what such a concatenation of operations actually does is wildly dependent on the specific C implementation.

    In other words, Simon sez "don't do that."

    Code ( (Unknown Language)):
    1.     inc--;   // Decrement the count
    would be a much better statement to use.

    Also, while I have never used an 8051 I would have to question if the ISR's are correct or don't you have to reset the calling service request flag to keep an endless cascade of interrupts from happening?
     
  3. 0killingsoul0

    Thread Starter New Member

    Mar 1, 2012
    2
    0




    Thanks for the inc-- thing. I just did it in hurry :). My first interrupt is working fine and the second interupt just stucks there. I am quite sure i am calling interrupt correctly. Just saw an example on keil website

     
  4. pradeep23

    New Member

    Dec 13, 2012
    5
    0
    hello sir i am using the circuit also but i didnt get the output wat will be the problem.....

    but if i put it's not accepting the interrupt the motor is continusly running what will be the problem can anyone help me in that..............
     
    Last edited by a moderator: Dec 31, 2012
  5. Ian Rogers

    Member

    Dec 12, 2012
    158
    29
    You are using interrupt 1..... EX1 is interrupt 2.

    Interrupt 1 is timer / counter 0.

    The interrupt won't work as is.
     
  6. pradeep23

    New Member

    Dec 13, 2012
    5
    0
    then how can i give that using interrupt......

    shall i give some other port for interrupt......switch....

    even i want to increase decrease the speed of dc motor how can i give for that help us to that want to change any other circuit or in program.....
     
    Last edited by a moderator: Dec 31, 2012
  7. Ian Rogers

    Member

    Dec 12, 2012
    158
    29
    I Thought you said you were using 0killingsoul0's circuit?

    Code ( (Unknown Language)):
    1. void ex1_isr (void) interrupt 1
    2. {
    3. inc=inc--;   // Deccrement the count
    4. }
    5.  
    should be
    Code ( (Unknown Language)):
    1. void ex1_isr (void) interrupt 2
    2. {
    3. inc--;   // Deccrement the count
    4. }
     
  8. pradeep23

    New Member

    Dec 13, 2012
    5
    0
    then how can igive for that any suggestions..............

    yes i am using the same circuit and code as well as.....but it's working simply motor is running thats it.......

    i changed as like you say but it's not working.....
     
    Last edited by a moderator: Dec 31, 2012
  9. Ian Rogers

    Member

    Dec 12, 2012
    158
    29
    Post YOUR code... I'll take a look see...
     
  10. pradeep23

    New Member

    Dec 13, 2012
    5
    0
    Code ( (Unknown Language)):
    1.  
    2. #include<reg51.h>
    3.  
    4.  
    5.  
    6.  
    7. unsigned char inc = 0;
    8.  
    9. void MSDelay(unsigned int);
    10. void ex0_isr (void) interrupt 0
    11. {
    12. inc++;   // Increment the count
    13. }
    14.  
    15.  
    16. void ex1_isr (void) interrupt 1
    17. {
    18. inc--;   // Deccrement the count
    19. }
    20.  
    21.  
    22.  
    23. sbit pwm=P2^0;
    24. sbit pwmn=P2^1;
    25. sbit enable=P2^2;
    26.  
    27.  
    28.  
    29.  
    30.  
    31. void universal_delay(unsigned int);
    32.  
    33. void main( )
    34. {     IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
    35.       IT1 = 1;   // Configure interrupt 1 for falling edge on /INT0 (P3.2)
    36.      
    37.      
    38.       EX0 = 1;   // Enable EX0 Interrupt
    39.       EX1 = 1;
    40.      
    41.       EA = 1;    // Enable Global Interrupt Flag
    42.      
    43.      enable=1;          
    44.      
    45.      pwm=0;       //  making outputs
    46.      pwmn=0;
    47.  
    48.  
    49.  
    50.    
    51.  
    52.     while(1)
    53.     {    
    54.         universal_delay(inc);
    55.     }
    56.  
    57. }
    58.  
    59.  
    60.  
    61. void universal_delay(unsigned int d)
    62. {
    63.             if (d==1)
    64.             {  
    65.                
    66.                 pwm=1;
    67.                 pwmn=0;
    68.                
    69.                 MSDelay(50);      //  50 ms delay
    70.                    
    71.                 pwm=0;
    72.                 pwmn=1;
    73.  
    74.                 MSDelay(50);
    75.                
    76.            
    77.             }
    78.  
    79.         else if (d== 2)
    80.        
    81.         {  
    82.              pwm=1;
    83.                 pwmn=0;
    84.                
    85.                 MSDelay(55);
    86.                    
    87.                 pwm=0;
    88.                 pwmn=1;
    89.  
    90.                 MSDelay(45);    
    91.                    
    92.             }
    93.  
    94.  
    95.         else if (d== 3)
    96.             {  
    97.                  pwm=1;
    98.                 pwmn=0;
    99.                
    100.                 MSDelay(60);    
    101.                    
    102.                 pwm=0;
    103.                 pwmn=1;
    104.  
    105.                 MSDelay(40);
    106.         }
    107.  
    108.        
    109.         else if (d==4)
    110.             {    
    111.                                 pwm=1;
    112.                 pwmn=0;
    113.                
    114.                 MSDelay(65);    
    115.                    
    116.                 pwm=0;
    117.                 pwmn=1;
    118.  
    119.                 MSDelay(35);
    120.             }
    121.  
    122.             else if (d==5)
    123.        
    124.             {    pwm=1;
    125.                 pwmn=0;
    126.                
    127.                 MSDelay(70);    
    128.                    
    129.                 pwm=0;
    130.                 pwmn=1;
    131.  
    132.                 MSDelay(30);
    133.            
    134.             }
    135.  
    136.         else if (d== 6)
    137.        
    138.             {  
    139.                  pwm=1;
    140.                 pwmn=0;
    141.                
    142.                 MSDelay(75);    
    143.                    
    144.                 pwm=0;
    145.                 pwmn=1;
    146.  
    147.                 MSDelay(30);
    148.             }
    149.  
    150.         else if (d== 7)
    151.               {
    152.                  pwm=1;
    153.                 pwmn=0;
    154.                
    155.                 MSDelay(75);    
    156.                    
    157.                 pwm=0;
    158.                 pwmn=1;
    159.  
    160.                 MSDelay(25);
    161.                 }
    162.  
    163.                     else if (d== 8)
    164.               {
    165.                  pwm=1;
    166.                 pwmn=0;
    167.                
    168.                 MSDelay(80);    
    169.                    
    170.                 pwm=0;
    171.                 pwmn=1;
    172.  
    173.                 MSDelay(20);
    174.                 }
    175.  
    176.                 else if (d== 9)
    177.               {
    178.                  pwm=1;
    179.                 pwmn=0;
    180.                
    181.                 MSDelay(85);    
    182.                    
    183.                 pwm=0;
    184.                 pwmn=1;
    185.  
    186.                 MSDelay(15);
    187.                 }
    188.                 else if (d== 10)
    189.               {
    190.                  pwm=1;
    191.                 pwmn=0;
    192.                
    193.                 MSDelay(90);    
    194.                    
    195.                 pwm=0;
    196.                 pwmn=1;
    197.  
    198.                 MSDelay(10);
    199.                 }
    200.        
    201.  
    202.                     else if (d>10)
    203.               {
    204.                  pwm=1;
    205.                 pwmn=0;
    206.                                
    207.                 MSDelay(100);  
    208.                    
    209.                 pwm=0;
    210.                 pwmn=1;
    211.  
    212.                 MSDelay(0);
    213.                 }
    214.  
    215.  
    216.        
    217.    
    218. }
    219.  
    220.  
    221.  
    222. void MSDelay(unsigned int itime)
    223. {
    224. unsigned int i,j;
    225. for (i=0;i<itime;i++)
    226. for (j=0;j<1275;j++);
    227. }
    228.  
    i am using the same code only ..... but its not working.........
     
    Last edited by a moderator: Dec 31, 2012
  11. Ian Rogers

    Member

    Dec 12, 2012
    158
    29
    OMG!! I can think of easier ways to produce PWM


    Try and use code tags otherwise it's too much effort to read the code..

    You are still calling interrupt 1..... You need interrupt 2.

    Code ( (Unknown Language)):
    1. #include<reg51.h>
    2.  
    3. unsigned char inc = 0;
    4.  
    5. void MSDelay(unsigned int);
    6. void ex0_isr (void) interrupt 0
    7.     {
    8.     inc++; // Increment the count
    9.     }
    10.  
    11.  
    12. void ex1_isr (void) interrupt 2  // <-- This is the interrupt to use
    13.     {
    14.     inc--; // Deccrement the count
    15.     }
    16.  
    17. sbit pwm=P2^0;
    18. sbit pwmn=P2^1;
    19. sbit enable=P2^2;
    20.  
    21.  
    22. void universal_delay(unsigned int);
    23.  
    24. void main( )
    25.     {
    26.     IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
    27.     IT1 = 1; // Configure interrupt 2 for falling edge on /INT0 (P3.2)
    28.  
    29.     EX0 = 1; // Enable EX0 Interrupt
    30.     EX1 = 1;
    31.  
    32.     EA = 1; // Enable Global Interrupt Flag
    33.  
    34.     enable=1;
    35.  
    36.     pwm=0; // making outputs
    37.     pwmn=0;
    38.  
    39.     while(1)
    40.         {
    41.         universal_delay(inc);
    42.         }
    43.  
    44.     }
    45.  
    46. void universal_delay(unsigned int d)
    47.     {
    48.     if (d==1)
    49.         {
    50.         pwm=1;
    51.         pwmn=0;
    52.  
    53.         MSDelay(50); // 50 ms delay
    54.  
    55.         pwm=0;
    56.         pwmn=1;
    57.  
    58.         MSDelay(50);
    59.  
    60.         }
    61.  
    62.     else if (d== 2)
    63.         {
    64.         pwm=1;
    65.         pwmn=0;
    66.  
    67.         MSDelay(55);
    68.  
    69.         pwm=0;
    70.         pwmn=1;
    71.  
    72.         MSDelay(45);
    73.  
    74.         }
    75.  
    76.     else if (d== 3)
    77.         {
    78.         pwm=1;
    79.         pwmn=0;
    80.  
    81.         MSDelay(60);
    82.  
    83.         pwm=0;
    84.         pwmn=1;
    85.  
    86.         MSDelay(40);
    87.         }
    88.  
    89.     else if (d==4)
    90.         {
    91.         pwm=1;
    92.         pwmn=0;
    93.  
    94.         MSDelay(65);
    95.  
    96.         pwm=0;
    97.         pwmn=1;
    98.  
    99.         MSDelay(35);
    100.         }
    101.  
    102.     else if (d==5)
    103.         {
    104.         pwm=1;
    105.         pwmn=0;
    106.  
    107.         MSDelay(70);
    108.  
    109.         pwm=0;
    110.         pwmn=1;
    111.  
    112.         MSDelay(30);
    113.  
    114.         }
    115.     else if (d== 6)
    116.         {
    117.         pwm=1;
    118.         pwmn=0;
    119.  
    120.         MSDelay(75);
    121.  
    122.         pwm=0;
    123.         pwmn=1;
    124.  
    125.         MSDelay(30);
    126.         }
    127.  
    128.     else if (d== 7)
    129.         {
    130.         pwm=1;
    131.         pwmn=0;
    132.  
    133.         MSDelay(75);
    134.  
    135.         pwm=0;
    136.         pwmn=1;
    137.  
    138.         MSDelay(25);
    139.         }
    140.  
    141.     else if (d== 8)
    142.         {
    143.         pwm=1;
    144.         pwmn=0;
    145.  
    146.         MSDelay(80);
    147.  
    148.         pwm=0;
    149.         pwmn=1;
    150.  
    151.         MSDelay(20);
    152.         }
    153.  
    154.     else if (d== 9)
    155.         {
    156.         pwm=1;
    157.         pwmn=0;
    158.  
    159.         MSDelay(85);
    160.  
    161.         pwm=0;
    162.         pwmn=1;
    163.  
    164.         MSDelay(15);
    165.         }
    166.        
    167.     else if (d== 10)
    168.         {
    169.         pwm=1;
    170.         pwmn=0;
    171.  
    172.         MSDelay(90);
    173.  
    174.         pwm=0;
    175.         pwmn=1;
    176.  
    177.         MSDelay(10);
    178.         }
    179.  
    180.     else if (d>10)
    181.         {
    182.         pwm=1;
    183.         pwmn=0;
    184.  
    185.         MSDelay(100);
    186.  
    187.         pwm=0;
    188.         pwmn=1;
    189.  
    190.         MSDelay(0);
    191.         }
    192. }
    193.  
    194. void MSDelay(unsigned int itime)
    195.     {
    196.     unsigned int i,j;
    197.     for (i=0;i<itime;i++)
    198.     for (j=0;j<1275;j++);
    199.     }
    200.  
    I'm going to chuck this on ISIS and I'l get back to you..
     
  12. Ian Rogers

    Member

    Dec 12, 2012
    158
    29
    Two things.... The PWM period is 1 second.... What motor is it driving....

    Most people use a 2khz+ period (2000 cycles not 1)...

    Secondly. The universal_delay is a bit... well rubbish!

    When I do PWM I use the interrupt to generate the duty and period... I then poll the switches and change the duty outside the interrupt...
     
  13. pradeep23

    New Member

    Dec 13, 2012
    5
    0
    what will be the problem sir?

    what can i do for that?can you please help me?
     
    Last edited by a moderator: Dec 31, 2012
Loading...