打印

救命啊!奇怪的PICC问题

[复制链接]
2803|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wingis|  楼主 | 2010-4-13 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我以前是用其他单片机的,对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或者这两款单片机在编程中有什么特殊要处理的地方呢?现在时间比较紧,很急呀!高手们给指点一下!小弟万分感谢!
沙发
wingis|  楼主 | 2010-4-13 20:01 | 只看该作者
自己顶一顶!高手快来呀!

使用特权

评论回复
板凳
xymxym| | 2010-4-14 09:10 | 只看该作者
1。把优化等级设低一点
2。使用低版本的PICC,比如8.50,完全适用你的这种单片机。

这种肯定不行,标准的C不支持位操作。51的位操作是非标的
VolumeA123=1;//不行
VolumeA234=1;//不行

PORTA=0b00011000;//不行(注意是两个置为1就不行了)
你上面说都是编译正常,但无法运行,建议你看一下数据手册,很多PIC单片机的RA口只有4位的。还有如果带有AD复用的I/O口,特别是RA,要把相应的I/O口设成数字的,因为它默认是模拟口,否则会死得很惨!!!:lol

最后着重提醒你,要认真看数据手册,很多硬件的操作关联的资源比较离散,欲速则不达。有空看看PIC-C,跟51还是有蛮大差别的!

使用特权

评论回复
地板
wingis|  楼主 | 2010-4-14 11:59 | 只看该作者
我没有设置优化等级,是默认的好像是9,低版本的PICC倒是没有试。
你上面说标准的C不支持位操作那在PICC中进行位操作总不会用PORTA=0b00100000;这种方法吧!而且情况是就这两个口有问题(RA4,RA5),其他的口位操作正常!
那个ADCON0真是老火!ADCON0=ADCON0|0b10001001;的方法也不行。

使用特权

评论回复
5
xymxym| | 2010-4-14 14:14 | 只看该作者
哈哈,不好意思,早上看错了,那样位赋值是可以的,只不过虽然是位操作,但实际单片机是对整个口进行读-修改-写的操作,这个去看其它文档介绍!

应该是ADCON1,把它设成0x07

接触一种新单片机,注定要绕点弯路,吃点苦的,要有心理准备,心急吃不了热豆腐!

使用特权

评论回复
6
wingis|  楼主 | 2010-4-14 15:34 | 只看该作者
第一个问题已经解决了!
   谢谢“xymxym”的解答!现在发现这个原因是这个单片机ADC通道切换要延时才行!现在的代码给大家贴出来看看!

AdcChLoop = AdcChLoop+0X08;  
if (AdcChLoop > 0XB9){ AdcChLoop = 0X81; }
ADCON0 = AdcChLoop;


因为是两个不同的项目所以第二个问题还没有来得及解决,我自己再努力努力先!

使用特权

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

本版积分规则

17

主题

132

帖子

1

粉丝