打印
[PIC®/AVR®/dsPIC®产品]

PIC18单片机中断嵌套问题

[复制链接]
4435|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaorongxing|  楼主 | 2013-8-26 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用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();
                }
}

沙发
yewuyi| | 2013-8-26 13:49 | 只看该作者
直接PWM不就可以了吗?

还搞出啥两个中断干么?MCU的资源很有限的,经不住你这么消耗。。。

使用特权

评论回复
板凳
gaorongxing|  楼主 | 2013-8-26 13:51 | 只看该作者
yewuyi 发表于 2013-8-26 13:49
直接PWM不就可以了吗?

还搞出啥两个中断干么?MCU的资源很有限的,经不住你这么消耗。。。 ...

PWM周期能调的很长吗?(x秒)
如果可以,怎么实现?望指点

使用特权

评论回复
地板
yewuyi| | 2013-8-26 13:53 | 只看该作者
gaorongxing 发表于 2013-8-26 13:51
PWM周期能调的很长吗?(x秒)
如果可以,怎么实现?望指点

这么长的周期?啥东西?


PWM输出的脉冲可以进行若干分频即可得到。

使用特权

评论回复
5
gaorongxing|  楼主 | 2013-8-26 13:57 | 只看该作者
yewuyi 发表于 2013-8-26 13:53
这么长的周期?啥东西?

需求是能够调整脉冲输出周期为几百ms到几秒

我看了分频,最大也就1:16
PWM最大也就几ms的周期,分频也到不了秒

使用特权

评论回复
6
gaorongxing|  楼主 | 2013-8-26 14:04 | 只看该作者

来人求指点

使用特权

评论回复
7
yewuyi| | 2013-8-26 14:20 | 只看该作者
gaorongxing 发表于 2013-8-26 14:04
来人求指点

PWM的时钟频率足够低,PWM的周期就足够长,但MCU的运行速度也就随之变慢

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gaorongxing + 1 赞一个!
8
yewuyi| | 2013-8-26 14:22 | 只看该作者
谁说分频只能到1:16 ?

分频电路是你自己搞的,分频系数当然是由你设计电路保证的啦。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gaorongxing + 1 很给力!
9
gaorongxing|  楼主 | 2013-8-26 14:40 | 只看该作者
yewuyi 发表于 2013-8-26 14:22
谁说分频只能到1:16 ?

分频电路是你自己搞的,分频系数当然是由你设计电路保证的啦。 ...

没有外部分频电路。。

使用特权

评论回复
10
gaorongxing|  楼主 | 2013-8-26 17:10 | 只看该作者
问题我自己解决了。我感觉在这里问了几个问题,到最后都是我自己解决的
解决办法就是用1个time定时器中断实现脉宽可调,周期可调的脉冲输出
输出时间可以调整到很长
办法:
定时器中断产生,计数,当计数到某个值,高低电平转换,然后再计数到某个值,高低电平转换同时清计数

使用特权

评论回复
11
shuidi_wangdan| | 2013-9-13 10:55 | 只看该作者
大哥,你的中断为什么这样写?你用的什么编译器?可以把你书写中断的格式给俺发一份吗?

使用特权

评论回复
12
gaorongxing|  楼主 | 2013-9-13 11:46 | 只看该作者
本帖最后由 gaorongxing 于 2013-9-13 11:48 编辑
shuidi_wangdan 发表于 2013-9-13 10:55
大哥,你的中断为什么这样写?你用的什么编译器?可以把你书写中断的格式给俺发一份吗? ...

这样写是编译器规定的,用的编译器是c18
你可以到网上下载一份c18的用户指南,里面有详细的介绍哦

MPLAB® C18 C编译器用户指南(中文).pdf

1.22 MB

MPLAB® C18 C编译器入门.pdf

1.31 MB

MPLAB® C18 C编译器 函数库.pdf

1.2 MB

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
shuidi_wangdan + 3
13
shuidi_wangdan| | 2013-9-13 11:52 | 只看该作者
gaorongxing 发表于 2013-9-13 11:46
这样写是编译器规定的,用的编译器是c18
你可以到网上下载一份c18的用户指南,里面有详细的介绍哦 ...

谢谢,我现在遇到一个问题,就是使用低级中断和高级中断时程序跑飞,把这两种中断改为一种中断使用就没事了。你能否给指点一下?

使用特权

评论回复
14
gaorongxing|  楼主 | 2013-9-13 11:56 | 只看该作者
使用高低优先级,我记得要在代码里面对应配置各个中断的优先级配置字,你仔细看看是否对应配置好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

118

帖子

0

粉丝