阔砸 发表于 2024-7-10 14:10

辉芒FT60E121-SOP8 中断问题

PA5触发中断时理应只有BLUE_PIN (PA0) 输出高电平,但实际情况也YELLOW_PIN (PA2)有输出,有没有大佬懂,帮帮小弟
#include "SYSCFG.h"
//***********************宏定义****************************
#define unchar unsigned char
unchar FCount;
unchar ReadAPin;

#define BLUE_PIN PA0
#define WHITE_PIN PA1
#define YELLOW_PIN PA2                //定义输出引脚

#define turn_signal PA5
#define width_signal PA4
volatile unsigned char is_running = 0;
volatilefloat pwm_counter = 0;
#define PWM_PERIOD 10 // PWM周期,根据定时器频率调整
volatilefloat pwm_blue_duty = 0;//占空比
volatilefloat pwm_white_duty = 0;//占空比
volatile unsigned int cycle_count=0;   
volatile unsigned int step=10;
int step1=0;
/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能:中断处理
* 输入:无
* 输出:无
--------------------------------------------------*/
void interrupt ISR(void)
{       
        if (PA5) {
            YELLOW_PIN = 1;
            BLUE_PIN = 0;
            WHITE_PIN = 0;
      }
    if (T0IE && T0IF) {T0IF = 0;}
        if(TMR2IE && TMR2IF)                       
        {
      TMR2IF = 0;

       if (pwm_counter >= PWM_PERIOD) pwm_counter = 0;
       else{pwm_counter+=0.1;}
       if (pwm_blue_duty>PWM_PERIOD){pwm_blue_duty=0;}
        }
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能:上电系统初始化
* 输入:无
* 输出:无
--------------------------------------------------*/       
void POWER_INITIAL (void)
{       
        OSCCON = 0B01110001;        //IRCF=111=16MHz/2=8MHz,0.125us
        INTCON = 0;                        //暂禁止所有中断
        PORTA = 0B00000000;               
        TRISA = 0B00110000;                //PA输入输出 0-输出 1-输入
                                                        //PA4-OUT
                                               
        PORTC = 0B00000000;        
        TRISC = 0B00000000;                //PC输入输出 0-输出 1-输入
                                                               
        WPUA = 0B00110000;            //PA端口上拉控制 1-开上拉 0-关上拉
                                                        //开PA6上拉
        OPTION = 0B00000000;        //Bit3=0 TMR0 MODE,PS=000=TMR0 Rate 1:2

    PSRCA = 0B11111111;                //源电流设置最大
    PSRCC = 0B11111111;
    PSINKA = 0B11111111;    //灌电流设置最大
    PSINKC = 0B11111111;

    MSCON = 0B00110000;                          
    //Bit5:   PSRCAH4和PSRCA共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //Bit4:   PSRCAH3和PSRCA共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
    //Bit3:   UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
    //Bit2:   快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
    //Bit1:          0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
        //Bit0:          当T2时钟不是选择指令时钟的时候
        //                  0:睡眠时停止工作:1: 睡眠时保持工作。       
}
/*----------------------------------------------------
* 函数名称:TIMER0_INITIAL
* 功能:初始化设置定时器
* 相关寄存器:T0CS T0SE PSA
* 设置TMR0定时时长=(1/系统时钟频率)*指令周期*预分频值*255
*                                   =(1/16000000)*2*256*255=8.192ms
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
        OPTION = 0B00000000;
    //Bit5                T0CS Timer0时钟源选择
        //                        1-外部引脚电平变化T0CKI 0-内部时钟(FOSC/2)
        //Bit4                T0CKI引脚触发方式 1-下降沿 0-上升沿
        //Bit3                PSA 预分频器分配位 0-Timer0 1-WDT
        //Bit        PS 8个预分频比 111 - 1:256
        T0IF = 0;                                //清空T0软件中断
}
void TIMER2_INITIAL (void)
{   
    T2CON0= 0B00000001;         //T2预分频1:4,后分频1:1
    //Bit: 定时器2输出后分频比 0000-1:1
    //Bit2:                定时器2输出是能位   0-关闭 1-使能
    //Bit:        定时器2预分频比01-1:4

        T2CON1= 0B00000000;        //T2时钟来自系统时钟,PWM1连续模式
        //Bit4: PWM单脉冲模式选择 0-连续 1-单脉冲
            //Bit3: PWM蜂鸣器模式选择 0-PWM模式 1:蜂鸣器模式       
          //Bit:Timer2时钟源选择 000-指令时钟
                                                   
           TMR2H = 0;                                //TMR2赋值
            TMR2L = 0;

        PR2H = 0;                                 //PR赋值
        PR2L = 200;          

        TMR2IF = 0;                                //清TMER2中断标志
        TMR2IE = 1;                                //使能TMER2的中断(配置成timer定时器时不注释)
        TMR2ON = 1;                                //使能TMER2启动
        PEIE = 1;                            //使能外设中断
        GIE = 1;                                   //使能全局中断
}

void B_UP (void){
        switch(step1)
    {         case 0:{pwm_blue_duty+=0.001;step1=1;}
      break;
                case 1:{if (pwm_counter < pwm_blue_duty) BLUE_PIN = 1;
                                else BLUE_PIN = 0; step1=0;}
                break;
    pwm_counter=0;
        }
}
/*-------------------------------------------------
* 函数名:main
* 功能:主函数
* 输入:无
* 输出:无
--------------------------------------------------*/
void main(void)
{
        POWER_INITIAL();                //系统初始化

        TIMER0_INITIAL();
    TIMER2_INITIAL();

        GIE= 1;                                 //开中断
        T0IE = 1;                                //开定时器/计数器0中断
    TMR2IE = 1;
        while(1)
        {
                       
          B_UP ();
        }
}
页: [1]
查看完整版本: 辉芒FT60E121-SOP8 中断问题