觉得自己玩不了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 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; //测试端口
}究竟在哪个环节出错了,请大佬赐教,谢谢!
xxkj2010 发表于 2024-1-9 11:59
问题二:
用STC-ISP中的STC8H PWM中断程序修改:
INT0是P3.2,你有将P3.4输出的PWM信号接到P3.2脚位上吗? 乘风飞扬 发表于 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; //测试端口
}
先看陈老师的教学视频 本帖最后由 xxkj2010 于 2024-1-9 15:41 编辑
PWMB能产生中断了(这个已经测试),现在的问题是将PWMB脉冲影射到IO口就无法到达需要的p33引脚,检查多次,寄存器PWMB_PS设置尚未发现问题。
STC8H系列-高级PWM范例程序下载,2024/1/3 更新 - PWM/144MHz时钟源的PWM/45路PWM+3路CCP/7组不同周期的PWM/DAC - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎 发表于 2024-1-9 15:44
STC8H系列-高级PWM范例程序下载,2024/1/3 更新 - PWM/144MHz时钟源的PWM/45路PWM+3路CCP/7组不同周期的P ...
这些早就下载了,等有个完整时间再通读一遍,谢谢!
页:
[1]