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

觉得自己玩不了PWM

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 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一直亮着,这是正常的吗?




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 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. }
复制代码
究竟在哪个环节出错了,请大佬赐教,谢谢!



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6845

积分

论坛元老

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

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 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. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

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

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


04.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 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, 2025-5-4 01:22 , Processed in 0.182496 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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