STC8H使用ISP中例程,PWM捕获功能获取脉宽进中断异常; | 已解决
本帖最后由 sunshine 于 2024-6-20 13:38 编辑各位,下午好,最近研究一下STC8H单片机捕获PWM脉冲宽度,使用ISP中例程,PWM捕获功能获取脉宽进中断异常;
问题集中表现在为啥进去5次中断后就不再进入了;
后来用仿真的方式将ISP中下载的例程烧入芯片,在中断上打上断点,发现例程也不进入中断;
#include "STC8H.h"
#include "intrins.h"
#include "uart.h"
#include "timer.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define URMD 0 //0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_START 0x40 //ADC起始控制位
#define ADC_FLAG 0x20 //ADC完成标志
void InitADC();
WORD GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
unsigned int ADC1,ADC13,ADC11,ADC10;
unsigned int ADCTMP;
unsigned int ADCTMPs=3;
unsigned int cnt,b=0;
void main()
{
P_SW2 = 0x80;
P1M0 = 0x00; P1M1 = 0x00; //P1设置成输入输出
P3M0 = 0x00; P3M1 = 0x2c; //P3.5P3.2 P3.1设置成高阻采集adc
UartInit();
TimerInit();
// InitADC(); //初始化ADC
PWMA_CCER1 = 0x00;
PWMA_CCMR1 = 0x01; //CC1为输入模式,且映射到TI1FP1上
PWMA_CCMR2 = 0x02; //CC2为输入模式,且映射到TI1FP2上
PWMA_CCER1 = 0x11; //使能CC1/CC2上的捕获功能
PWMA_CCER1 |= 0x02; //设置捕获极性为CC1的下降沿
PWMA_CCER1 |= 0x00; //设置捕获极性为CC2的上升沿
PWMA_CR1 = 0x01; //使能计时器
PWMA_IER = 0x02; //使能CC1捕获中断
EA = 1;
while (1)
{
Delay(2000);
Delay(2000);
Delay(2000);
UartSendStr("time:");
UartSendInt(cnt, 1);
UartSendStr("b:");
UartSendInt(b, 1);
if (PWMA_SR2 & 0x02)
{
PWMA_SR2 =0;
}
}
}
void PWMA_ISR() interrupt 26
{
if (PWMA_SR1 & 0x02)
{
PWMA_SR1 =0;
//PWMA_SR2 =0;
cnt = PWMA_CCR1 - PWMA_CCR2; //差值即为低电平宽度 .
b++;
if(b>65530)
b=0;
}
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 50;
while (x--)
{
}
}
}
用附件例子试试 问题已解决,该问题出现在我设置了定时器,但是没有写定时器中断函数导致;请各位各位坛友在遇到该问题时可以做参考;
(请管理看见该帖帮忙移送至PWM区)
页:
[1]