找回密码
 立即注册
查看: 403|回复: 2

STC8H使用ISP中例程,PWM捕获功能获取脉宽进中断异常; | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-10-14 11:22:58

3

主题

1

回帖

48

积分

新手上路

积分
48
发表于 2024-6-18 17:15:32 | 显示全部楼层 |阅读模式
本帖最后由 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.5  P3.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--)
                {
                }
               
    }
}


截图202406181715131768.jpg







回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-6-18 18:22:47 | 显示全部楼层
用附件例子试试

高级PWMA-捕获模式测量脉冲周期-20240611.zip

8.91 KB, 下载次数: 67

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-10-14 11:22:58

3

主题

1

回帖

48

积分

新手上路

积分
48
发表于 2024-6-20 13:40:57 | 显示全部楼层
问题已解决,该问题出现在我设置了定时器,但是没有写定时器中断函数导致;请各位各位坛友在遇到该问题时可以做参考;
(请管理看见该帖帮忙移送至PWM区)
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 15:36 , Processed in 0.107926 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表