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

使能多个中断源后无法进入中断

[复制链接]
2248|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
reverse_L0111|  楼主 | 2016-10-19 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 reverse_L0111 于 2016-10-19 16:57 编辑

TIMER1高优先级中断控制LED闪烁ADC低优先级采集电压
两个功能单独写都能实现,写在一起就不行,LED是常亮的
调试好像主函数里的while循环都没有执行了,请大神们帮忙看看问题出在哪.

#include <p18cxxx.h>
#include "k18.h"
#include "Delay.h"
unsigned int initnum=0;
int result=0;
void InitTimer1();
void interrupt_time1();
void init_ADC();
void interrupt_ADC();

void main(void)
{
   k18_init();/*HL-K18主板初始化*/
   InitTimer1();
   init_ADC();
   TRISD=0X00;/*设置D口为输出*/
   PORTDbits.RD0=1;//初始状态为第一个灯点亮
   COL1=1;/*选通点阵管的第一列的LED,点阵管的第一列的LED作为显示LED*/
   ADCON0bits.GO=1;
while(1)
        {
            if(initnum == 300)   
            {
               initnum=0;
           PORTDbits.RD0=1;        /*点阵管亮或灭*/
           Delay10Ms(100);
           PORTDbits.RD0=0;
        }   
         }
}

void InitTimer1(void)
{        
        T1CON = 0x01;//FOSC/4 = 10M/4
        INTCONbits.GIE=1;//开全局中断
        INTCONbits.PEIE=1;//开外设中断
        PIE1bits.TMR1IE=1;//开TIMER1中断
        IPR1bits.TMR1IP=1;//TIMER1高优先级
        /*10M*1000000/4/8为1s钟次数,定时50ms,则将这个结果除以20即可*/
        TMR1H = (65536-31250)/256;///50ms
        TMR1L = (65536-31250)%256;///50ms
}

void init_ADC(void)
{
        TRISAbits.TRISA0=1;
        ADCON0=0x01;
        ADCON1=0x00;
        ADCON2=0x09;
        INTCONbits.GIE=1;
        INTCONbits.PEIE=1;
        PIR1bits.ADIF=0;//清零标志位
        PIE1bits.ADIE=1;
        IPR1bits.ADIP=0;//AD低优先级        
}

#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
        _asm goto interrupt_time1 _endasm
}
#pragma code InterruptVectorLow=0x18
void InterruptVectorLow (void)
{
        _asm goto interrupt_ADC _endasm
}
#pragma code
#pragma interrupt interrupt_time1
void interrupt_time1()
{      
PIR1bits.TMR1IF=0;
TMR1L=(65536-31250)%256;
TMR1H=(65536-31250)/256;
initnum++;
}
#pragma interruptlow interrupt_ADC
void interrupt_ADC()
{      
PIR1bits.ADIF=0;
result=ADRESH;
result=(result<<8|ADRESL)>>6;
ADCON0bits.GO=1;
}


沙发
NE5532| | 2016-10-19 13:14 | 只看该作者
中断标志能建立么?

使用特权

评论回复
板凳
reverse_L0111|  楼主 | 2016-10-19 16:06 | 只看该作者
NE5532 发表于 2016-10-19 13:14
中断标志能建立么?

time1 可以进中断,AD进不了,源码帖出来了,请版主帮忙看看

使用特权

评论回复
地板
NE5532| | 2016-10-19 16:11 | 只看该作者
PIC16是不支持嵌套的,除非自己清中断标志,你确定18支持嵌套?

使用特权

评论回复
5
reverse_L0111|  楼主 | 2016-10-19 16:16 | 只看该作者
NE5532 发表于 2016-10-19 16:11
PIC16是不支持嵌套的,除非自己清中断标志,你确定18支持嵌套?

好像我搞错了,不是嵌套是多个中断源,设置了优先级的,但是不能正常运行,PIC18应该是可以允许多个中断源的吧

使用特权

评论回复
6
NE5532| | 2016-10-19 16:18 | 只看该作者
允许啊,不允许做来干嘛?只开AD中断可以进去么?

使用特权

评论回复
7
reverse_L0111|  楼主 | 2016-10-19 16:42 | 只看该作者
把AD改为高优先级,只开AD可以进AD中断,
两个中断都打开也只能进AD中断,这时候关闭AD中断发现两个中断都进不了了
貌似只能进高优先级的中断啊,是怎么回事啊

使用特权

评论回复
8
yqdeso| | 2016-10-21 16:19 | 只看该作者
PICF18F的中断有两个中断向量地址,但默认是兼容16F模式的,也就是只有一个中断向量。如果你要使用高低两个向量的中断,请看下面的文字。需要在RCON寄存器置位IPEN。



中断优先级
通过将 RCON 寄存器的 IPEN 位置 1,可使能中断优先
级功能。当使能中断优先级时,兼容模式的 GIE/GIEH
和 PEIE/GIEL 全局中断允许位被 GIEH(高优先级)和
GIEL (低优先级)全局中断允许位替代。当 INTCON
寄存器的 GIEH 位置 1 时,可以允许所有相应的 IPRx
寄存器或 INTCONx 寄存器优先级位置 1 (高优先级)
的中断。当清零时, GIEH 位可以禁止包括低优先级中
断源在内的所有中断源。INTCON 寄存器的 GIEL 位在
清零时,只能禁止相应的优先级位清零(低优先级)的
中断。当置 1 时, GIEL 位可以在 GIEH 位也置 1 时允
许低优先级中断源。
当中断标志位、允许位及相应的全局中断允许 (GIE)
位均被置 1 时,中断将根据中断源的优先级位设置的级
别立即跳转到地址 0008h (高优先级)或 0018h (低
优先级)。也可以通过设置相应的中断允许位来禁止单
个中断。

使用特权

评论回复
9
ayiayihsq| | 2016-11-6 09:50 | 只看该作者
碰到类似问题了,18F45K80,总共有两个中断,一个定时器,一个外部INT2,调试串口发送,发现只要开了定时器中断,进入while()后不循环,不知道死在哪里了,关了定显定时器while()循环正常运行。

使用特权

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

本版积分规则

13

主题

76

帖子

0

粉丝