xxkj2010 发表于 2024-1-8 14:55:22

觉得自己玩不了PWM

本帖最后由 xxkj2010 于 2024-1-8 14:57 编辑

参考STC_ISP中的STC8H PWM例程


将测试端口改为P54

#include "reg51.h"
#include "intrins.h"

sfr   P_SW2   =   0xba;
sfr   P5          =         0xc8;
sbit    P54         =         P5^4;
               
#define PWMA_CR1    (*(unsigned char volatile xdata *)0xfec0)
#define PWMA_IER    (*(unsigned char volatile xdata *)0xfec4)
#define PWMA_SR1    (*(unsigned char volatile xdata *)0xfec5)
#define PWMA_ARR    (*(unsignedint volatile xdata *)0xfed2)
#define PWMB_CR1    (*(unsigned char volatile xdata *)0xfee0)
#define PWMB_IER    (*(unsigned char volatile xdata *)0xfee4)
#define PWMB_SR1    (*(unsigned char volatile xdata *)0xfee5)
#define PWMB_ARR    (*(unsignedint volatile xdata *)0xfef2)

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;
sbit    P36   =   P3^6;


void PWMA_Isr() interrupt 26
{
    if (PWMA_SR1 & 0x01)
    {
      PWMA_SR1 &= ~0x01;
      P36 = ~P36;                           //测试端口
    }
}

void PWMB_Isr() interrupt 27
{
    if (PWMB_SR1 & 0x01)
    {
      PWMB_SR1 &= ~0x01;
      P54 = ~P54;                           //测试端口
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P_SW2 = 0x80;
   
    PWMA_ARR = 500;                           //设置PWMA周期为500
    PWMA_IER = 0x01;                            //使能PWMA周期中断
    PWMA_CR1 = 0x01;                            //启动PWMA模块
   
    PWMB_ARR = 800;                           //设置PWMB周期为800
    PWMB_IER = 0x01;                            //使能PWMB周期中断
    PWMB_CR1 = 0x01;                            //启动PWMB模块
   
    EA = 1;

    while (1);
}


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




xxkj2010 发表于 2024-1-9 07:53:37

上面问题已经自行解决,但还是有新的问题。具体等待有空整理发布。

xxkj2010 发表于 2024-1-9 11:59:42

本帖最后由 xxkj2010 于 2024-1-9 12:04 编辑

问题二:

用STC-ISP中的STC8H PWM中断程序修改:
//PWMB 设置
    PWMB_PSCR= 24000-1;                     //分频
    PWMB_ARR = 1000;                           //设置PWMB周期为1000,1秒
    PWMB_IER = 0x01;                            //使能PWMB中断
    PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块

               
}

void PWMB_Isr() interrupt 27
{
    if (PWMB_SR1 & 0x01)
    {
      PWMB_SR1 &= ~0x01;
      LED = ~LED;                           //测试端口
    }
}

void INT0_Isr() interrupt 0
{

      
      
}这样PWMB能正常中断,从而使接在P54的LED灯闪动。

但是如果加入将PWMB影射到某个端口的代码,就不能测试到正常的结果。
//外部中断0设置
                EX0=1;//使能外部中断0
                IT0=1;// 使能 INT0 下降沿中断

//PWMB 设置
    PWMB_PSCR= 24000-1;                     //分频
    PWMB_ARR = 1000;                           //设置PWMB周期为1000,1秒
    PWMB_IER = 0x01;                            //使能PWMB中断
    PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块
                PWMB_ENO=0x40;   //0100 0000,使能 PWM8 输出
                PWMB_PS   =0x40;   //0100 0000,输出到P34
               
}

void PWMB_Isr() interrupt 27
{
    if (PWMB_SR1 & 0x01)
    {
      PWMB_SR1 &= ~0x01;
//      LED = ~LED;                           //测试端口
    }
}

void INT0_Isr() interrupt 0
{
LED = ~LED;                           //测试端口
      
}究竟在哪个环节出错了,请大佬赐教,谢谢!



乘风飞扬 发表于 2024-1-9 13:12:28

xxkj2010 发表于 2024-1-9 11:59
问题二:

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


INT0是P3.2,你有将P3.4输出的PWM信号接到P3.2脚位上吗?

xxkj2010 发表于 2024-1-9 13:29:06

乘风飞扬 发表于 2024-1-9 13:12
INT0是P3.2,你有将P3.4输出的PWM信号接到P3.2脚位上吗?
刚才发现了这个问题,但修改为P33(INT1)也不行
//外部中断设置
                EX1=1;//使能外部中断1
                //IE0=1;//外部中断1中断请求标志
                IT1=1;// 使能 INT1 下降沿中断               
//                IPH=0x04;//PX1H =1;
//                PX1 =1;//外部中断1为最高级

//PWMB 设置
    PWMB_PSCR= 24000-1;                     //分频
    PWMB_ARR = 1000;                           //设置PWMB周期为1000,1秒
    PWMB_IER = 0x01;                            //使能PWMB中断
    PWMB_CR1 = 0x01;                            //计数器向上计数,并启动PWMB模块
                PWMB_ENO=0x10;   //0001 0000,使能 PWM7 输出
                PWMB_PS=0x10;   //0001 0000,输出到P33      
}

void PWMB_Isr() interrupt 27
{
    if (PWMB_SR1 & 0x01)
    {
      PWMB_SR1 &= ~0x01;
//      LED = ~LED;                           //测试端口
    }
}

void INT1_Isr() interrupt 2
{
      LED = ~LED;                           //测试端口      
}

神农鼎 发表于 2024-1-9 14:44:29

先看陈老师的教学视频

xxkj2010 发表于 2024-1-9 14:56:22

本帖最后由 xxkj2010 于 2024-1-9 15:41 编辑

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



神农鼎 发表于 2024-1-9 15:44:38



STC8H系列-高级PWM范例程序下载,2024/1/3 更新 - PWM/144MHz时钟源的PWM/45路PWM+3路CCP/7组不同周期的PWM/DAC - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

xxkj2010 发表于 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 ...

这些早就下载了,等有个完整时间再通读一遍,谢谢!
页: [1]
查看完整版本: 觉得自己玩不了PWM