打印

关于PIC外部中断,定时器和计数功能问题

[复制链接]
2567|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DFH|  楼主 | 2015-8-1 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个用定时器1设置在50ms时间内产生一个中断, 在50ms的时间内,外部中断一直打开,(上升源脉冲,下降源脉冲中断,这里我接受的信号一直都存在,在50MS内收到的信号远远大于5)一旦出现一次外部中断,NUM++;  在定时器1到达50MS的时候,出现一个中断,里面判断 NUM 的值 如果有大于5的值,那么端口RA0 = 1;如果  NUM==  0  端口RA0 = 0;   

为什么我RA0端口输出的时候会在大概 2S 的时间内出现一个低电平0?     我要的是一直输出高电平1,而且在我没有停止发信号之前 NUM == 0 的可能是不会出现的,到底是为什么啊,来位热心的大神指导一下。


#include <htc.h>

//配置芯片的功能
//__CONFIG(0X3B71);
#define WDTDIS 0x3FFB // 看门狗关闭
#define PWRTDIS 0x3FFF // 上电延时定时器关闭
#define BORDIS 0x3FBF // 低电压复位禁止
#define RC 0x3FFF // RC振荡

//定义某些功能端口
#define LED                LATAbits.LATA0
#define PWM_OUT LATAbits.LATA2
#define PWM_IN  PORTAbits.RA4

int NUM = 0;
volatile unsigned char OutPwmCycle=0x9c,OutPwmDuty=0x06;//确定输出的PWM参数.(默认为脉宽100us,5Hz,1%).

void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty);
void systeminit(void);
void ap_an_init(void);
void init_irq(void);
void interrupt ap(void);
void time_1_init(void);
void init_fosc(void);

int main(void)
{
        //配置
        systeminit();
        init_fosc();
       
        //边缘触发
        init_irq();
        ap_an_init();
        time_1_init();
    //   pwd_out 持续输出;
    pwd_out_init(OutPwmCycle,OutPwmDuty);

//主功能
    while(1)
    {
        }
        return 0;       
}

void interrupt ap(void)
{
        //外部中断函数
        if(IOCIE && IOCIF)
        {
                IOCIF = 0;
                NUM++;       
        }
       
        //定时器中断函数
        if(TMR1IF && TMR1IE)  //产生中断,溢出
    {
                   
         TMR1H = 0Xe7;
            TMR1L = 0X96;     //TMR1赋初值 定时器的定时值清零
        TMR1IF = 0;  //清溢出
        if( 5 < NUM )
        {
                LED = 1;               
        }   
            
            if(0 == NUM)
            {
                        LED = 0;
             }  
        NUM = 0;
    }
}       

void time_1_init(void)
{
   // TMR1CS = 1;     //T1CON<1> 将timer1配置位定时器
      TMR1H = 0Xe7;
      TMR1L = 0X96;     //TMR1赋初值 定时器的定时值清零
      TMR1IF = 0;
      TMR1IE = 1;
      T1CON = 0x31;
    //T1CON  = 0xb0;   //1011 0000 配置位一次16位对Timer1寄存器进行读写 1:8预分频
    //TMR1ON = 1;  // 使能计时器

}       

void init_irq(void)
{
        GIE = 1;  //开始总中断
        PEIE = 1;        //开始外部中断       
}
       
void ap_an_init(void)
{
        IOCIE = 1; //使能电平中断
        IOCAP4 = 1;        //上升源触发使能
        IOCAN4 = 1;
        IOCAF = 0; //清零中断标志位
}       


#if 1
//  PIC12f1822 所有端口的配置方向
void systeminit(void)
{
    TRISAbits.TRISA0 = 0;        // RA0 = out led
    TRISAbits.TRISA1 = 0;        // RA1 = out 开关(负载)
    TRISAbits.TRISA2 = 0;        // RA2 = out 输出一个正弦波
    TRISAbits.TRISA3 = 0;        // RA3 = nc
    TRISAbits.TRISA4 = 1;        // RA4 = in  接受一个峰波
    TRISAbits.TRISA5 = 0;        // RA5 = nc
    LED =0;
}


//配置PWD的首要端口 开关
void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty)
{

        PR2=pwn_cycle;                //设置PWM周期.
        CCPR1L=(unsigned char)((pwm_duty>>2)&0x00ff);                        //設置PWM占空比.
        CCP1CON=(unsigned char)((pwm_duty<<4)&0x0030)|0x0c;       
        T2CON=0x07;                        //启动TMR2.(TMR2预分频比1:4).

}
void init_fosc(void)
{
        OSCCON = 0x6a;//4mhz
}


沙发
DFH|  楼主 | 2015-8-1 11:32 | 只看该作者
来位大神 指导一下  是不是我的配置,还是理解出问题了:dizzy:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

DFH

7

主题

40

帖子

0

粉丝