大侠救命呀!PICC奇怪的问题!

2020-02-09 11:39发布

我以前是用其他单片机的,对PIC单片机不是很熟悉,应为项目的原因这次要使用PIC16F73和PIC16F74单片机,编辑器是使用PICC9.7  现在我遇到了两个特殊功能寄存器赋值的问题!



第一个问题是在PIC16F74上,我是在中断程序中处理ADC,下面的程序是想循环改变ADC通道,程序中无法通过变量给ADCON0赋值,只能通过立即数给ADCON0赋值,如:

方式1://这种方法是可以的

                 ++AdcChLoop;
                 if (AdcChLoop>7){ AdcChLoop=0; }

                 if (AdcChLoop==0){ ADCON0=0b10000001; }
                 else if (AdcChLoop==1){ ADCON0=0b10001001; }
                 else if (AdcChLoop==2){ ADCON0=0b10010001; }
                 else if (AdcChLoop==3){ ADCON0=0b10011001; }
                 else if (AdcChLoop==4){ ADCON0=0b10100001; }
                 else if (AdcChLoop==5){ ADCON0=0b10101001; }
                 else if (AdcChLoop==6){ ADCON0=0b10110001; }
                 else if (AdcChLoop==7){ ADCON0=0b10111001; }


方式2://这种方法就不行了,无法对ADCON0进行改变(Temp和AdcChLoop都是全局uchar变量)。

                 ++AdcChLoop;
                 if (AdcChLoop>7){ AdcChLoop=0; }

                 if (AdcChLoop==0){ Temp=0b10000001; }
                 else if (AdcChLoop==1){ Temp=0b10001001; }
                 else if (AdcChLoop==2){ Temp=0b10010001; }
                 else if (AdcChLoop==3){ Temp=0b10011001; }
                 else if (AdcChLoop==4){ Temp=0b10100001; }
                 else if (AdcChLoop==5){ Temp=0b10101001; }
                 else if (AdcChLoop==6){ Temp=0b10110001; }
                 else if (AdcChLoop==7){ Temp=0b10111001; }

                ADCON0=Temp;

编译中没有发现任何问题,就是程序下载到单片机后“方式2”就不行了!我也看了“方式2”的汇编代码没有发现什么问题。



第二个问题是在PIC16F73上,我是想改变端口状态,无法通过位操作改变端口引脚,只能通过给整个端口赋值才能改变引脚状态!如:


方式1://这种方法是可以的

        PORTA=0b00100000;//没问题
        PORTA=0b00010000;//没问题

方式2://这3种方法都不行了,
        #define VolumeA123 RA4
        #define VolumeA234 RA5

        PORTA=0b00011000;//不行(注意是两个置为1就不行了)

        VolumeA123=1;//不行

        VolumeA234=1;//不行

在编译和仿真(IDE软件仿真)的时候都没有发现什么问题,就是下载到单片机时出问题,RA4和RA5引脚是悬空的且置为输出状态!




我以前用C51没有遇到过这样奇怪的问题,是不是PICC或者这两款单片机在编程中有什么特殊要处理的地方呢?现在时间比较紧,很急呀!高手们给指点一下!小弟万分感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
wingis
1楼-- · 2020-02-09 17:24
大牛快来哦!自己先顶顶啦!
su_mj000
2楼-- · 2020-02-09 19:13
‘PORTA.4’只能作为输入。
eduhf_123
3楼-- · 2020-02-09 23:04
第一个问题,你的代码写得好复杂……

//该行保留
++AdcChLoop;

//该行改写为:AdcChLoop &= 0x07;
if (AdcChLoop>7){ AdcChLoop=0; }

//以下8行改写为:ADCON0 = 0x81|(AdcChLoop<<3);
if (AdcChLoop==0){ ADCON0=0b10000001; }
else if (AdcChLoop==1){ ADCON0=0b10001001; }
else if (AdcChLoop==2){ ADCON0=0b10010001; }
else if (AdcChLoop==3){ ADCON0=0b10011001; }
else if (AdcChLoop==4){ ADCON0=0b10100001; }
else if (AdcChLoop==5){ ADCON0=0b10101001; }
else if (AdcChLoop==6){ ADCON0=0b10110001; }
else if (AdcChLoop==7){ ADCON0=0b10111001; }

所以,只要些如下3行代码就可以了:
++AdcChLoop;
AdcChLoop &= 0x07;
ADCON0 = 0x81|(AdcChLoop<<3);
另外,可以把上面的“0x81”定义成一个宏,增强代码的可移植性。
zuceyige
4楼-- · 2020-02-10 00:47
mark!
wingis
5楼-- · 2020-02-10 06:24
 精彩回答 2  元偷偷看……
snail0204
6楼-- · 2020-02-10 11:53
用个定时器定时触发中断,切换通道简单明了

一周热门 更多>