[STC单片机] 求助:STC8的PWM初始化后串口无法通讯

[复制链接]
 楼主| wfxsgsg 发表于 2017-5-6 14:47 | 显示全部楼层 |阅读模式
我用的是STC8A8K64S4A12,在PWM输出后,想用串口通讯将PWM的占空比输出给电脑,可是经过排查,发现 P_SW2 |= 0x80 ,这一句影响了串口的发送,可是这一句在STC8.h里面说明必须使用。还望各路前辈大神给指点一下!附代码如下:
  1. #include <STC8.h>
  2. #include <intrins.h>
  3. #define FOSC 24000000UL
  4. #define BRT (65536 - FOSC / 115200 / 4)
  5. #define PWM_T 0x1000        // PWM计数器,设置PWM周期为0x1000,即4096
  6. #define PWMnT1 0x0000        //PWM的0通道T1计数值为0
  7. #define PWMnT2 0x0028        //PWM的0通道T2计数值为0x28
  8. #define PWMnCR 0x85
  9. bit busy,p=0;
  10. char wptr;
  11. char rptr;
  12. char buffer[4];
  13. void UartSend(char dat)
  14. {
  15.         while (busy);
  16.         busy = 1;
  17.         SBUF = dat;
  18. }
  19. void UartIsr() interrupt 4 using 1
  20. {
  21.         if (TI)
  22.         {
  23.                 TI = 0;
  24.                 busy = 0;
  25.         }
  26.         if (RI)
  27.         {
  28.                 RI = 0;
  29.                 buffer[wptr++] = SBUF;
  30.                 wptr &= 0x03;
  31.                 while(!RI);
  32.                 RI = 0;
  33.                 buffer[wptr++] = SBUF;
  34.                 wptr &= 0x03;
  35.                 while(!RI);
  36.                 RI = 0;
  37.                 buffer[wptr++] = SBUF;
  38.                 wptr &= 0x03;
  39.                 wptr = 0x00;
  40.                 p=1;
  41.         }
  42. }
  43. void UartInit()
  44. {
  45.         P_SW1 &= ~0xc0;
  46.         SCON = 0x50;
  47.         T2L = BRT;
  48.         T2H = BRT >> 8;
  49.         AUXR = 0x15;
  50.         wptr = 0x00;
  51.         rptr = 0x00;
  52.         TI = 0;
  53. }
  54. void UartSendStr(char *p)
  55. {
  56.         while (*p)
  57.         {
  58.                 UartSend(*p++);
  59.         }
  60. }
  61. void main()
  62. {
  63.         unsigned int auto_adjust[8];
  64.         unsigned char adjust_flag=0x00;
  65.         UartInit();
  66.         ES = 1;
  67.         EA = 1;
  68. /************************************以下是PWM的初始化********************************/
  69.         P_SW2 |= 0x80;
  70.         PWMCKS = 0x01;// PWM时钟选择,系统时钟2分频:12MHz,但实际测得的输出是 约2.93kHz
  71.         PWMC = PWM_T;        // PWM计数器,设置PWM周期为0x1000,即4096
  72.        
  73.         PWM0T1 = PWMnT1;
  74.         PWM0T2 = PWMnT2;
  75.         PWM0CR = PWMnCR;
  76.        
  77.         PWM1T1 = PWMnT1;
  78.         PWM1T2 = PWMnT2;
  79.         PWM1CR = PWMnCR;
  80.        
  81.         PWM2T1 = PWMnT1;
  82.         PWM2T2 = PWMnT2;
  83.         PWM2CR = PWMnCR;
  84.        
  85.         PWM3T1 = PWMnT1;
  86.         PWM3T2 = PWMnT2;
  87.         PWM3CR = PWMnCR;
  88.        
  89.         PWM4T1 = PWMnT1;
  90.         PWM4T2 = PWMnT2;
  91.         PWM4CR = PWMnCR;
  92.        
  93.         PWM5T1 = PWMnT1;
  94.         PWM5T2 = PWMnT2;
  95.         PWM5CR = PWMnCR;
  96.                
  97.         PWM6T1 = PWMnT1;
  98.         PWM6T2 = PWMnT2;
  99.         PWM6CR = PWMnCR;
  100.                
  101.         PWM7T1 = PWMnT1;
  102.         PWM7T2 = PWMnT2;
  103.         PWM7CR = PWMnCR;
  104.        
  105.         PWMIF = 0x00;
  106.         PWMCFG &= ~0xc0;
  107.         P_SW2 &= ~0x80;
  108.         IP2H &= ~0x08;
  109.         IP2 |= 0x08;
  110.         PWMCR = 0x80;                                /*PWM0的控制寄存器,PWM输出使能,初始电平=0,
  111.                                                                                                 P2脚作为PWM功能脚,使能中断,使能T1翻转点中断*/
  112.                                                                                                
  113. /************************************以上是PWM的初始化********************************/
  114.         while (1)
  115.         {
  116.                 if (p)
  117.                 {
  118.                         p=0;
  119.                         auto_adjust[buffer[0]] = buffer[2];
  120.                         auto_adjust[buffer[0]] = (auto_adjust[buffer[0]]<<8) + buffer[1];
  121.                         adjust_flag |= 1<<buffer[0];
  122.                         UartSend(buffer[0]);
  123.                         UartSend((auto_adjust[buffer[0]]>>8));
  124.                         UartSend(((auto_adjust[buffer[0]]<<8)>>8));
  125.                 }
  126.                 _nop_();
  127.                 _nop_();
  128.                 _nop_();
  129.                 UartSend(p);
  130.                 _nop_();
  131.                 _nop_();
  132.                 _nop_();
  133.         }
  134. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
libre01 发表于 2017-5-6 19:16 | 显示全部楼层
通信不成功是收不到数据还是数据传输错误
 楼主| wfxsgsg 发表于 2017-5-6 21:13 | 显示全部楼层
本帖最后由 wfxsgsg 于 2017-5-6 21:18 编辑
libre01 发表于 2017-5-6 19:16
通信不成功是收不到数据还是数据传输错误

是收不到数据,但是我屏蔽 P_SW2 |= 0x80 这条语句后就能收到数据了,通讯也正常了。可是屏蔽了 P_SW2 |= 0x80 这条语句后PWM寄存器的设置就不能生效了,主题帖附的图片说明了 P_SW2 |= 0x80 这条语句的重要性
libre01 发表于 2017-5-7 09:29 | 显示全部楼层
本帖最后由 libre01 于 2017-5-7 09:55 编辑

你看下头文件中P_SW2定义的地址正确不?用的串口一的话,你把P_SW1&=~0xc0去掉,再运行下
 楼主| wfxsgsg 发表于 2017-5-8 09:38 | 显示全部楼层
libre01 发表于 2017-5-7 09:29
你看下头文件中P_SW2定义的地址正确不?用的串口一的话,你把P_SW1&=~0xc0去掉,再运行下 ...

P_SW2的地址没有错,P_SW1去掉运行,也不行。有两条语句:P_SW2 |= 0x80;P_SW2 &= ~0x80;这两句第一个是把最高位置1,第二个是把最高位清零。在主题帖的程序里,他俩之间有20多条语句。如果我把第二条清零语句提前(这样PWM就不正常了,暂且不管他),提前到他俩之间只有极少几条语句,2条1条0条,然后在运行,发现串口工作正常了 。         。另外,我咨询了STC的工程师,他说会不会是我其他寄存器也要用到P_SW2 |= 0x80;P_SW2 &= ~0x80;这两条语句,我检查了一下,其他的寄存器就是串口1和定时器2的了,然而串口和定时器的寄存器都不用那两条语句。
coody 发表于 2017-5-8 14:04 | 显示全部楼层
主程序:
P_SW2 |= 0x80;   //访问XSFR
XSFR访问代码
P_SW2 &= ~0x80;   //访问xdata

访问xdata代码略   // 访问xdata

中断里,先保存P_SW2,再根据要访问XSFR还是XDATA RAM来设置P_SW2最高位,处理完成,再恢复P_SW2 的值。
i = P_SW2;   //暂存P_SW2
根据要访问XSFR还是XDATA RAM来设置P_SW2最高位.
处理代码.
P_SW2 = i;   //恢复P_SW2
 楼主| wfxsgsg 发表于 2017-5-8 17:09 | 显示全部楼层
本帖最后由 wfxsgsg 于 2017-5-8 17:11 编辑
coody 发表于 2017-5-8 14:04
主程序:
P_SW2 |= 0x80;   //访问XSFR
XSFR访问代码

程序里面好像只用到了特殊功能寄存器(XSFR),就是PWM的那些寄存器;xdata在程序中没有特定指明使用,编译的时候也没有用到xdata。我引入一个变量 i 后,编译烧录运行,还是串口无**常收到数据,只收到了“00 00 ”,电脑发送数据,没有接收反应。现在还是,只要屏蔽了PWM初始化里面的P_SW2 |= 0x80;这条语句,串口就变得一切正常了。我有点怀疑这款芯片有问题。下面是我加入PWM中断函数和局部变量 i 之后的程序,结果串口还是不行。
  1. #include <STC8.h>
  2. #include <intrins.h>
  3. #define FOSC 24000000UL
  4. #define BRT (65536 - FOSC / 115200 / 4)
  5. #define PWM_T 0x1000        // PWM计数器,设置PWM周期为0x1000,即4096
  6. #define PWMnT1 0x0000        //PWM的0通道T1计数值为0
  7. #define PWMnT2 0x0028        //PWM的0通道T2计数值为0x28
  8. #define PWMnCR 0x85
  9. bit busy,p=0;
  10. char wptr,adjust_flag;
  11. char rptr;
  12. char buffer[4];
  13. void UartIsr() interrupt 4 using 1
  14. {
  15.         if (TI)
  16.         {
  17.                 TI = 0;
  18.                 busy = 0;
  19.         }
  20.         if (RI)
  21.         {
  22.                 RI = 0;
  23.                 buffer[wptr++] = SBUF;
  24.                 wptr &= 0x03;
  25.                 while(!RI);
  26.                 RI = 0;
  27.                 buffer[wptr++] = SBUF;
  28.                 wptr &= 0x03;
  29.                 while(!RI);
  30.                 RI = 0;
  31.                 buffer[wptr++] = SBUF;
  32.                 wptr &= 0x03;
  33.                 wptr = 0x00;
  34.                 p=1;
  35.         }
  36. }
  37. void PWM_Isr() interrupt 22 using 3
  38. {
  39.         unsigned char i;
  40.         i = P_SW2;
  41.         P_SW2 |= 0x80;
  42.         if (PWMCFG & 0x80)
  43.                 PWMCFG &= ~0x80;
  44.         if (PWMIF & 0x80)
  45.         {
  46.                 PWMIF &= ~0x80;
  47.                 if(adjust_flag & 0x80)
  48.                 {
  49.                         adjust_flag &= ~0x80;
  50.                 }
  51.         }
  52.         if (PWMIF & 0x40)
  53.         {
  54.                 PWMIF &= ~0x40;
  55.                 if(adjust_flag & 0x40)
  56.                 {
  57.                         adjust_flag &= ~0x40;
  58.                 }
  59.         }
  60.         if (PWMIF & 0x20)
  61.         {
  62.                 PWMIF &= ~0x20;
  63.                 if(adjust_flag & 0x20)
  64.                 {
  65.                         adjust_flag &= ~0x20;
  66.                 }
  67.         }
  68.         if (PWMIF & 0x10)
  69.         {
  70.                 PWMIF &= ~0x10;
  71.                 if(adjust_flag & 0x10)
  72.                 {
  73.                         adjust_flag &= ~0x10;
  74.                 }
  75.         }
  76.         if (PWMIF & 0x08)
  77.         {
  78.                 PWMIF &= ~0x08;
  79.                 if(adjust_flag & 0x08)
  80.                 {
  81.                         adjust_flag &= ~0x08;
  82.                 }
  83.         }
  84.         if (PWMIF & 0x04)
  85.         {
  86.                 PWMIF &= ~0x04;
  87.                 if(adjust_flag & 0x04)
  88.                 {
  89.                         adjust_flag &= ~0x04;
  90.                 }
  91.         }
  92.         if (PWMIF & 0x02)
  93.         {
  94.                 PWMIF &= ~0x02;
  95.                 if(adjust_flag & 0x02)
  96.                 {
  97.                         adjust_flag &= ~0x02;
  98.                 }
  99.         }
  100.         if (PWMIF & 0x01)
  101.         {
  102.                 PWMIF &= ~0x01;
  103.                 if(adjust_flag & 0x01)
  104.                 {
  105.                         adjust_flag &= ~0x01;
  106.                 }
  107.         }
  108.         P_SW2 = i;
  109. }
  110. void UartInit()
  111. {
  112.         P_SW1 &= ~0xc0;
  113.         SCON = 0x50;
  114.         T2L = BRT;
  115.         T2H = BRT >> 8;
  116.         AUXR = 0x15;
  117.         wptr = 0x00;
  118.         rptr = 0x00;
  119.         TI = 0;
  120. }
  121. void UartSend(char dat)
  122. {
  123.         while (busy);
  124.         busy = 1;
  125.         SBUF = dat;
  126. }
  127. void UartSendStr(char *p)
  128. {
  129.         while (*p)
  130.         {
  131.                 UartSend(*p++);
  132.         }
  133. }
  134. void main()
  135. {
  136.         unsigned int auto_adjust[8];
  137.         unsigned char i,adjust_flag=0x00;
  138.         UartInit();
  139.         ES = 1;
  140.         EA = 1;
  141. /************************************以下是PWM的初始化********************************/
  142.         i = P_SW2;
  143.         P_SW2 |= 0x80;
  144.         PWMCKS = 0x01;// PWM时钟选择,系统时钟2分频:12MHz,但实际测得的输出是 约2.93kHz
  145.         PWMC = PWM_T;        // PWM计数器,设置PWM周期为0x1000,即4096
  146.        
  147.         PWM0T1 = PWMnT1;
  148.         PWM0T2 = PWMnT2;
  149.         PWM0CR = PWMnCR;
  150.        
  151.         PWM1T1 = PWMnT1;
  152.         PWM1T2 = PWMnT2;
  153.         PWM1CR = PWMnCR;
  154.        
  155.         PWM2T1 = PWMnT1;
  156.         PWM2T2 = PWMnT2;
  157.         PWM2CR = PWMnCR;
  158.        
  159.         PWM3T1 = PWMnT1;
  160.         PWM3T2 = PWMnT2;
  161.         PWM3CR = PWMnCR;
  162.        
  163.         PWM4T1 = PWMnT1;
  164.         PWM4T2 = PWMnT2;
  165.         PWM4CR = PWMnCR;
  166.        
  167.         PWM5T1 = PWMnT1;
  168.         PWM5T2 = PWMnT2;
  169.         PWM5CR = PWMnCR;
  170.                
  171.         PWM6T1 = PWMnT1;
  172.         PWM6T2 = PWMnT2;
  173.         PWM6CR = PWMnCR;
  174.                
  175.         PWM7T1 = PWMnT1;
  176.         PWM7T2 = PWMnT2;
  177.         PWM7CR = PWMnCR;
  178.        
  179.         PWMIF = 0x00;
  180.         PWMCFG &= ~0xc0;
  181.         P_SW2 = i;
  182.         PWMCR = 0x80;                                /*PWM0的控制寄存器,PWM输出使能,初始电平=0,
  183.                                                                                                 P2脚作为PWM功能脚,使能中断,使能T1翻转点中断*/
  184.                                                                                                
  185. /************************************以上是PWM的初始化********************************/
  186.         while (1)
  187.         {
  188.                 if (p)
  189.                 {
  190.                         p=0;
  191.                         auto_adjust[buffer[0]] = buffer[2];
  192.                         auto_adjust[buffer[0]] = (auto_adjust[buffer[0]]<<8) + buffer[1];
  193.                         adjust_flag |= 1<<buffer[0];
  194.                         UartSend(buffer[0]);
  195.                         UartSend((auto_adjust[buffer[0]]>>8));
  196.                         UartSend(((auto_adjust[buffer[0]]<<8)>>8));
  197.                 }
  198.                 _nop_();
  199.                 _nop_();
  200.                 _nop_();
  201.                 UartSend(p);
  202.                 _nop_();
  203.                 _nop_();
  204.                 _nop_();
  205.         }
  206. }


coody 发表于 2017-5-12 23:29 | 显示全部楼层
LZ还没搞好?
我用STC8做的多轴飞控,用了PWM,还用了2个串口,串口1用来调试或数传,串口2用来接收GPS模块,再使用4路(四轴)或6路(六轴)或8路(八轴)PWM控制电机,4路PCA接收遥控信号(PPM信号),姿态计算都是浮点数,飞得很好,并没有发现什么问题。
清风819 发表于 2017-5-13 21:26 | 显示全部楼层
本帖最后由 清风819 于 2017-5-13 21:28 编辑
coody 发表于 2017-5-12 23:29
LZ还没搞好?
我用STC8做的多轴飞控,用了PWM,还用了2个串口,串口1用来调试或数传,串口2用来接收GPS模块 ...

请问你用的哪个型号?频率用到多高?使用串口使用内部RC时钟源吗?

coody 发表于 2017-5-15 00:03 | 显示全部楼层
清风819 发表于 2017-5-13 21:26
请问你用的哪个型号?频率用到多高?使用串口使用内部RC时钟源吗?

我用的是STC8A8K64S4A12 LQFP44,跑24MHZ,使用内部时钟。姿态解算是125HZ,即8ms解算一次,浮点数处理,计算时间(包括I2C读MPU-6050)大约3ms。
 楼主| wfxsgsg 发表于 2017-5-15 13:28 | 显示全部楼层
coody 发表于 2017-5-15 00:03
我用的是STC8A8K64S4A12 LQFP44,跑24MHZ,使用内部时钟。姿态解算是125HZ,即8ms解算一次,浮点数处理, ...

我用的也是STC8A8K64S4A12,LQFP44,D版;内部时钟源24兆赫兹,系统时钟频率是24MHz,PWM采用二分频12MHz,但是,用示波器测得PWM实际频率是2.93kHz,这也是一个小疑问。。那你跑一下我写的这个程序,看看串口能不能通讯?谢谢
 楼主| wfxsgsg 发表于 2017-5-22 12:00 | 显示全部楼层
顶!求助大神,还未解决
dcxq13 发表于 2017-5-23 08:30 | 显示全部楼层
楼主你现在调试的如何了?!是PWM与串口都不工作还是只正常一个?!
 楼主| wfxsgsg 发表于 2017-5-23 09:26 | 显示全部楼层
dcxq13 发表于 2017-5-23 08:30
楼主你现在调试的如何了?!是PWM与串口都不工作还是只正常一个?!

没有进展。目前还是,PWM可以正常工作,串口不能和“stc-isp的串口助手”通讯,串口助手我截了图。C语言代码那里,只要屏蔽 P_SW2 |= 0x80;这条语句,串口就可以正常收发通讯了,可是这条语句对于初始化PWM寄存器是必须的,没了它,PWM就不行了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wfxsgsg 发表于 2017-6-1 11:01 | 显示全部楼层
【结贴啦!】【问题已解决】真正的问题原因,芯片不稳定,8路PWM同时翻转导致单片机崩溃,因此串口也不能用了;解决方法:把每一路的翻转值(PWMnT1和PWMnT2,n=0,1,2....,7)调为不同(相差1即可),单片机就可正常工作。附调试好的代码
  1. #include <STC8.h>
  2. #include <intrins.h>
  3. #define FOSC 24000000UL
  4. #define BRT (65536 - FOSC / 115200 / 4)
  5. #define PWM_T 0x1000        // PWM计数器,设置PWM周期为0x1000,即4096
  6. #define PWMnT1 0x0000        //PWM的0通道T1计数值为0
  7. #define PWMnT2 0x0028        //PWM的0通道T2计数值为0x28
  8. #define PWMnCR 0x85
  9. bit busy,p=0;
  10. char wptr,adjust_flag;
  11. char rptr;
  12. char buffer[4];
  13. void UartIsr() interrupt 4 using 1
  14. {
  15.         if (TI)
  16.         {
  17.                 TI = 0;
  18.                 busy = 0;
  19.         }
  20.         if (RI)
  21.         {
  22.                 RI = 0;
  23.                 buffer[wptr++] = SBUF;
  24.                 wptr &= 0x03;
  25.                 while(!RI);
  26.                 RI = 0;
  27.                 buffer[wptr++] = SBUF;
  28.                 wptr &= 0x03;
  29.                 while(!RI);
  30.                 RI = 0;
  31.                 buffer[wptr++] = SBUF;
  32.                 wptr &= 0x03;
  33.                 wptr = 0x00;
  34.                 p=1;
  35.         }
  36. }
  37. void PWM_Isr() interrupt 22 using 3
  38. {
  39.         unsigned char i;
  40.         i = P_SW2;
  41.         P_SW2 |= 0x80;
  42.         if (PWMCFG & 0x80)
  43.                 PWMCFG &= ~0x80;
  44.         if (PWMIF & 0x80)
  45.         {
  46.                 PWMIF &= ~0x80;
  47.                 if(adjust_flag & 0x80)
  48.                 {
  49.                                                 adjust_flag &= ~0x80;
  50.                 }
  51.         }
  52.         if (PWMIF & 0x40)
  53.         {
  54.                 PWMIF &= ~0x40;
  55.                 if(adjust_flag & 0x40)
  56.                 {
  57.                                                 adjust_flag &= ~0x40;
  58.                 }
  59.         }
  60.         if (PWMIF & 0x20)
  61.         {
  62.                 PWMIF &= ~0x20;
  63.                 if(adjust_flag & 0x20)
  64.                 {
  65.                                                 adjust_flag &= ~0x20;
  66.                 }
  67.         }
  68.         if (PWMIF & 0x10)
  69.         {
  70.                 PWMIF &= ~0x10;
  71.                 if(adjust_flag & 0x10)
  72.                 {
  73.                                                 adjust_flag &= ~0x10;
  74.                 }
  75.         }
  76.         if (PWMIF & 0x08)
  77.         {
  78.                 PWMIF &= ~0x08;
  79.                 if(adjust_flag & 0x08)
  80.                 {
  81.                                                 adjust_flag &= ~0x08;
  82.                 }
  83.         }
  84.         if (PWMIF & 0x04)
  85.         {
  86.                 PWMIF &= ~0x04;
  87.                 if(adjust_flag & 0x04)
  88.                 {
  89.                                                 adjust_flag &= ~0x04;
  90.                 }
  91.         }
  92.         if (PWMIF & 0x02)
  93.         {
  94.                 PWMIF &= ~0x02;
  95.                 if(adjust_flag & 0x02)
  96.                 {
  97.                                                 adjust_flag &= ~0x02;
  98.                 }
  99.         }
  100.         if (PWMIF & 0x01)
  101.         {
  102.                 PWMIF &= ~0x01;
  103.                 if(adjust_flag & 0x01)
  104.                 {
  105.                                                 adjust_flag &= ~0x01;
  106.                 }
  107.         }
  108.         P_SW2 = i;
  109. }
  110. void UartInit()
  111. {
  112.         P_SW1 &= ~0xc0;
  113.        
  114.         /*P3.0是RXD,receive,接收,属于输入模式,所以不能设为强推挽输出*/
  115.        
  116.         P3M0 |= 0x02;
  117.         P3M0 &= ~0x01;
  118.         P3M1 &= ~0x03;//强推挽输出
  119.         SCON = 0x50;
  120.         T2L = BRT;
  121.         T2H = BRT >> 8;
  122.         AUXR = 0x15;
  123.         wptr = 0x00;
  124.         rptr = 0x00;
  125.         TI = 0;
  126. }
  127. void UartSend(char dat)
  128. {
  129.         while (busy);
  130.         busy = 1;
  131.         SBUF = dat;
  132. }
  133. //void UartSendStr(char *p)
  134. //{
  135. //        while (*p)
  136. //        {
  137. //                UartSend(*p++);
  138. //        }
  139. //}
  140. void main()
  141. {
  142.         unsigned int auto_adjust[8];
  143.         unsigned char i,adjust_flag=0x00;
  144.         UartInit();
  145.         ES = 1;
  146.         EA = 1;
  147. /************************************以下是PWM的初始化********************************/
  148.         i = P_SW2;
  149.         P_SW2 |= 0x80;
  150.         PWMCKS = 0x01;// PWM时钟选择,系统时钟2分频:12MHz,但实际测得的输出是 约2.93kHz
  151.         PWMC = PWM_T;        // PWM计数器,设置PWM周期为0x1000,即4096
  152.        
  153.         PWM0T1 = PWMnT1;
  154.         PWM0T2 = PWMnT2+1;
  155.         PWM0CR = PWMnCR;
  156.        
  157.         PWM1T1 = PWMnT1+2;
  158.         PWM1T2 = PWMnT2+3;
  159.         PWM1CR = PWMnCR;
  160.        
  161.         PWM2T1 = PWMnT1+4;
  162.         PWM2T2 = PWMnT2+5;
  163.         PWM2CR = PWMnCR;
  164.        
  165.         PWM3T1 = PWMnT1+6;
  166.         PWM3T2 = PWMnT2+7;
  167.         PWM3CR = PWMnCR;
  168.        
  169.         PWM4T1 = PWMnT1+8;
  170.         PWM4T2 = PWMnT2+9;
  171.         PWM4CR = PWMnCR;
  172.        
  173.         PWM5T1 = PWMnT1+10;
  174.         PWM5T2 = PWMnT2+11;
  175.         PWM5CR = PWMnCR;
  176.                                  
  177.         PWM6T1 = PWMnT1+12;
  178.         PWM6T2 = PWMnT2+13;
  179.         PWM6CR = PWMnCR;
  180.                                  
  181.         PWM7T1 = PWMnT1+14;
  182.         PWM7T2 = PWMnT2+15;
  183.         PWM7CR = PWMnCR;
  184.        
  185.         PWMIF = 0x00;
  186.         PWMCFG &= ~0xc0;
  187.         P_SW2 = i;
  188.         PWMCR = 0x80;                                /*PWM0的控制寄存器,PWM输出使能,初始电平=0,
  189.                                                                                                                                                                                                                                                                                                                                                                         P2脚作为PWM功能脚,使能中断,使能T1翻转点中断*/
  190.                                                                                                                                                                                                                                                                                                                                                                        
  191. /************************************以上是PWM的初始化********************************/
  192.         while (1)
  193.         {
  194.                 if (p)
  195.                 {
  196.                         p=0;
  197.                         auto_adjust[buffer[0]] = buffer[1];
  198.                         auto_adjust[buffer[0]] = (auto_adjust[buffer[0]]<<8) + buffer[2];
  199.                         adjust_flag |= 1<<buffer[0];
  200.                         UartSend(buffer[0]);
  201.                         UartSend((auto_adjust[buffer[0]]>>8));
  202.                         UartSend(((auto_adjust[buffer[0]]<<8)>>8));
  203.                 }
  204.         }
  205. }


datouyuan 发表于 2017-6-1 11:57 | 显示全部楼层
wfxsgsg 发表于 2017-6-1 11:01
【结贴啦!】【问题已解决】真正的问题原因,芯片不稳定,8路PWM同时翻转导致单片机崩溃,因此串 ...

你靠近mcu有没有滤波电容?会不会是由于这原因?
 楼主| wfxsgsg 发表于 2017-6-2 14:41 | 显示全部楼层
datouyuan 发表于 2017-6-1 11:57
你靠近mcu有没有滤波电容?会不会是由于这原因?

真正的原因是这款stc单片机承受不了8路同频同相的PWM运转,导致单片机崩溃(进而包括串口在内的等功能都不能使用了)。解决方法,错开PWM的翻转置。
datouyuan 发表于 2017-6-2 14:51 | 显示全部楼层
wfxsgsg 发表于 2017-6-2 14:41
真正的原因是这款stc单片机承受不了8路同频同相的PWM运转,导致单片机崩溃(进而包括串口在内的等功能都 ...

这原因站不住脚。
 楼主| wfxsgsg 发表于 2017-6-3 09:13 | 显示全部楼层
datouyuan 发表于 2017-6-2 14:51
这原因站不住脚。

真正的原因是,STC8A8K64S4A12,这款单片机是新品,有很多功能还没稳定,目前还在试产阶段。就是芯片不行,芯片不行!我也很无奈
领创电子MCU 发表于 2017-6-5 11:27 | 显示全部楼层
一定要用STC的吗?用华大半导体的M0 或者 昂宝的8位机也可以的     QQ  20328568
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部