[技术支持] 改变 PWM3P 的值却改变不了中断周期 ?

[复制链接]
 楼主| panxiaoyi 发表于 2021-3-21 12:41 | 显示全部楼层 |阅读模式
HC89F0541,PWM3,按照数据手册说明,改变 PWM3P 的值应该是可以改变中断周期的,可是,下面的这个测试,改变 PWM3P 的值,LED的闪烁时间没有任何改变,不知道为什么

  1. #define          ALLOCATE_EXTERN
  2. #include "HC89F0541.h"
  3. #include "BIT.h"

  4. unsigned int i;

  5. void main(void)
  6. {
  7.         //CLKCON = 0x00;                               //关闭外部晶振,关闭内部RC
  8.         CLKSWR = 0x00;                                                                   //内部低频RC44K,低频RC没有分频选项,即 Fosc=44K
  9.         CLKDIV = 0x00;                                                             //CPU时钟=Fosc/分频0-255,0-1都是1分频

  10.         PWM3C B7H;                                   //打开PWM3,8位
  11.         PWM3C B6H;                                   //中断使能
  12.         PWM3C B5L;                                   //中断标记清零
  13.         PWM3C B4H;                                   //允许输出
  14.         PWM3C B3L;                                   //占空比正比例,即比较值越大占空比就越大
  15.         PWM3C B2H;                                   //Bit 2 1 0 是时钟设置,默认000=Fosc/1
  16.         PWM3C B1H;                                   //001=Fosc/2,010=Fosc/4,011=Fosc/8
  17.         PWM3C B0H;                                   //以此类推,最高 111=Fosc/128
  18.        
  19.         PWM3_MAP=0x30;                               //PWM输出映射到P30
  20.         P3M0=0xC0;                                   //推换输出
  21.         P1M5=0xC0;                                   //P15推换输出驱动LED
  22.        
  23.         PWM3P=0xFF;                                  //数值越小PWM频率越高,但是占空比分辨率就越小
  24.         PWM3D=0x03;                                  //调整占空比,该值不能大于计数周期PWM3P
  25.        
  26.         EA=1;                                        //打开总中断
  27.        
  28.         while(1) WDTC |= 0x10;                       //看门狗默认开启,程序必须定时清零看门狗
  29. }


  30. void PWM_ISR(void) interrupt PWM_VECTOR        //所有PWM共用壹个中断向量
  31. {
  32.         if(i>1050)
  33.         {
  34.                 P1_5 =~ P1_5;                                                                   //P15翻转驱动LED
  35.                 i=0;
  36.         }
  37.         PWM0C &=~ 0x40;                                                                   //清除中断标志位
  38.         i++;
  39. }

  1. //为了直观和理解还是对寄存器的每个功能位分步操作比较好

  2. //数据的某位写1或0

  3. #ifndef __BIT_H__
  4. #define __BIT_H__

  5. #define B7H |= 0x80
  6. #define B6H |= 0x40
  7. #define B5H |= 0x20
  8. #define B4H |= 0x10
  9. #define B3H |= 0x08
  10. #define B2H |= 0x04
  11. #define B1H |= 0x02
  12. #define B0H |= 0x01

  13. #define B7L &= 0x7F
  14. #define B6L &= 0xBF
  15. #define B5L &= 0xDF
  16. #define B4L &= 0xEF
  17. #define B3L &= 0xF7
  18. #define B2L &= 0xFB
  19. #define B1L &= 0xFD
  20. #define B0L &= 0xFE

  21. #endif



Keil 仿真调试例子.rar

31.33 KB, 下载次数: 0

 楼主| panxiaoyi 发表于 2021-3-21 12:49 | 显示全部楼层
另外,数据手册说的 时钟控制寄存器 CLKCON ,其中 Bit 1 ,手册上说

内部高速 内部高速 RC 振荡器使能位
0:内部高速 内部高速 RC 关闭
1:内部高速 内部高速 RC 打开

我测试了一下,这个位应该是 内部 RC 开关,而不是高速 RC 开关
因为我使用
//CLKCON = 0x00;                               //关闭外部晶振,关闭内部RC
这个语句时,CPU不会工作
 楼主| panxiaoyi 发表于 2021-3-21 17:26 | 显示全部楼层
低级错误,是中断程序的清除中断标记移植时搞错了,应该是 PWM3C B5L;
 楼主| panxiaoyi 发表于 2021-3-21 17:29 | 显示全部楼层
不过,下面的应该是数据手册的标错了:

另外,数据手册说的 时钟控制寄存器 CLKCON ,其中 Bit 1 ,手册上说

内部高速 内部高速 RC 振荡器使能位
0:内部高速 内部高速 RC 关闭
1:内部高速 内部高速 RC 打开

我测试了一下,这个位应该是 内部 RC 开关,而不是高速 RC 开关
因为我使用
//CLKCON = 0x00;                               //关闭外部晶振,关闭内部RC
这个语句时,CPU不会工作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

414

帖子

2

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

53

主题

414

帖子

2

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