www.open-tager.ru

открытый лазертаг форум
Текущее время: 23 ноя 2024, 23:00

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


В разделе запрещены - обсуждение оборудования не поддерживающего открытых протоколов, реклама и ссылки на готовые продукты лазертага, обсуждение политики производителей и самих производителей. Виден всем.



Начать новую тему Ответить на тему  [ Сообщений: 169 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 17  След.
Автор Сообщение
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 10 янв 2017, 16:17 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Генератор случайных чисел на шумах внутреннего термодатчика.
Код:
uint32_t getTrueRandomNumber(void) {

  ADC_InitTypeDef ADC_InitStructure;

  //enable ADC1 clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  // Initialize ADC 14MHz RC
  RCC_ADCCLKConfig(RCC_ADCCLK_HSI14);
  RCC_HSI14Cmd(ENABLE);
  while (!RCC_GetFlagStatus(RCC_FLAG_HSI14RDY))
    ;

  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO; //default
  ADC_Init(ADC1, &ADC_InitStructure);

  //enable internal channel
  ADC_TempSensorCmd(ENABLE);

  // Enable ADCperipheral
  ADC_Cmd(ADC1, ENABLE);
  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET)
    ;

  ADC1->CHSELR = 0; //no channel selected
  //Convert the ADC1 temperature sensor, user shortest sample time to generate most noise
  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor, ADC_SampleTime_1_5Cycles);

  // Enable CRC clock
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);

  uint8_t i;
  for (i = 0; i < 8; i++) {
    //Start ADC1 Software Conversion
    ADC_StartOfConversion(ADC1);
    //wait for conversion complete
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)) {
    }

    CRC_CalcCRC(ADC_GetConversionValue(ADC1));
    //clear EOC flag
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
  }

  //disable ADC1 to save power
  ADC_Cmd(ADC1, DISABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);

  return CRC_CalcCRC(0xBADA55E5);
}



Пример - случайные числа от 1 до 7
Код:
#define RANDOM_MIN (1)
#define RANDOM_MAX (7)

volatile uint32_t random_num;

random_num = RANDOM_MIN + getTrueRandomNumber()%RANDOM_MAX;

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 10 янв 2017, 18:27 
Не в сети
Аксакал форума

Зарегистрирован: 29 авг 2011, 11:08
Сообщений: 1849
Pingvin писал(а):
Генератор случайных чисел на шумах внутреннего термодатчика. Пример - случайные числа от 1 до 7
А теперь нагреть феном плату и посмотреть не получится ли всегда минимальное или максимальное число 8-)

_________________
"За 2 месяца максимум можно чертёж сделать, еще за 3 фундамент." (c) Номернабис


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 10 янв 2017, 21:22 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
А вот так гораздо проще:
Код:
static unsigned long int next = 1;

int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

void srand(unsigned int seed)
{
    next = seed;
}

Но лучше использовать функции из стандартной библиотеки и не изобретать велосипед самостоятельно.
Ну а хардварные генераторы применяют, только если нужен криптостойкий рандом. Для бытовых применений проще и надежней элементарные алгоритмы


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 11 янв 2017, 16:06 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 27 ноя 2011, 00:22
Сообщений: 1569
Откуда: Україна
Рандом же нужен только при включении, разве нет?
Не проще отслеживать сколько времени удерживается кнопка?

_________________
Нет предела совершенству, но ресурсы заканчиваются быстро.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 11 янв 2017, 21:56 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Pacifist писал(а):
Рандом же нужен только при включении, разве нет?
Не проще отслеживать сколько времени удерживается кнопка?

Понадобится несколько случайных чисел, значит - нужна функция-генератор. Проще всего использовать стандартный rand() из stdlib.h с адресом в качестве сида.
А датчики включаться будут автоматически при включении повязки, никаких кнопок нажимать не нужно


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 21 янв 2017, 19:30 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Новости проекта
Потихоньку доделываю. Библиотека для работы с SSP (протоколом связи со смарт-сенсорами) стала юзабельной. Лежит отдельным репозиторием тут, чтобы было удобно подключать в разные проекты: https://github.com/DAlexis/lasertag-ssp

API для сенсора крайне простой, лежит в ssp-sensor.h ( https://github.com/DAlexis/lasertag-ssp ... sp-slave.h ):
Код:
/* Initialize SSP for slave device */
void ssp_sensor_init(void);

/* Send debug message over SSP.
 * Attention: this function should not be used when more than one device connected to master! */
void ssp_send_debug_msg(char *ptr, int len);

/* Should be called as frequently as possible from main loop or OS thread */
void ssp_sensor_task_tick(void);

/* Returns current state of leds and vibro according to animation tasks received from master */
void ssp_get_leds_vibro_state(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* vibro);

Тут, думаю, понятно по комментам. Чтобы это все работало, нужно реализовать функции-драйвера. В духе "передать буффер по шине", "проверить и получить ИК-сообщение" и т.п. Прототипы этих функций описаны в файле ssp-driver.h ( https://github.com/DAlexis/lasertag-ssp ... p-driver.h ) и в файле ssp-slave-driver.h ( https://github.com/DAlexis/lasertag-ssp ... e-driver.h ). В первом общие для повязки и для сенсора функции, во втором - сенсор-специфичные.

Интерфейс SSP со стороны повязки побольше, файл ss-master.h ( https://github.com/DAlexis/lasertag-ssp ... p-master.h ):
Код:
typedef struct {
   SSP_IR_Buffer buffer;
   SSP_Address sensor_address;
} SSP_IR_Message;

typedef struct {
   SSP_Address address[SSP_MAX_SENSORS_COUNT];
   uint16_t size;
} SSP_Registered_Addrs_List;

/* Initialize SSP for master device */
void ssp_master_init(void);

/* Should be called as frequently as possible from main loop or OS thread */
void ssp_master_task_tick(void);

/* Send IR buffer request to sensor with address specified. Result will be put into queue */
void ssp_push_ir_request(SSP_Address target_device);

/* Get IR buffer from queue and pop it. NULL if no data received */
SSP_IR_Message* ssp_get_next_ir_buffer();

/* Send animation task to sensor by address. Broadcast acceptable */
void ssp_push_animation_task(SSP_Address target, SSP_Sensor_Animation_Task* task);

/* Begin address discovering procedure */
void ssp_start_address_discovering();

/* Get addres discovering status. Non-zero if discovering in process */
uint8_t ssp_is_address_discovering_now();

/* Force stopping address discovering */
void ssp_stop_address_discovering();

/* Non-zero if ssp is busy now. This should be checked before any transmission over SSP */
uint8_t ssp_is_busy();

extern SSP_Registered_Addrs_List ssp_registered_addrs;

Тут тоже в комментариях указано назначение каждой из функций. Нужно реализовать драйвер для мастер-устройства из ssp-master-driver.h ( https://github.com/DAlexis/lasertag-ssp ... r-driver.h )

На данный момент есть все, кроме посылки ИК-сообщения с сенсора. Пока руки не дошли.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 24 янв 2017, 15:36 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Тоже ковыряю платку.
Реализовал прием ИК и передачу.
Взялся за UART - вопросы есть по полудуплексу.

Нужен резистор подтягивающий к +3,3В?
Когда передача происходит, приемник тоже этот пакет ловит?


Смотрю в код - а где инициализация железа?
Как прием/передача реализованы, через прерывания?
Буфер кольцевой?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 25 янв 2017, 18:44 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Запустил сегодня UART.
Порт настроил с подтяжкой к питанию, Open Drain


Да - он ловит свои же пакеты.
Отключать прием на время передачи?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 26 янв 2017, 15:44 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Pingvin писал(а):
Взялся за UART - вопросы есть по полудуплексу.
Нужен резистор подтягивающий к +3,3В?

Внешний резистор я не использую. Ставлю подтяжку на повязке при настройке GPIO, и отключаю подтяжку на сенсорах. Пока работает, но у меня только один сенсор подключен ещё. Вроде не должно быть проблем с любым количеством: главное, чтобы только один МК включал подтяжку.

Pingvin писал(а):
Когда передача происходит, приемник тоже этот пакет ловит?

Это зависит от того, как настроен последовательный порт. Но моя библиотека корректно работает в обоих вариантах, свои пакеты успешно отбрасывает.

Pingvin писал(а):
Смотрю в код - а где инициализация железа?
Как прием/передача реализованы, через прерывания?

В коде библиотеки нет работы с железом, она будет работать через драйвер. То есть пользователь должен, например, реализовать функцию передачи данных:
Код:
void ssp_send_data(uint8_t* data, uint16_t size);

и по получению байта вызывать функцию приема байта:
Код:
void ssp_receive_byte(uint8_t byte);

Так же и некоторые другие функции, см. коммертарии в файлах с заголовками драйвера.
По такому принципу устроены многие библиотеки для микроконтроллеров.

Прием и передача могут быть реализованы через прерывания, код рассчитан на это.
Pingvin писал(а):
Буфер кольцевой?

Смотря какой буфер. Буфер для эффектов - кольцевой, потому что это очередь: эффекты добавляются командами по шине, а извлекаются по мере "проигрывания". Буффер для входящих сообщений по шине линейный, в кольцевом там нет смысла, поскольку нет очереди: сообщения обрабатываются строго по одному (потому что протокол работает по принципу один запрос - один ответ)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Умный датчик. Smart sensor.
СообщениеДобавлено: 26 янв 2017, 19:12 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Цитата:
Это зависит от того, как настроен последовательный порт. Но моя библиотека корректно работает в обоих вариантах, свои пакеты успешно отбрасывает.


А каким образом блокируется прием на время передачи?
Я сегодня экспериментировал.
Запрещал прерывания по приему, дожидался отправки всех символов (счетчиком) и завершения передачи последнего символа (проверкой флагов), затем разрешал прерывания по приёму.
Но если не делать задержку хотя бы небольшую - последний символ отлавливается, бывает.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 169 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 17  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB