本帖最后由 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;
}
|