[AVR单片机] atmega32p 定时器 PWM模式疑问

[复制链接]
 楼主| chendaohong 发表于 2015-11-10 23:52 | 显示全部楼层 |阅读模式
代码如下,用自定义的 delay_ms() 函数时 OCR0A/OCR0B 脚位(PD6/PD5)的LED一直亮,不会变化,但用for循环代替 delay_ms函数则正常,两个LED都会渐亮、渐暗的变化,求解;

  1. //ICC-AVR application builder : 2015/9/24 22:04:07
  2. // Target : M328p
  3. // Crystal: 16.000Mhz
  4. // Serial send and receive function

  5. #include <iom328pv.h>
  6. #include <avrdef.h>
  7. //#include <macros.h>


  8. void delay_ms(int n);
  9. void timer0_init(void);

  10. void main(void)
  11. {
  12. int i;
  13. int j,k;
  14. DDRD=0XFF;  //PORTD输出模式
  15. PORTD=0X00;
  16. DDRB=0XFF;  //PORTD输出模式
  17. PORTB=0X0F;
  18. CLI();
  19. timer0_init();
  20. SEI();

  21. while(1)
  22. {
  23.   for(i=0;i<255;i++)
  24.   {
  25.    OCR0A=i;
  26.    OCR0B=i;
  27.    for(j=0;j<5;j++)
  28.    {
  29.     for(k=0;k<10000;k++);
  30.    }
  31.    //delay_ms(5);
  32.   }
  33.   
  34.   for(i=254;i>0;i--)
  35.   {
  36.    OCR0A=i;
  37.    OCR0B=i;
  38.    for(j=0;j<5;j++)
  39.    {
  40.     for(k=0;k<10000;k++);
  41.    }
  42.    //delay_ms(5);
  43.   }
  44. }
  45. }

  46. void delay_ms(int n)
  47. {
  48. int k,j;
  49. for(j=0;j<n;j++)
  50. {
  51.   for(k=0;k<10000;k++);
  52. }
  53. }


  54. void timer0_init(void)
  55. {
  56. TCNT0=0X00;  //定时器初始值
  57. TCCR0A|=(1<<COM0A0)|(1<<COM0A1)|(1<<COM0B0)|(1<<COM0B1)|(1<<WGM00); //WGM00置位1,Phase correct PWM模式,COM0A1/B1 COM0A0/B0置位1
  58. TCCR0B|=(1<<CS00);  //无时钟分频
  59. OCR0A=1;
  60. OCR0B=0;
  61. //TIMSK0=0x01;  //定时器计数器0比较匹配开启,溢出开启
  62. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部