PIC 1508 TIM1的定时器中断使用

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块多,以后很不错了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值