panxiaoyi 发表于 2021-3-21 12:41

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

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



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不会工作
页: [1]
查看完整版本: 改变 PWM3P 的值却改变不了中断周期 ?