打印
[KungFu8位 MCU]

最近遇到的单片机编程小问题

[复制链接]
1266|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiang390625|  楼主 | 2016-11-24 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题一:最近项目里遇到的问题,指向code区数组的指针也要加 code 关键字声明。

比如 unsigned char code arr[30]; 数组,要用指针指向它,要把指针也声明成 unsigned charcode*p;

后来使用发现其它很多地方使用是不需要这样声明的,只要 unsigned char *p;就行了,但是清楚地记得那次确实是要加 code 关键字声明才可以的。

沙发
jiang390625|  楼主 | 2016-11-24 10:15 | 只看该作者
问题二:在51里面,位变量貌似是有限的。

如果要用一个布尔型作为标识变量,为了节省控件可以用 bit 型变量,但是在DRS1000项目中遇到过一次用 bit 型变量出错,改为 unsigned char 型就OK了,那时定义的变量已经很多了,可能是把可以用bit寻址的存储区都用光了吧。

使用特权

评论回复
板凳
jiang390625|  楼主 | 2016-11-24 10:17 | 只看该作者
问题三:用机械开关触发INT中断时:

由于机械开关会震动,产生的电压会有毛刺,这些毛刺会多次触发中断。会造成多次触发的因素有两点:

(1 )开关按下时的震动。第一次低电平到来时会进入中断处理程序,之后就算这些震动在中断处理程序执行的过程中产生,即使进入中断处理程序后关掉了总中断,这些毛刺仍然会使中断标志位置位,会在结束中断处理程序结束后再次马上触发中断处理程序。

(2 )开关释放时的震动。在第一次高电平到来时会退出中断处理程序,之后的毛刺会再次进入中断处理程序。

解决办法:

在中断处理程序的最后加一段低电平等待代码,等待低电平结束再延时5ms(为了消除开关释放时毛刺的干扰),5ms延时结束后再清除中断标志位(在中断处理程序执行的过程中可能已经再次触发了中断标志位)。代码如下:

[cpp] view plain copyvoid int0() interrupt 0

{

/*Do something*/

while(rollRA==0);//等待低电平结束

delay5(1);//等待按键释放的毛刺结束

IE0=0; //清除中断标志位,以防再次进入中断

}

使用特权

评论回复
地板
jiang390625|  楼主 | 2016-11-24 10:28 | 只看该作者
四:对于15系列单片机,在使用串口时必须要指定AUXR寄存器的值,否则程序无**常运行。

这个情况遇到过很多次,15系列单片机只要使用到串口就一定要知名AUXR寄存器的值,不像12系列那样可以把这个寄存器忽略。

在使用15系列单片机时养成了一个习惯:main 函数的第一句让 AUXR=0; ,后面串口在根据需要对其进行初始化。

使用特权

评论回复
5
EthanHen| | 2016-11-24 12:26 | 只看该作者
哥们,,,,,您这讲解的是我们ChipON的MCU吗?

使用特权

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

本版积分规则

个人签名:人生若只如初见 当时只道是寻常。

41

主题

626

帖子

0

粉丝