有关于PIC16F716的问题请教,情况是:1.RA0是AD输入 2.RB0是20ms的中断源 3.RB6是输出
我的目的是,AD在一定值范围能RB0输出一定比例脉冲,是以20ms中断计数的。1.问题是重新上电RB6偶尔能输出
绝大部分RB6不输出,感觉像中断计数时间停留的短,程序还没这行到intnum==0或1或其它数。intnum值已经过去了。
但是20ms对于程序执行周期几百um还是蛮长的吧,怎么会出现这个情况的?
2.为了验证我加了个emm也是中断计数,直接放在调用的函数里。就没问题,intnum放在if的下个嵌套里就不行。如果把程序改下,= 改成 < 或 > ,就能输出。我想知道我错在哪里?谢谢,不知道说清楚没有。
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3F31);
void delay(uint x);
void init();
void scan();
uint intnum;
uint tenum;
uint adnum;
uint emm;
uint ad;
uint get_ad();
void main()
{
init();
ad=get_ad();
while(tenum<ad)
{
ad=get_ad();
adnum=tenum;
scan();
}
T0IE=0;
while(1)
{
adnum=get_ad();
scan();
}
}
uint get_ad()
{
uint adn;
GODONE=1;
while(GODONE)
adn=ADRES;
return(adn);
}
void init()
{
TRISA=0x0B;
TRISB=0x01;
PORTA=0;
PORTB=0;
OPTION=0x07;
INTCON=0xB0;
ADCON0=0x41;
ADCON1=0x05;
TMR0=100;
delay(10);
tenum=0;
}
void scan()
{
if(adnum>=154&adnum<185) //50%,ask1.
{
if(intnum==0)
{ RB6=1;
}
if(intnum==2)
{ RB6=0;
}
if(intnum==4)
{
RB6=1;
intnum=0;
}
}
/*if(adnum>=154&adnum<185) //50%,ask2.
{
if(intnum<=1)
{ RB6=1;
}
if(intnum>=2)
{ RB6=0;
}
if(intnum>=4)
{
RB6=1;
intnum=0;
}
}*/
if(emm==10) //ask3.
{
emm=0;
RB2=!RB2;
}
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void interrupt INT()
{
if(T0IF==1&&T0IE==1)
{
T0IF=0;
TMR0=100;
tenum++;
}
if(INTF==1&&INTE==1)
{
INTF=0;
intnum++;
emm++;
}
GIE=1;
}
|