我想用2个timer中断实现脉冲高低电平输出,周期可调,占空比可调
timer0来调整周期(因为需要能够调整周期为x秒)
timer1来调整占空比
部分相关代码在下面,编译没问题,但是运行起来效果不理想,输出不了脉冲,哪个帮我分析分析
#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0; //清除T0中断标志,必须操作
tmr0_flag = 1;
TMR0H = 0x15; //重置定时器初值,这里也是要先TMR0H再L
TMR0L = 0xa0;
}
}
。。。。。
#pragma code
#pragma interrupt low_isr
void low_isr ()
{
if(PIR1bits.TMR1IF == 1)
{
PIR1bits.TMR1IF = 0; //清除T1中断标志,必须操作
tmr1_flag = 1;
TMR0H = 0x35; //重置定时器初值,这里也是要先TMR0H再L
TMR0L = 0xa0;
}
}
#pragma code
。。。。。
static void process(void)
{
if(out1_flag == 1)
{
OpenTimer0( TIMER_INT_ON &
T0_16BIT &
T0_SOURCE_INT&
T0_EDGE_RISE &
T0_PS_1_1 ); //开启配置timer0定时器溢出中断
TMR0H = 0x15;
TMR0L = 0xa0; //先高后低,外部时钟设定为8MHz,定时器定时时间为(0xFFFF-0x3CB0+1)*1μs=25ms
INTCONbits.TMR0IE = 1; //使能TIMER0溢出中断
INTCON2bits.TMR0IP = 1; //使能TIMER0溢出中断高优先级
INTCONbits.TMR0IF = 0; //清除T0中断标志
if(tmr0_flag == 1)
{
tmr0_flag = 0;
Led_3_On();
pulse1_out();
}
}
。。。。。
static void pulse1_out(void)
{
Out1_high();
OpenTimer1( TIMER_INT_ON &
T1_16BIT_RW &
T1_SOURCE_INT&
T1_PS_1_1&
T1_OSC1EN_ON&
T1_SYNC_EXT_OFF );
TMR1H = 0x35; //设定T1的定时初值,这里因为外部时钟设定为
//8MHz,PIC单片机的机器周期为4个时钟周期,即
//0.5μs,定时器定时时间为(0xFFFF-0x3CB0+1)*1μs=25ms
TMR1L = 0xa0; //注意,必须先定义TMR1H,再定义TMR1L。
PIE1bits.TMR1IE = 1; //使能TIMER1溢出中断
IPR1bits.TMR1IP = 0; //使能TIMER1溢出中断高优先级
PIR1bits.TMR1IF = 0; //清除T1中断标志
if(tmr1_flag == 1)
{
tmr1_flag = 0;
Out1_Low();
Led_3_Toggle();
CloseTimer1();
out1_count++;
}
if(out1_count == 200)
{
out1_flag = 0;
out1_count = 0;
CloseTimer0();
}
}
|