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

求教PIC16F716的中断及计数问题

[复制链接]
1024|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerryqww|  楼主 | 2015-12-23 12:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有关于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;
}

WEN1111111.png (10.55 KB )

WEN1111111.png
沙发
JY-DX-JY| | 2015-12-23 13:19 | 只看该作者
没看明白。RB0是输入20ms的脉冲吧

使用特权

评论回复
板凳
jerryqww|  楼主 | 2015-12-23 15:15 | 只看该作者
JY-DX-JY 发表于 2015-12-23 13:19
没看明白。RB0是输入20ms的脉冲吧

是的,AD在一定值范围内,RB6输出一定比例脉冲,上面写错了写成RB0了。

使用特权

评论回复
地板
jerryqww|  楼主 | 2015-12-23 15:27 | 只看该作者
jerryqww 发表于 2015-12-23 15:15
是的,AD在一定值范围内,RB6输出一定比例脉冲,上面写错了写成RB0了。

其实简单点说,就是下面这段调用时,怎么会没输出。
if(adnum>=154&adnum<185)        //50%,ask1.
        {               
        
                if(intnum==0)
                {        RB6=1;
                }
                if(intnum==2)
                {        RB6=0;
                }
                if(intnum==4)
                {
                        RB6=1;
                        intnum=0;
                }

使用特权

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

本版积分规则

1

主题

10

帖子

0

粉丝