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;
//允许所有有效中断
}
}
【PIC 1508 TIM1的定时器中断使用】
理论上f=16M/1/(65536-65336)=80K
实际示波器显示只达到60K
文章图片
主要原因是在中断里面对一个端口进行了处理耗费了一定时间而且感觉对于这个片子来说,基本已经到达极限了,1508单个片子3块多,以后很不错了。
推荐阅读
- pic
- PIC定时器中断
- PIC 1508 TIM2的定时器使用
- 浅析PIC单片机定时器
- PIC 1508 TIM1的定时器门控的理解
- PIC 1508 WDT使用
- PIC 1508 EEPROM
- PIC 1508 TIM0的定时器使用
- PIC 1508 DAC使用