This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430G2553:随机数生成器

Guru**** 2587365 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/605070/compiler-msp430g2553-random-number-generator

部件号:MSP430G2553

工具/软件:TI C/C++编译器

您好,

我一直在解决这个问题,真的需要别人的帮助。 我正在尝试使用微控制器的浮动引脚1.5 生成一个5位随机数。 我使用记录的ADC10信号的LSB并使用移位寄存器生成5位随机数。 然后将该5位随机数转换为十进制数(0-31),并将P1OUT设置为等于我获得的十进制数。 这是因为我想让WFP 1.0 到WFP 1.4 在随机的时间高一点。 问题是除了WFP 1.2 之外,所有的针脚都很高,而且保持在很高的位置,这根本不是我想要的。 我希望他们在任意时间都能高而低。  

这是我的代码。 我认为我并不是真的生成一个随机数。 请帮助!

#include "msp430G2553.h"
#include <stdint.h>

void ConfigureADC(void)

{
	ADC10CTL1 |= inch_5;//		从WFP读取1.5 ,浮动销
	ADC10CTL0 |= SREF_1 + ADC10ON + ADC10IE
;

			
	
易失性uint8_t A0;//随机存储8位rn = 8位 			//通过5位
的循环易失性uint8_t dec;		//十进制值0-31
易失性uint8_t rem;			//余数
易失性uint8_t base = 1;		//base

void main( void )
{//
停止看门狗计时器
WDTCTL =(WDTPW | WDTHOLD);

//将范围设置为16MHz
BCSCTL1 = CALC1_16MHz;
//将DCO步进和调制设置为16MHz
DCOCTL = CALDCO_16MHz;

P1SEL || 0x40; 	//将WFP 1.6 的特殊功能设置为定时器模块
P1DIR |=0x5F; 	//设置为输出方向
P1OUT |= 0x00; 			//设置为WFP 1.0 On, WFP 1.1 Off

ConfigureADC();

__enable_interrupT();//

启用中断,同时(1){


	ADC10CTL0|= ENC + ADC10SC;	//采样和转换开始
	__bis_sr_register(CPUOFF + GIE);

	//生成5位ADC并转换为十进制数

	while (n !=0)(当[n !=0))
	{

	While (ADC10CTL1和ADC10BUSY);
	A0 = ADC10MEM和0x01;

	IF (A0)
	{// comp. if LSB is 1.
	n-;
	rn ^=(1<<n);
	}
	//如果是,则将LSB =1保存为左移
	//注册RN
	否则,如果(!A0)
	{
	n-;
	rn ^=(0 <<n);
	}
	}
	//如果不是,则将LSB =0保存为左移
	//注册RN


//将5位随机数转换为十进制数 当(RN > 0) { REM = RN % 10; Dec = dec + rem * base; 基数=基数* 2; rn = rn / 10; } 如果(!n) { N = 6; } 如果( dec ) { P1OUT =决定 ;} } }// ADC中断服务例程 #pragma vector = ADC10_vector __interrupt void ADC10_ISR( void ) { __BIC_SR_REGISTER_ON_EXIT(CPUOFF);//返回活动模式 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否确定在1.5 上听到噪音?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道该如何测试。 目前,我认为我有两个主要问题:

    问题1. 二进制到十进制的转换不能正常工作。 我将RN (二进制随机数)设置为1.1111万,返回的十进制数为7 (二进制为111)。 我测试了这个参数,但将P1OUT设置为十进制值,它只能打开WFP 1.0 ,WFP 1.1 和WFP 1.2。  

    问题2. 移位寄存器似乎也不能正常工作。 我使用了一个由5个二进制数字组成的数组,并抓取了每个数字的LSB,而不是使用移位寄存器I将每个LSB乘以1,1.01万,1000和1万,得到一个5位数字。 这种方法工作正常,但当我切换回使用移位寄存器获得5位的方法时,它不起作用,这意味着它不输出预期的值。因此:

    方法1:不起作用

    对于(n=6; n>0; n--)
    {
    int Random [5]={1101, 1011, 1111, 1011, 1101};
    // rn=(随机[0]& 0x01)+(随机[1]& 0x01)*10 +(随机[2]& 0x01)*100 +(随机[3]& 0x01)*1000 +(随机[4]& 0x01)*1万;
    A0 =随机[n]和0x01;
    IF (A0)
    {// comp. if LSB is 1.
    n-;
    rn ^=(1<<n);
    }
    //如果是,则将LSB =1保存为左移
    //注册RN
    否则,如果(!A0)
    {
    n-;
    rn ^=(0 <<n);
    }
    }
    

    方法2:工作

    对于(n=6; n>0; n--)
    {
    Int随机[6]={1101,1011,1111,1011,1101, 1101};
    rn=(随机[0]& 0x01)+(随机[1]& 0x01)*10 +(随机[2]& 0x01)*100 +(随机[3]& 0x01)*1000 +(随机[4]& 0x01)*1万;
    } 

    我想这更多是C++问题。 但你知道我为什么会遇到这些问题吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的问题已解决。 以下是适用于寻求相同产品的任何人的解决方案。

    1.我不需要从二进制转换为十进制,因为我认为数据类型定义为uint,它已经以十进制输出一个值。

    2.我使用了ADC的最后5位,而不是将从浮动引脚的LSB读取的5位结合起来:A0 = ADC10MEM & 0x1F。 示波器上的信号似乎是随机的,适用于我的应用。

    代码如下:

    #include "msp430G2553.h"
    #include <stdint.h>
    
    void ConfigureADC(void)
    
    {
    ADC10CTL1 |= inch_5 + ADC10DIV_3; //从WFP 1.5 读取,浮式引脚
    ADC10CTL0 || SREF_0 + ADC10SHT_3 + ADC10ON + ADC10IE;
    ADC10AE0 |= BIT5;
    }
    
    易失性uint8_t A0 =0; //store ADC bits here
    volatile uint8_t rn = 0;//5 bit random number;
    volatile uint8_t n = 5; //循环通过5位
    
    void main( void )
    {//
    停止看门狗计时器
    WDTCTL =(WDTPW | WDTHOLD);
    
    //将范围设置为1MHz
    BCSCTL1 = CALC1_1MHz;
    //将LDCO步进和调制设置为1MHz
    DCOCTL = CASCTL2
    &=~(divs_3);
    
    0x1F; //设置为输出方向
    P1OUT |= 0x00; //将WFP 1.0 设置为“打开”,将WFP 1.1 设置为“关闭
    
    ”ConfigureADC();
    
    __enable_interrupt ();//启用中断
    
    ,同时(1){
    
    
    __DELAY_CYCLES (1000);
    	ADC10CTL0 |= ENC + ADC10SC;//开始采样和转换
    __bis_sr_register (CPUOFF + GIE );
    
    A0 = ADC10MEM和0x1F;
    P1OUT = A0;
    }//
    
    
    ADC中断服务例程
    #pragma vector = ADC10_vector
    __interrupt void ADC10_ISR( void ){__BIC_SR_register_on_exit(CPUOFF);
    
    //返回活动模式
    }