Опять двацать пять ))) нужна помошь....

И снова я со своими матрицами…
опять же за советом ))


может кто подскажет.
как сделать так что бы данные из массива ну не знаю рендемна как нить брались (ну либо по какому нить событию)
а то тупой перебор массива не сильно впечатляет так сказать (а сделать что то большие мозга пока не хватает))))
соединение матрицы такое же точней та же самая платка еще пока не переделал
вот исходник
спасибо всем…
  • 0
  • 01 мая 2012, 12:12
  • oss

Комментарии (19)

RSS свернуть / развернуть
Эм, в смысле картинку выбирать случайную? )
Ну дык функция генератор псевдослучайных чисел в помощь )
0
  • avatar
  • N1X
  • 01 мая 2012, 12:25
хмм а ченить по проще ))))))
ну не знаю может по таймеру хз куда нить ченить записывала потом из массива брал как нить так
ну что бы разобраться можно было))
0
Измеряй с помощью АЦП что-нибудь с максимальной точностью, главное чтобы в пределы измерения попадало. Последний бит будет самый что ни на есть случайный. Нужно несколько бит — набирай из нескольких измерений.

Заодно скилл АЦП прокачаешь )
0
Крутой прием!!! спасибо за идею!!!
0
Я не совсем понял вопрос. Но может речь идет о том, чтобы менять массив, а потом из него отрисовывать?..
Я делал двойной буфер. То есть имеем два массива одинаковых, оба размером NxM, где N — кол-во строк и M — столбцов. В любой момент времени 1 массив текущий — из него постоянно по прерыванию от таймера отрисовывается картинка (у нас же динамическая индикация), 2 массив в это время можно менять, перерисовывать, в общем, делать с ним что угодно, когда мы перерисовали второй массив как надо (фактически, получили новый кадр), меняем значение переменной, которая обозначает, какой из массивов текущий в данный момент. И все, функция отрисовки в прерывании начинает рисовать из 2 массива, а 1 можно менять.
Чтобы не запоминать, какой текущий и т.п., все это разнесено по функциям. То есть есть функция рисования, которая в зависимости от параметра «текущести» массива меняет именно второстепенный, и функция вывода массива в регистры — которая так же в зависимости от «текущести» выводит текущий массив в регистры.
А так же функция SwapBuffer, которая выставляет флаг о том, что новый массив готов, и можно массивы поменять. Почему бы не поменять сразу, а только через флаг? А потом, что мы закончить рисовать можем посреди отрисовки старого кадра, если так сменить на новый, то у нас отрисуется пол нового кадра — не красиво будет. Поэтому ставим флаг, мол, пора менять буферы, а функция рисования по окончании рисования кадра проверяет, не стоит ли флаг, если стоит, меняет параметр текущести и со следующего кадра уже рисует из другого массива…
>_< жесть, я нифига не умею мысли кратко выражать, извините… Ну уж как умею, надеюсь, что-то да понятно…
0
По поводу генерации ПСЧ (хоть я и не понял, зачем оно вам), вот откопал классику:
algolist.manual.ru/maths/generator/standard.php
algolist.manual.ru/maths/generator/inline.php
Мы такие генераторы программировали на информационной безопасности на лабах :)
Смысл простой: есть функция, которая выдает при вызове новое псевдо-случайное число каждый раз. Но нужно задать какое-то начальное значение. На МК проще всего начальное значение получить, например, с ножек аналоговых входов, не подключенных ни к чему, там такой мусор — в самый раз в общем :)

А вообще в большинтсве сред функции srand (srandom) и rand (random) уже есть в какой-нибудь библиотечке. Их просто надо найти и заюзать.
0
//************************************
// Method:    getRandom
// Returns:   uint8_t
// Qualifier: Генерирует случайное восьмибитное число с помощью АЦП
//************************************
uint8_t getRandom()
{
	uint8_t randNumb = 0;
	ADCSRA =	(1<<ADEN)|		//разрешаем АЦП
				(0<<ADIE)|		//Разрешаем прерывания
				(0<<ADSC)|		//неЗапускаем преобразование (первое, дальше автоматом)
				(0<<ADATE)|		//НЕ Непрерывные последовательные преобразования, одно за другим.
				(7<<ADPS0);		//Делитель частоты на 128.
	
	ADMUX = 0b01000000;
// 	;А тут выбираем откуда брать будем сигнал
// 	;REFS -- 0b[01]000101 первые два бита - напряжение с входа AVCC
// 	;ADLAR --0b01[0]00101следующий бит выравнивание по правому краю
// 	;MUX -- 0b010[00000]</B>Сигнал на вход идет с нулевого канала АЦП.
	
	for (uint8_t i=0; i<8; i++)
	{
		ADCSRA|=0x40;        //запускаем АЦП.
		while ((ADCSRA & 0x10)==0);    //ждем флаг окончания преобразования
		ADCSRA|=0x10;                
		randNumb = randNumb<<1;
		if (ADC & 1<<0))
		{
			randNumb |= 1<<0;
		}
		
	}

	return randNumb;
}

Вот функция, делает 8 измерений для ацп, возвращает рандомное число. Но на его выполнение нужно достаточное время. Поэтому этот генератор случайных чисел я использую только один раз, чтобы засеять функцию рандом.
Для этого подключи
#include <stdlib.h>

Затем один раз при инициализации сделай
srand(getRandom());

И теперь, каждый раз, когда тебе нужно рандомное число — делай так.
0
я снайпер, промазал.
Делай так:
temp = 1+rand() % 4;

где temp примет случайное значение от 1 до 4.
Не трудно догадаться, что
temp = 1+rand() % 100;

даст рандом от 1 до 100.
temp = 2+rand() % 100;

даст рандом от 2 до 102
Ну ты понел) Если хочешь больше инфы по стандартной библиотеке рандомов, то гугли
0
Ах да, забыл сказать сразу. Вверху функция для АЦП Меги 16, извиняй за магические числа, делал по быстрому для себя кое что проверить. Но там все просто. Запускаем единоразовое преобразование ацп и ждем флага.
Пользуйся, удачи.
0
спасибо теперь бы это все вкурить )))
хмм посмотрел гугль… а рендем на асме есть а то я как то Си не оч знаю )))
0
Вот это классический псевдо-рэндом на shift+xor. Перевести его с C на ассемблер, дело трёх минут.
en.wikipedia.org/wiki/Xorshift

Но его всёравно нужно инициализировать неким рэндомным значением сначала. Иначе последовательность будет каждый раз повторяться.
0
сорри — обманул, это был не классический, но интересный. Классические вот en.wikipedia.org/wiki/Linear_feedback_shift_registers
0
спасибо буду мучить )))
0
вот инициализировать как раз с помощью ацп)
0
Да, лучше раз 8 подряд и склеить один-два младших бита в байт/слово. Чтоб экономить время, делать это вообще на старте програмы. Потом просто юзать.
0
где temp примет случайное значение от 1 до 4.
Не трудно догадаться, что
temp = 1+rand() % 100;

даст рандом от 1 до 100.
temp = 2+rand() % 100;

даст рандом от 2 до 102
Ой ли?
0
Если temp = 1+rand() % 100 даст по твоей логике от 1-100, то почему temp = 2+rand() % 100 уже 102?
Хотя мот меня клинит? Сколько будет 4%4?
0
после того, как написал, увидел ошибку, но подумал что это не столь важно)
0
хотя алгоритм есть так что раскурить наверно смогу ))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.