【发布时间】:2015-03-27 07:15:14
【问题描述】:
它不会产生预期的随机性。
我认为从像 $66 这样的种子开始并异或最后两个低位和 ror 会给我下一个随机数等等,但它只显示 $B3 并且根本没有改变。
我该如何喂食? random 上面的行显示了 portc 上的数字,因为我希望两个数字一个接一个地显示。
我只使用 avr studio 4 for atmega 8535 at 1Mhz。
> ;Program to random numbers on port C
>
> ;Stack and Stack Pointer Addresses .equ SPH =$3E
> ;High Byte Stack Pointer Address .equ SPL =$3D
> ;Low Byte Stack Pointer Address
>
> .equ RAMEND =$25F ;Stack Address
>
> ;Port Addresses
>
> .equ PORTC =$15 ;Port C Output Address
>
> .equ DDRC =$14 ;Port C Data Direction Register
> Address
>
> .equ numberoneddr=DDRC
>
> .equ numberoneport=portc
>
> .equ numbertwoddr=DDRC
>
> .equ numbertwoport=portc
>
> .equ delayCount=21
>
> .equ random1 =$66
>
> ;Register Definitions
>
> .def numberone =r1 ;Register to store data pointed
> to by Z
>
> .def numbertwo =r2
>
> .def temp =r16 ;Temporary storage register
>
>
>
> reset:
>
> ; initialize stack pointer. Done automatically at reset on many AVRs
>
> ldi temp, low (RAMEND)
>
> out spl, temp
>
> ldi temp, high (RAMEND)
>
> out sph, temp
>
>
>
>
> ;port initialisation
>
> ldi temp,$FF
>
> out numberoneddr,temp
>
> out numberoneport,temp
>
> out numbertwoddr,temp
>
> out numbertwoport,temp
>
>
>
> ;Program Initialisation
>
> ldi temp,$66
>
> rcall random
>
> mov numberone, temp
>
> out numberoneport,numberone
>
> rcall random
>
> mov numbertwo, temp
>
> out numberoneport,numbertwo
>
>
>
>
> random: mov r19,temp
>
> ldi r17, 0x01
>
> eor r19,r17
>
> ror r19
>
> mov temp,r19
>
> ret
>
>
>
> delay:
> clr r20
>
> clr r21
>
> ldi r22, delayCount
>
> loopDelay:
>
> dec r20
>
> brne loopDelay
>
> dec r21
>
> brne loopDelay
>
> dec r22
>
> brne loopDelay
>
> ret
【问题讨论】:
-
对源代码使用代码块(或按 4 个空格),添加更多信息,例如什么 MCU,到底出了什么问题,...您的代码在 PC 上工作吗?如果不尝试跟踪它出了什么问题……并在它工作时移植到 MCU asm。如果您的 MCU 上有断点/跟踪功能,那么您可以跳过 PC 部分。现在,您的问题实际上是为什么这段代码不起作用,这是题外话,所以现在投票关闭
-
它不会产生预期的随机性,我从像 $66 这样的种子开始教,然后异或最后两个低位和 ror 会给我下一个随机数等等,但它只显示 $B3 和完全没有任何帮助,我只使用 avr studio 4 for atmega 8535 at 1Mhz
-
你在每次随机调用时都喂
temp=$66,所以结果总是一样的......你应该只喂一次临时。我还会添加一个比特交换(不仅仅是ror),它通常会带来更好的随机性。还有random:标签上面的 3 行是做什么的...它们没有在call random上执行!!! -
我对播种位有点困惑,请你帮忙解释一下我是如何在不使用温度的情况下喂食的。 random 上面的行显示了 portc 上的数字,因为我希望两个数字一个接一个地显示
-
在程序初始化时执行
ldi temp,$66并将其从随机子程序中删除。 temp 也是一个坏名字......当你的程序增长时,尝试将它重命名为random_tmp例如