找回密码
 立即注册
查看: 302|回复: 8

觉得自己玩不了PWM

[复制链接]
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
    发表于 2024-1-8 14:55:22 | 显示全部楼层 |阅读模式
    本帖最后由 xxkj2010 于 2024-1-8 14:57 编辑

    参考STC_ISP中的STC8H PWM例程
    01.jpg

    将测试端口改为P54

    1. #include "reg51.h"
    2. #include "intrins.h"
    3. sfr     P_SW2   =   0xba;
    4. sfr     P5          =           0xc8;
    5. sbit    P54         =           P5^4;
    6.                
    7. #define PWMA_CR1    (*(unsigned char volatile xdata *)0xfec0)
    8. #define PWMA_IER    (*(unsigned char volatile xdata *)0xfec4)
    9. #define PWMA_SR1    (*(unsigned char volatile xdata *)0xfec5)
    10. #define PWMA_ARR    (*(unsigned  int volatile xdata *)0xfed2)
    11. #define PWMB_CR1    (*(unsigned char volatile xdata *)0xfee0)
    12. #define PWMB_IER    (*(unsigned char volatile xdata *)0xfee4)
    13. #define PWMB_SR1    (*(unsigned char volatile xdata *)0xfee5)
    14. #define PWMB_ARR    (*(unsigned  int volatile xdata *)0xfef2)
    15. sfr     P0M1    =   0x93;
    16. sfr     P0M0    =   0x94;
    17. sfr     P1M1    =   0x91;
    18. sfr     P1M0    =   0x92;
    19. sfr     P2M1    =   0x95;
    20. sfr     P2M0    =   0x96;
    21. sfr     P3M1    =   0xb1;
    22. sfr     P3M0    =   0xb2;
    23. sfr     P4M1    =   0xb3;
    24. sfr     P4M0    =   0xb4;
    25. sfr     P5M1    =   0xc9;
    26. sfr     P5M0    =   0xca;
    27. sbit    P36     =   P3^6;
    28. void PWMA_Isr() interrupt 26
    29. {
    30.     if (PWMA_SR1 & 0x01)
    31.     {
    32.         PWMA_SR1 &= ~0x01;
    33.         P36 = ~P36;                             //测试端口
    34.     }
    35. }
    36. void PWMB_Isr() interrupt 27
    37. {
    38.     if (PWMB_SR1 & 0x01)
    39.     {
    40.         PWMB_SR1 &= ~0x01;
    41.         P54 = ~P54;                             //测试端口
    42.     }
    43. }
    44. void main()
    45. {
    46.     P0M0 = 0x00;
    47.     P0M1 = 0x00;
    48.     P1M0 = 0x00;
    49.     P1M1 = 0x00;
    50.     P2M0 = 0x00;
    51.     P2M1 = 0x00;
    52.     P3M0 = 0x00;
    53.     P3M1 = 0x00;
    54.     P4M0 = 0x00;
    55.     P4M1 = 0x00;
    56.     P5M0 = 0x00;
    57.     P5M1 = 0x00;
    58.     P_SW2 = 0x80;
    59.    
    60.     PWMA_ARR = 500;                             //设置PWMA周期为500
    61.     PWMA_IER = 0x01;                            //使能PWMA周期中断
    62.     PWMA_CR1 = 0x01;                            //启动PWMA模块
    63.    
    64.     PWMB_ARR = 800;                             //设置PWMB周期为800
    65.     PWMB_IER = 0x01;                            //使能PWMB周期中断
    66.     PWMB_CR1 = 0x01;                            //启动PWMB模块
    67.    
    68.     EA = 1;
    69.     while (1);
    70. }
    复制代码

    然后下载到STC8H1K17T板子中(IRC选择11.0592),结果接在P54的LED一直亮着,这是正常的吗?




    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
     楼主| 发表于 2024-1-9 07:53:37 | 显示全部楼层
    上面问题已经自行解决,但还是有新的问题。具体等待有空整理发布。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
     楼主| 发表于 2024-1-9 11:59:42 | 显示全部楼层
    本帖最后由 xxkj2010 于 2024-1-9 12:04 编辑

    问题二:

    用STC-ISP中的STC8H PWM中断程序修改:
    1. //PWMB 设置
    2.     PWMB_PSCR  = 24000-1;                       //分频
    3.     PWMB_ARR = 1000;                             //设置PWMB周期为1000,1秒
    4.     PWMB_IER = 0x01;                            //使能PWMB中断
    5.     PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块
    6.                
    7. }
    8. void PWMB_Isr() interrupt 27
    9. {
    10.     if (PWMB_SR1 & 0x01)
    11.     {
    12.         PWMB_SR1 &= ~0x01;
    13.         LED = ~LED;                             //测试端口
    14.     }
    15. }
    16. void INT0_Isr() interrupt 0
    17. {
    18.         
    19.         
    20. }
    复制代码
    这样PWMB能正常中断,从而使接在P54的LED灯闪动。

    但是如果加入将PWMB影射到某个端口的代码,就不能测试到正常的结果。
    1. //外部中断0设置
    2.                 EX0=1;//使能外部中断0
    3.                 IT0=1;// 使能 INT0 下降沿中断
    4. //PWMB 设置
    5.     PWMB_PSCR  = 24000-1;                       //分频
    6.     PWMB_ARR = 1000;                             //设置PWMB周期为1000,1秒
    7.     PWMB_IER = 0x01;                            //使能PWMB中断
    8.     PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块
    9.                 PWMB_ENO  =0x40;   //0100 0000,使能 PWM8 输出
    10.                 PWMB_PS   =0x40;   //0100 0000,输出到P34
    11.                
    12. }
    13. void PWMB_Isr() interrupt 27
    14. {
    15.     if (PWMB_SR1 & 0x01)
    16.     {
    17.         PWMB_SR1 &= ~0x01;
    18. //        LED = ~LED;                             //测试端口
    19.     }
    20. }
    21. void INT0_Isr() interrupt 0
    22. {
    23. LED = ~LED;                             //测试端口
    24.         
    25. }
    复制代码
    究竟在哪个环节出错了,请大佬赐教,谢谢!



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

    积分
    4127
    发表于 2024-1-9 13:12:28 | 显示全部楼层
    xxkj2010 发表于 2024-1-9 11:59
    问题二:

    用STC-ISP中的STC8H PWM中断程序修改:

    INT0是P3.2,你有将P3.4输出的PWM信号接到P3.2脚位上吗?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
     楼主| 发表于 2024-1-9 13:29:06 | 显示全部楼层
    乘风飞扬 发表于 2024-1-9 13:12
    INT0是P3.2,你有将P3.4输出的PWM信号接到P3.2脚位上吗?

    刚才发现了这个问题,但修改为P33(INT1)也不行
    1. //外部中断设置
    2.                 EX1=1;//使能外部中断1
    3.                 //IE0=1;//外部中断1中断请求标志
    4.                 IT1=1;// 使能 INT1 下降沿中断               
    5. //                IPH=0x04;//PX1H =1;
    6. //                PX1 =1;//外部中断1为最高级
    7. //PWMB 设置
    8.     PWMB_PSCR  = 24000-1;                       //分频
    9.     PWMB_ARR = 1000;                             //设置PWMB周期为1000,1秒
    10.     PWMB_IER = 0x01;                            //使能PWMB中断
    11.     PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块
    12.                 PWMB_ENO  =0x10;   //0001 0000,使能 PWM7 输出
    13.                 PWMB_PS  =0x10;   //0001 0000,输出到P33        
    14. }
    15. void PWMB_Isr() interrupt 27
    16. {
    17.     if (PWMB_SR1 & 0x01)
    18.     {
    19.         PWMB_SR1 &= ~0x01;
    20. //        LED = ~LED;                             //测试端口
    21.     }
    22. }
    23. void INT1_Isr() interrupt 2
    24. {
    25.         LED = ~LED;                             //测试端口        
    26. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9397

    回帖

    1万

    积分

    管理员

    积分
    13922
    发表于 2024-1-9 14:44:29 | 显示全部楼层
    先看陈老师的教学视频
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
     楼主| 发表于 2024-1-9 14:56:22 | 显示全部楼层
    本帖最后由 xxkj2010 于 2024-1-9 15:41 编辑

    PWMB能产生中断了(这个已经测试),现在的问题是将PWMB脉冲影射到IO口就无法到达需要的p33引脚,检查多次,寄存器PWMB_PS设置尚未发现问题。
    01.jpg


    04.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9397

    回帖

    1万

    积分

    管理员

    积分
    13922
    发表于 2024-1-9 15:44:38 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 166 天

    [LV.7]常住居民III

    67

    主题

    841

    回帖

    2822

    积分

    金牌会员

    积分
    2822
     楼主| 发表于 2024-1-9 15:45:52 | 显示全部楼层
    神农鼎 发表于 2024-1-9 15:44
    STC8H系列-高级PWM范例程序下载,2024/1/3 更新 - PWM/144MHz时钟源的PWM/45路PWM+3路CCP/7组不同周期的P ...

    这些早就下载了,等有个完整时间再通读一遍,谢谢!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-12 08:07 , Processed in 0.071138 second(s), 63 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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