PIC 1508 TIM1的定时器中断使用

TIM1有点复杂了,慢慢理吧。先写一篇最简单的TIM1的溢出中断的使用。
PIC 1508 TIM1的定时器中断使用
文章图片
PIC 1508 TIM1的定时器中断使用
文章图片

PIC 1508 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; //允许所有有效中断
}
}
【PIC 1508 TIM1的定时器中断使用】
理论上f=16M/1/(65536-65336)=80K
实际示波器显示只达到60K
PIC 1508 TIM1的定时器中断使用
文章图片

主要原因是在中断里面对一个端口进行了处理耗费了一定时间而且感觉对于这个片子来说,基本已经到达极限了,1508单个片子3块多,以后很不错了。



    推荐阅读