[技术支持]

改变 PWM3P 的值却改变不了中断周期 ?

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

#define          ALLOCATE_EXTERN
#include "HC89F0541.h"
#include "BIT.h"

unsigned int i;

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

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


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

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

//数据的某位写1或0

#ifndef __BIT_H__
#define __BIT_H__

#define B7H |= 0x80
#define B6H |= 0x40
#define B5H |= 0x20
#define B4H |= 0x10
#define B3H |= 0x08
#define B2H |= 0x04
#define B1H |= 0x02
#define B0H |= 0x01

#define B7L &= 0x7F
#define B6L &= 0xBF
#define B5L &= 0xDF
#define B4L &= 0xEF
#define B3L &= 0xF7
#define B2L &= 0xFB
#define B1L &= 0xFD
#define B0L &= 0xFE

#endif



Keil 仿真调试例子.rar

31.33 KB

使用特权

评论回复
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不会工作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

384

帖子

2

粉丝