首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何在CW环境下产生随机数

如何在CW环境下产生随机数

请问大侠一个问题,这个问题困扰我一周多了:


我目前用S08单片机,在CW环境下,我想每次单片机一上电都产生不同的随机数,但不知道怎么实现好。


如果采用rand();函数,它产生的随机数实际并不是真正意义随即的,也就是我在单片机上电的时候,调用rand();,我监视这个数据,发现每次单片机一上电,第一个数都是相同的。而我需要的就是第一个数要求随机,所以不能通过简单的调用rand()去实现这个功能。


网上有介绍另一个方法,就是用time()函数获得系统时间,然后把它作为随机数种子,然后调用srand(time());这样就可以使单片机每次上电都产生不同的随机数,但是在CW环境下,我#include <time.h>,然后调用time();函数,发现CW环境不认识这个函数。


请问大侠如何解决这个问题 呢?还一个方法就是读RAM中的数据,一上电的时候RAM数据应该都是随即的,但是CW环境下,每次start08.c里面都在系统上电的时候把RAM中的单元都清零了,还有啥办法解决我的问题呢?多谢!

水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
或许可以先读一个随机数,再执行start08.c。
海纳百川  有容乃大
不行啊,关键看怎么先读这个随机数,如果采用读RAM的办法产生随机数,那在Start08.c里先读RAM中的数据,我试验过了,结果看起来就跟单片机老是不停的复位一样,难道读取地址错误?但是我看了手册应该没错的。我读的是0x125的内容,我看手册里在0x100往后的256个字节都是RAM空间,我尝试了几个地址都是不停的复位(出现的现象感觉就是不停的在复位)。
除此之外还有什么好办法呢?
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
应该不是读RAM的问题。关键是读了RAM之后,如何保存这个数,再怎么去执行Start08.c?
海纳百川  有容乃大
我就是不知道怎么去解决啊,哪个大侠用过这方面提示提示或者给个例子参考一下啊。感觉Codewarrior的库很不完善,里面的C函数没Keil的丰富。
哪位高手帮个忙啊,谢了!
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
你现在是怎么做的呢?
海纳百川  有容乃大
我现在有个新的思路,就是在程序里延时一定时间然后读取程序指针(SP),这样应该就是个随机数把(仅取它的低8位字节),但是有个问题,我想读这个指针,怎么读呢?直接读SP行么?
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
我想读程序指针(PC)里面的内容,怎么在C语言底下读到这个寄存器内容呢?谢谢
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
程序里延时一定时间再读取程序指针PC?芯片复位后PC就是固定的,再执行固定的延时程序后PC肯定还是一个确定的值,怎么会是随机的呢?
海纳百川  有容乃大
斑竹,我想试验一下我的想法对不对,我现在就是不知道怎么读取PC的值,好像要嵌入汇编,我知道嵌入汇编用
asm {
}
来实现,但是我在里面加入了汇编好像编译不过去啊,说好像缺少了行号 “:”,另外,我用什么指令可以读取这个PC的值呢?
一共两个问题,能不能帮我解答一下,1)加入汇编为啥编译不过去。2)用什么指令去读取PC的值 。谢谢!(这个方法行不行我都会把试验的结果在反馈上来)
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
可以用以下指令:

asm {
BSR Get_PC_value ;Instruction 1
BRA Done ;Instruction 2
Get_PC_value:
LDHX 1,SP
RTS
Done: ;此时HX中的值即上面“Instruction 2”的PC值,也就是“Instruction 1”的PC值+2
}

海纳百川  有容乃大
谢谢版主,但是还有一个问题,我在C语言里怎么引用HX寄存器中的值呢?
我现在用的是9S08单片机。在汇编中定义一个变量 XDEF ASMData
8位的CW环境不认它,而且应该怎么在C语言中去引用HX中的值呢
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
麻烦版主给解答一下,谢谢
水泡泡
 我的QQ是:52449804 
 我的网站是: www.dyic.com.cn
 欢迎访问和留言跟我联系
可以把HX寄存器的值倒到变量中,在汇编里面定义变量,在C语言中可以用extern的方式应用。关于C和汇编变量相互引用可以看版头中的常见问题列表
可以定义两个字节的变量:

char Value_word_1,Value_word_2;

然后程序可以改为:

asm {
BSR Get_PC_value
BRA Done
Get_PC_value:
LDA 1,SP
STA Value_word_1
LDA 2,SP
STA Value_word_2
RTS
Done:
}
海纳百川  有容乃大
返回列表