PIC 1508 TIM1的定时器中断使用

2019-04-15 14:57发布

TIM1有点复杂了,慢慢理吧。先写一篇最简单的TIM1的溢出中断的使用。   花了十分钟,看了数据手册关于溢出中断的部分,写了如下代码 void main()
{
    OSCCON = 0x78;//16M
    __delay_ms(20);
    
    ANSELCbits.ANSC6 = 0;
    TRISCbits.TRISC6 = 0;
    PORTCbits.RC6 = 1;//输出端口
    
    T1CONbits.TMR1CS1 = 0;
    T1CONbits.TMR1CS0 = 1;// Timer1 时钟源为系统时钟 (FOSC)
    T1CONbits.T1CKPS1 = 0;
    T1CONbits.T1CKPS0 = 0;//一分频
    T1CONbits.T1OSCEN = 0;//禁止专用的 Timer1 振荡器电路
    T1CONbits.nT1SYNC = 0;//将异步时钟输入与系统时钟 (F OSC )同步
    T1CONbits.TMR1ON = 1;//使能 Timer1
    
    PIE1bits.TMR1IE = 1;// 允许 Timer1 溢出中断
    PIR1bits.TMR1IF = 0;// Timer1 溢出中断标志清零    保险一点
    INTCONbits.PEIE = 1;//允许所有有效外设中断

    TMR1H = 0xff;
    TMR1L = 0x38;//TIM1保持寄存器  65336
 
    INTCONbits.GIE = 1;//允许所有有效中断
    while(1)
    {
    }
}     void interrupt isr(void)
{
    if(PIR1bits.TMR1IF == 1)
    {
        INTCONbits.GIE = 0;//禁止所有有效中断
        PIR1bits.TMR1IF = 0;// Timer1 溢出中断标志清零
        TMR1H = 0xff;
        TMR1L = 0x38;//TIM1保持寄存器复位
        if(!flag)
        {
            flag = 1;
            PORTCbits.RC6 = 0;
        }
        else
        {
            flag = 0;
            PORTCbits.RC6 = 1;
        }
        INTCONbits.GIE = 1;//允许所有有效中断
    }
}   理论上f=16M/1/(65536-65336)=80K 实际示波器显示只达到60K 主要原因是在中断里面对一个端口进行了处理耗费了一定时间    而且感觉对于这个片子来说,基本已经到达极限了,1508单个片子3块多,以后很不错了。