loading ...
loading...

2008-02-17 | 2008-01 (13)

标签: 2008-01 

单片机仿真的怪问题
今天调试一个程序,本来这个程序中的子程序是调好的,可是今天用仿真器仿真的时候,出来的数据就是不对,而且有时候每次还不一样?

怪了,检查了半天程序,程序应该是没有问题的,在看看硬件电路吧,去耦也加了,上拉也加了,还是不行...

这时,忽然看到了仿真器上连着的长长的到仿真头的电缆上,因为我这段程序是读一个外部的存储器,写入基本没什么问题,就是读取的时候有毛病,想是不是这根线有问题啊?用万用表量了N次,没有问题?干脆!用粗而短的线,将外部存储器输出口到仿真头直接连了起来....居然好了!....为了进一步验证,烧了芯片,将芯片插上,不用仿真了,也没问题....真是无话可说了,原来原因在这里了,看来是因为仿真头的线太长了,要不就是太细,所以导致数据的不正确!!看来新的那种用JTAG非侵入式在线系统调试仿真还是很有道理的!至少这种问题是不存在的!

...还是老话,如果不是成本的问题,传统的51(89C51一类的)不论从芯片到仿真系统真的都该下岗了,不过还是老话,既然存在就有存在的道理~~~嘿嘿~~~

发表于 2008-01-28 23:19

 

--------------
如何使用89s(c)52的高128ram 续
上次说了那个使用52的时候,如果想使用高128ram,需要使用idata

今天在写一个芯片的驱动的时候,发现如果在延时的子程序中,使用idata的时候,会造成延时时间的不准确,具体原因我没有去找

可能是间接寻址和直接寻址的时间不一样.有时间在找找吧!

发表于 2008-01-26 12:57

 

------------
红外解码
本来打算写个能学习的解码程序,不过发现每次采样的值都有点差别,可能是程序那个地方还需要调整....

刚刚算了算,才发现,我用的93C46(图便宜呀!图便宜!)根本放不下采来的数据...我晕 算了

还是写个专门的吧...首先要知道我的遥控器用的那个型号的编码芯片,找把螺丝刀...开翘...掩膜芯片(一大块黑乎乎的塑胶封装的那种)..靠 !

没办法,只好用数据分析了,网上搜了一下,还真有位朋友做了个红外数据分析的东东,懒的搭电路了,找个最小系统(躺在垃圾里N久了),还不错,查了一下,数据有42位,继续搜,哦 原来是7461的编码芯片,顺便找到了它的数据格式.

开写....

23点,现在差不多了,有时间在试试它的抗干扰能力如何...睡觉!

发表于 2008-01-24 23:05

 

---------------
访问 IIS 元数据库失败
今天准备做个网站,由于N久没有写网站的程序了,所以系统出了点小问题~~

程序编制使用VS.NET2005

我不太习惯使用VS自带的服务端程序,用浏览器打开做好的网页出现了 "访问 IIS 元数据库失败"这个提示.

搜....

以下转来的!

/**********************************************/

装了VS2005再装IIS,结果出了些小问题

  访问IIS元数据库失败

  思考可能是次序出了问题,解决

  1、打开CMD,进入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

  2、输入 aspnet_regiis.exe -i

  稍等片刻,注册成功就解决问题了。

  接着还会出现“未能创建 Mutex”的问题

  解决方法:

  1、先关闭你的VS2005。

  2、打开 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary   

  ASP.NET Files 找到你刚才调试的程序的名字的目录删除它。

  3、关闭IIS服务器,重开一次。

  4、用IE浏览一下你的程序,问题解决

发表于 2008-01-21 19:55

 

--------------
windows安装服务 installer information "无法打开项" 问题
今天清理电脑时,顺便把原来安装的金山杀毒给卸掉了,原因是免费试用期到了~~找来个免费试用30天的NOD32准备装上,等这个试用期到了再换,但是装到注册表项时,提示 "无法打开项  注册表访问权限不够....”.....

真是晕S,刚刚搞定了管理的拒绝访问问题,这又出来个这个问题!在上网搜搜吧!哈哈 没装杀毒软件就上网,算是裸奔了~

找了一圈 有的说 用msiexec.exe重新启动一下regserver就可以了,试验了一下,p用没有!又爬到ms看了一圈帮助,也是p用没有!病毒引起的,这个更是放p,windows安装服务有问题,p!别的调用windows安装服务的安装程序咋没问题!!!!

哎,得 还是自己解决吧!根据提示,注册表访问权限不够?而且是开机自启动那里!HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

那就看看这里吧,打开regeidt,找到run这里,右键-权限~~~吼吼...

这里只有INTERACTIVE这个用户有个特别权限,看看特别权限是个啥,哦 是个应用于只有该项的完全控制权限~~~,看到这里好像明白点了,如果某人用windows服务程序做的安装包,如果安装包的安装权限做的有问题的话,我指的是写入或者控制权限,那可能就会出现这个问题~~(以上安装包的分析,本人纯属瞎掰,欢迎知道的朋友拍砖~~~~),问题找到了,那解决起来就方便多了.

添加everyone用户,然后把完全控制权限给这个用户,关闭注册表,在运行刚才的安装程序,...好了搞定~~

安装好后,因为我不知道这样做会有什么安全问题,因为注册表的这个地方是个很敏感的地方,所以安装完成后,在把everyone这个用户给删除!以后在碰到类似问题,如法炮制~~

发表于 2008-01-18 20:10

 

------------
我的电脑(右键)-管理 "拒绝访问"
今天清理电脑 才发现 右键 我的电脑 管理 提示我 拒绝访问!!!!

上网找了一圈,都说是病毒什么闹的,我的第一感觉,应该不是,我自信我的机器病毒除了自己研究用的文件,感染的可能性很小,因为我很少运行外来不知名的程序,而且机器里东西不是很多,所以我认为那些说什么病毒引起的是找不到根据的瞎说!!!

不过问题总的解决啊!在搜搜了....

终于搜到个正宗的 嘿嘿 以下是转来的~~

以下是 我的电脑->管理 在注册表中的设置

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage]
@=hex(2):40,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,\
  00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,79,00,63,00,6f,00,6d,00,\
  70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,34,00,30,00,30,00,00,\
  00
"SuppressionPolicy"=dword:4000003c

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\command]
@=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,\
  00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,6d,00,63,00,2e,00,65,00,78,00,\
  65,00,20,00,2f,00,73,00,20,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6f,00,\
  6d,00,70,00,6d,00,67,00,6d,00,74,00,2e,00,6d,00,73,00,63,00,00,00

其中command默认的键值为:

%windir%\system32\mmc.exe /s %windir%\system32\compmgmt.msc

如果系统环境变量windir指向的是实际的windows目录则上述表达式没问题,如果是指向其它的环境变量,如:%SystemRoot%,则表达式解释后变为:

%SystemRoot%\system32\mmc.exe /s %SystemRoot%\system32\compmgmt.msc

此类问题是由于第三方软件安装后修改系统环境变量导致(如:Protel),由于windows系统无法自行递归解释环境变量,故上述表达式无效,所以会导致拒绝访问。

解决方案:将系统环境变量中的windir设置为实际的windows根目录位置,如X:\Windows(X表示系统所在的分区)。当然,大家也可以不使用环境变量,不过这样就会导致不通用,而且在其它地方仍会导致同类问题!

列举一些同类问题,参考可用类似的解决方案尝试:

Help and Support服务无法启动(先检查PCHealth文件夹是否完整)

Windows 2003 SP2安装失败(执行到CLADMWIZ.dll失败,在确保杀毒软件及防火墙停止运行的前提下)

......

发表于 2008-01-18 19:35

 

-------------
*** WARNING L15: MULTIPLE CALL TO SEGMENT
说说几个小问题吧,一般我们在用KEIL的时候,只要编译器报

 - 0 Error(s) 一般我们都不去管多少个 Warning(s).了,一般这样程序基本都能运行,但是其实仔细想想,这里还是有问题的,否则编译器没事吃饱了撑得,报什么警告啊~~~

今天来说说*** WARNING L15: MULTIPLE CALL TO SEGMENT这个问题!

其实这个问题应该是引起注意的,有可能引起程序冲突,但是一般时候程序运行不会有问题,但是如果出来问题,那将会是很讨厌的问题.

分析一下 产生这一警告的一个根源是:例如在主循环里调用了一个函数,而在中断服务中,你又一次调用了同样的函数。这样当主循环运行到该函数中时,一旦产生中断,则在中断里又再次调用该函数!而使得该子函数发生了重入,这时,经管概率很低,但是很可能出错!这样,编译器就给出了警告!告诉你*** WARNING L15: MULTIPLE CALL TO SEGMENT ,表达的意思是发生了重入!字面意思自己理解去吧~~~

想要避免这种情况的方法

一.用reentrant使函数重入

关于reentrant的说明:

1,重入函数不能传递bit类型的参数和变量;

2,重入函数建立的是模拟堆栈区,所以不使用一般函数位于存储模式默认空间的可覆盖式堆栈,而是在同一空间从顶端另行分配一个非覆盖式的重入堆栈。

     small  默认空间是 data;

     compact  默认空间是 pdata;

     largr  默认空间是 xdata;

3,由于要保存参数和局部变量,所以会消耗很大的栈空间;尽量少用这种模式;

4、    在同一程序中可以定义和使用不同存储器模式的重入函数,任意模式的重入函数不能调用不同存储器模式的重入函数,但可以调用普通函数。
5、    实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数。


二.如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用

别的方法没研究出来,嘿嘿~~~对了 我建议用第二种方法好点,第一种有些限制,不爽~~

发表于 2008-01-17 15:54

 

--------------
keilc51v8.11a
到网上闲逛,看到keil又TM升级了!

下载

安装

运行

还不错,没看出改进了啥地方 看看升级说明

C51 Version 8.11a Release
[Device Support]

Added: support for Ramtron VRS51L3072 and VRS51L3174.
Added: support for Nordic Semiconductor nRF24LU1.
[Device Simulation]
Added: device support and simulation for SiLABS C8051F336, C8051F337, C8051F338, and C8051F339.
Corrected: PORTx and PCA output pins on SiLABS C8051F12x did not correctly update in simulation.
...太好了 我最喜欢用SiLABS的C8051F系列的单片机居然可以模拟了,哈哈 哈哈~~~~~而且我经常用的120芯片也改了错误! 有的玩了!

就是不知道好不好用!先用用看吧!

软件我放到了 www.xmnetstone.com 我的主页上了!

发表于 2008-01-16 10:38

评论
# 回复: keilc51v8.11a 2008-01-26 11:18:00 陈加力
全英文的不知道怎么用
# 回复: keilc51v8.11a 2008-01-26 12:59:00 啦啦
这一类软件有几个是中文的呢?
汉化的那种有的翻译的还不如英文的呢!
# 回复: keilc51v8.11a 2008-01-31 19:38:00 ff


--------------
51的计算速度不够咋办?
有个复杂的运算,但是等51算完了,得出的数据已经过时了!咋办?

 

 

 

用比较傻的办法吧

matlab仿真,然后把仿真的数据放到数组中,这样快了很多!缺点是范围小,占用本来就很小的flash!

发表于 2008-01-12 11:10

 

---------------
如何使用89s(c)52的高128ram
中午吃完饭,研究了一下昨天没搞明白的问题

首先说一下

51系列的一些单片机仅有128字节的ram 如89c51 地址为00H-7fH

52系列单片机,增加了高128字节的片内ram 如89c52 地址为80H-FFH,但是该范围只能采用间接寻址方式访问

整个片内ram地址范围00H-FFH称为idata区。与idata空间高128字节重叠部分称为特殊功能寄存器区。

而且用keil编译的时候(其他的没用过,不知道)指定了IDATA 类型变量时,系统会帮你分配内存,将data区中未用完的空间继续使用,至到用完在开始使用高字节的128ram

所以如果使用52系列的时候如果低128ram不够用的时候,可以将一些变量定义为为idata,以让keil使用高128ram,在编译就ok了!

以上是本人用的心得,正确与否,欢迎各位拍砖!

发表于 2008-01-10 12:40

 

----------------
*** ERROR L107: ADDRESS SPACE OVERFLOW
昨天碰到的!

*** ERROR L107: ADDRESS SPACE OVERFLOW

写了半天,用keil一编译,报出个这么个东西来!!!

因为一直以来一直在使用C8051F系列的单片机,所以没有碰到这个问题.这几天自己在用89S52写东西,没想到居然碰到了它!哎 RAM太小了!如果不是89S52很便宜,我才不会用它呢!RAM256字节!!!FLASH8K字节!!!落后的东西用着就是不怎么爽~~

没办法,硬件已经做好了,减减变量吧!把能合并的函数合并一下,还好编译通过了.....不过还有个问题就是程序还没有完全写完,不知道剩下点可怜的RAM够不够用!

还有个没搞明白的问题就是明明89S52有256RAM的,可KEIL当编译超过128时就报错呢?听说需要间接寻址才能使用高128位!今天有时间研究一下!我估计是KEIL编译器的问题!

发表于 2008-01-10 11:47

 

--------------
连续写程序啥感觉?
除了累就是还有种成就感~

这几天,因为硬件基本都完成了,样机也做出来了,所以白天在单位写单位的程序,晚上在家里写自己的程序.都是下位机的程序.写了N个函数,看了N个时序图,SPI I2C串行并行,通讯方式真TM多,为啥不弄个统一的点!害得我写完了这个写那个!还好几天下来都完成了.等最后差不多的时候,公布几个吧~

发表于 2008-01-08 23:12

 

----------
指针类型和存储区的关系详解(转)
指针类型和存储区的关系详解
   
一、存储类型与存储区关系

    data     --->    可寻址片内ram
    bdata    --->    可位寻址的片内ram
    idata    --->    可寻址片内ram,允许访问全部内部ram
    pdata    --->    分页寻址片外ram (MOVX @R0) (256 BYTE/页)
    xdata    --->    可寻址片外ram (64k 地址范围)
    code     --->    程序存储区 (64k 地址范围),对应MOVC @DPTR

二、指针类型和存储区的关系

    对变量进行声明时可以指定变量的存储类型如:
    uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。

    同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的
使用如:

    uchar xdata * data pstr

    是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),
可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。

    ......
    uchar xdata tmp[10];    //在外ram区开辟10个字节的内存空间,地址是外ram的0x0000-0x0009
    ......

    第1种情况:

    uchar data * data pstr;
    pstr=tmp;

    首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编
代码:

    MOV 0x08,#tmp(0x00)        ;0x08是指针pstr的存储地址

    看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说
就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的
默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。

    第2种情况:

    uchar xdata * data pstr;
    pstr = tmp;

    这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向
xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。

    MOV 0x08,#tmp(0x00)        ;0x08和0x09是在内ram区分配的pstr指针变量地址空间
    MOV 0x09,#tmp(0x00)

    这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。

    第3种情况:

    uchar xdata * xdata pstr;
    pstr=tmp;

    这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。

    MOV DPTR, #0x000A        ;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
    MOV A, #tmp(0x00)
    MOV @DPTR, A
    INC DPTR
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。

    第4种情况:

    uchar data * xdata pstr;
    pstr=tmp;

    如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分
配到了外ram区了。编译后的汇编代码如下。

    MOV DPTR, #0x000A        ;0x000A是在外ram区分配的pstr指针变量的地址空间
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    第5种情况:

    uchar * data pstr;
    pstr=tmp;

    大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我
来”,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗? 为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51
编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!

    MOV 0x08, #0X01            ;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间
    MOV 0x09, #tmp(0x00)
    MOV 0x0A, #tmp(0x00)

    注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了
呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,
系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。

    第6种情况:

    uchar * pstr;
    pstr=tmp;

    这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。

    MOV DPTR, #0x000A        ;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
    MOV A, #0x01
    MOV @DPTR, A
    INC DPTR
    MOV DPTR, #0x000A
    MOV A, #tmp(0x00)
    MOV @DPTR, A
    INC DPTR
    MOV A, #tmp(0x00)
    MOVX @DPTR, A

    这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。

    小结一下:大家看到了以上的6种情况,其中效率最高的是第2种情况,既可以正确访问ram区又节约了代码,效率最差的是第 6
种,但不是说大家只使用第2种方式就可以了,还要因情况而定,一般说来应用51系列的系统架构的内部ram资源都很紧张,最好大家
在定义函数内部或程序段内部的局部变量使用内ram,而尽量不要把全局变量声明为内ram区中。所以对于全局指针变量我建议使用第
3 种情况,而对于局部的指针变量使用第2种方式。

    C51是很灵活的,也很好理解和使用,但要成为笑傲江湖的一代高手还是要多想多练,没有实际项目的锻炼是不容易提高的。希
望这篇文章对大家一点用处。

 

发表于 2008-01-03 11:06

评论 (0) |  阅读 (?)  |  固定链接 |  类别 (2008) |  发表于 08:43  | 最后修改于 2008-02-17 08:47
您还未登录,只能匿名发表评论。或者您可以 登录 后发表。
*
 
  *中国人爱国心,搜狗输入法爱国主题皮肤下载>>
表  情:
加载中...
回复通知: 同时用小纸条通知对方该回复