sunshine 发表于 2024-6-18 17:15:32

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--)
                {
                }
               
    }
}










乘风飞扬 发表于 2024-6-18 18:22:47

用附件例子试试

sunshine 发表于 2024-6-20 13:40:57

问题已解决,该问题出现在我设置了定时器,但是没有写定时器中断函数导致;请各位各位坛友在遇到该问题时可以做参考;
(请管理看见该帖帮忙移送至PWM区)
页: [1]
查看完整版本: STC8H使用ISP中例程,PWM捕获功能获取脉宽进中断异常; | 已解决