Вс фев 28, 2021 21:30:27
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
uint16_t adc_get_random(void){
//This is a tricky way to generate a random number.
//First AVCC is selected as reference, and GND is selected as input, the conversion is performed.
//Then the input is changed to Vbg, and WITHOUT ANY DELAY 16 conversions are performed.
//Because of the voltage on the MUX output can't change immediately, random numbers are generated.
ADCSRA = (1 << ADEN) | (0 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); //F_CPU / 64
ADMUX = (0 << REFS1) | (1 << REFS0) | (0 << ADLAR) | 0b1111; //GND as ADC input
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
_delay_us(10);
ADMUX = (0 << REFS1) | (1 << REFS0) | (0 << ADLAR) | 0b1110; //Vbg as ADC input
uint16_t result = 0;
uint8_t tmp;
uint8_t i;
for(i = 0; i < 16; i++){
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
tmp = ADCL;
result <<= 1;
if(tmp & 0x01)
result |= 0x01;
tmp = ADCH;
}
ADCSRA = 0;
return result;
}
//Usage example
int main(void){
//...
srand(adc_get_random());
//...
DDRB = 0xFF;
while(1){
PORTB = rand() & 0xFF;
_delay_ms(1000);
//...
}
}
adc_get_random() ^ seed
Вс фев 28, 2021 21:43:37
не EEPROM, а RAM - после подачи питания она будет содержать случайные биты, а вычисление "контрольной суммы" даст "размазывание" этих битов по "непредсказуемым" позициям в числе, передаваемом в srandWiseLord писал(а):способ с вычитыванием всей памяти EEPROM и получением некоторой "контрольной" суммы
__eeprom int srand_val;
void main(void){
srand(srand_val);
srand_val = rand();
// дальше работа, как задумано
}
не верю! (© Станиславский)*Trigger* писал(а):Случайное число появляется за счёт того, что напряжение на выходе мультиплексора не может измениться мгновенно, и АЦП успевает промежуточные значения между 0 В и напряжением опорного источника
Вс фев 28, 2021 22:05:57
ARV писал(а): с чего бы скорости изменения напряжения внутри МК меняться?!
Вс фев 28, 2021 22:23:37
Вс фев 28, 2021 22:50:12
0x402D 0x8008 0x2000 0x4000 0x8010 0x0800 0x1000 0x0012 0x0000 0x0010 0x8080 0x2040 0x8100 0x8800 0x4000 0x0040 0x0000 0x0000 0x8000 0xCC00 0x8000 0x6000
0xD24B 0x92C1 0x9609 0xB349 0xB249 0xDB2C 0xD96C 0x9249 0x9249 0x9249 0x9249 0x9241 0xD249 0x92C9 0x9249 0x9249 0x9249 0xD92C 0xF92D 0xD96E 0xB24B 0x924B 0x9249 0x1249 0xB249 0x9249 0xD459 0x9249 0xD019 0x9369 0x9249 0x924A
Пн мар 01, 2021 00:42:51
Да, описка. Естественно, RAM имел в виду, как Вы раньше и описывали этот способ.ARV писал(а):не EEPROM, а RAM
Пн мар 01, 2021 11:15:57
Ср мар 03, 2021 05:54:21
__eeprom int srand_val;
void main(void){
srand(srand_val);
srand_val = rand();
// дальше работа, как задумано
}
Ср мар 03, 2021 09:18:34
Serzh2000, а вы не пробовали немного почитать книжки про язык Си и документацию про ваш CVAVR? как можно писать программы, не имея ни малейшего понятия о том, как это делается, что такое язык программирования и из каких частей формируются строки программ?!Serzh2000 писал(а):что тут написано?
здесь всего-навсего описана "переменная" в EEPROM типа int, в которой хранится "стартовое" значение для настройки генератора псевдослучаной последовательностиSerzh2000 писал(а):__eeprom int srand_val;
теперь используетеSerzh2000 писал(а):я не использую EEPROM
оно заносится в "переменную" srand_val вот здесь:Serzh2000 писал(а):откуда случайное число берется?
Serzh2000 писал(а):srand_val = rand();
принципиально ничего не изменится, просто генератор псевдослучайных чисел настроится на некую последовательность "0".Serzh2000 писал(а):нажму стереть EEPROM
даже удивительно! а с самого начала подумать нельзя было?Serzh2000 писал(а):а наверно понял
Чт мар 04, 2021 19:13:30
unsigned char crc = 0;
unsigned char *p_mem = (unsigned char*) 0;
for( i=0; i<MAX_RAM; i++) crc += p_mem[i];
srand(crc);
Ну ё-маё, блин... Вы как программу то пишите ?
Неужели, приведённый мной кусок кода, Вам вообще ни о чём не говорит ? Он же прост, как 2 копейки ...
Serzh2000, а вы не пробовали немного почитать книжки про язык Си и документацию про ваш CVAVR? как можно писать программы, не имея ни малейшего понятия о том, как это делается, что такое язык программирования и из каких частей формируются строки программ?!
Чт мар 04, 2021 22:00:52
Потому что это - протеус. Нужно понимать, что это не железо, и все значения регистров там при включении - не рандомные.Serzh2000 писал(а):затем посмотрел в протеусе число= crc не меняется
Чт мар 18, 2021 20:34:03
Чт мар 18, 2021 22:22:46
Пт мар 19, 2021 08:27:58
Пт мар 19, 2021 09:16:18
//Функция чтения
int16_t read2Byte(uint8_t addr, uint8_t deviceAddr){ // чтение 2 байта по адресу I2C
int16_t data; //16-bit
uint8_t MSB, LSB; //8-bit
i2c_start(); //Кидаем команду "Cтарт" на шину I2C
i2c_write(deviceAddr<<1); //Кидаем на шину адрес INA226 = 10000000
i2c_write(addr); //Кидаем какой регистр хотим читать
i2c_stop();
delay_us(10);
i2c_start();
i2c_write((deviceAddr<<1)+1); //Обращаемся к INA226 в режиме чтения = 10000001
MSB=i2c_read(0); //читаем старший байт
LSB=i2c_read(1); //читаем младший байт
i2c_stop(); //Посылаем команду "Cтоп"
data=MSB;
data = (data << 8)+LSB; //Склеиваем data= data << 8/LSB; или data= word(MSB, LSB);
return data; //Возвращаем значение прочитанного
}
Пт мар 19, 2021 22:55:45
Сб мар 20, 2021 07:44:28
MSB=i2c_read(1); //читаем старший байт
LSB=i2c_read(0); //читаем младший байт
Вт мар 23, 2021 10:31:29
Вт апр 27, 2021 18:01:17
Вс май 16, 2021 09:49:53