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