找回密码
 立即注册
查看: 671|回复: 16

STC8G2K64S4的增强型PWM中断疑问

[复制链接]

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
发表于 2023-7-28 13:08:04 | 显示全部楼层 |阅读模式
官方手册 19.1.3PWM中断标志寄存器(PWMnIF)


CiIF: PWMn 的第 i通道中断标志位。(n=0~5: =0~7)
可设置在各路 PWM 的 T1 和 T2。当所设置的点发生匹配事件时,硬件自动将此位置 1,并向 CPU提出中断请求,此标志位需要软件清零。

这种PWM中断发生处能否设置在周期值得固定处 而非T1,T2有关?
谢谢!
回复 送花

使用道具 举报

该用户从未签到

46

主题

3043

回帖

6861

积分

超级版主

积分
6861
发表于 2023-7-28 13:59:48 | 显示全部楼层
你具体说说想在哪里中断?
PWM除了T1与T2匹配中断,就是周期中断,没别的了。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
 楼主| 发表于 2023-7-29 08:13:31 | 显示全部楼层
梁工 发表于 2023-7-28 13:59
你具体说说想在哪里中断?
PWM除了T1与T2匹配中断,就是周期中断,没别的了。 ...

我是想在周期一半发生中断

点评

如果PWM还有剩余,启动一路PWM,不输出,占空比50%,周期中间的跳变允许中断,就是对应周期的一半。  详情 回复 发表于 2023-7-29 09:25
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3043

回帖

6861

积分

超级版主

积分
6861
发表于 2023-7-29 09:25:57 | 显示全部楼层
Inver1688 发表于 2023-7-29 08:13
我是想在周期一半发生中断

如果PWM还有剩余,启动一路PWM,不输出,占空比50%,周期中间的跳变允许中断,就是对应周期的一半。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
 楼主| 发表于 2023-7-31 16:56:07 | 显示全部楼层
梁工 发表于 2023-7-29 09:25
如果PWM还有剩余,启动一路PWM,不输出,占空比50%,周期中间的跳变允许中断,就是对应周期的一半。 ...

好的 谢谢您的解答
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
 楼主| 发表于 2023-7-31 18:48:42 | 显示全部楼层
本帖最后由 Inver1688 于 2023-8-1 10:35 编辑
梁工 发表于 2023-7-29 09:25
如果PWM还有剩余,启动一路PWM,不输出,占空比50%,周期中间的跳变允许中断,就是对应周期的一半。 ...

您好!还有个问题 在官方手册19.2.3 PWM实现渐变灯(呼吸灯)这个代码
void PWM0_Isr() interrupt 22
{
    static bit dir = 1;
    static int val = 0;

    if (PWMCFG01 & 0x08)
    {
        PWMCFG01 &= ~0x08;                      //清中断标志
        if (dir)
        {
            val++;
            if (val >= CYCLE) dir = 0;
        }
        else
        {
            val--;
            if (val <= 1) dir = 1;
        }
        _push_(P_SW2);
        P_SW2 |= 0x80;
        PWM00T2 = val;
        _pop_(P_SW2);
    }
}

是不是在中断中改变XFR寄存器的值都要先对P_SW2做入栈 赋值操作后再出栈?


如果在主程序的main函数开头P_SW2 |= 0x80; 整个代码并没有清零P_SW2 那么此时PWM0中断对P_SW2做入栈和出栈操作不?
谢谢!

点评

P_SW2 |= 0x80;之后不用清零,中断不需要对P_SW2操作。  详情 回复 发表于 2023-7-31 23:52
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3043

回帖

6861

积分

超级版主

积分
6861
发表于 2023-7-31 23:52:52 | 显示全部楼层
Inver1688 发表于 2023-7-31 18:48
您好!还有个问题 在官方手册19.2.3 PWM实现渐变灯(呼吸灯)这个代码
void PWM0_Isr() interrupt 22
{

P_SW2 |= 0x80;之后不用清零,中断不需要对P_SW2操作。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
 楼主| 发表于 2023-8-1 10:33:55 | 显示全部楼层
梁工 发表于 2023-7-31 23:52
P_SW2 |= 0x80;之后不用清零,中断不需要对P_SW2操作。

但我看到官方例子中却对P_SW2做了,出入栈操作,请问什么情况下要对P_SW2做出入栈操作?谢谢!

点评

最早是STC15W4K系列的6通道15位增强型PWM开始用XDATA区的SFR,刚开始要求入栈保护一下,后来到了STC8系列,就不需要了。一些例子是由于直接使用STC15系列的例子,所以没有更改。如果是新写的例子,就不会再入栈的。  详情 回复 发表于 2023-8-1 14:28
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3043

回帖

6861

积分

超级版主

积分
6861
发表于 2023-8-1 14:28:02 | 显示全部楼层
Inver1688 发表于 2023-8-1 10:33
但我看到官方例子中却对P_SW2做了,出入栈操作,请问什么情况下要对P_SW2做出入栈操作?谢谢! ...

最早是STC15W4K系列的6通道15位增强型PWM开始用XDATA区的SFR,刚开始要求入栈保护一下,后来到了STC8系列,就不需要了。一些例子是由于直接使用STC15系列的例子,所以没有更改。如果是新写的例子,就不会再入栈的。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

13

主题

40

回帖

194

积分

注册会员

积分
194
 楼主| 发表于 2023-8-2 08:01:02 | 显示全部楼层
梁工 发表于 2023-8-1 14:28
最早是STC15W4K系列的6通道15位增强型PWM开始用XDATA区的SFR,刚开始要求入栈保护一下,后来到了STC8系列 ...

好的 谢谢梁工
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-19 10:06 , Processed in 0.070883 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表