Например TDA7294

Форум РадиоКот • Просмотр темы - CodeVision AVR в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 14:34:37

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 8273 ]     ... , , , 410, , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс фев 28, 2021 21:30:27 
Друг Кота
Аватар пользователя

Карма: 81
Рейтинг сообщений: 1377
Зарегистрирован: Пн май 11, 2009 14:15:00
Сообщений: 3059
Откуда: СПб
Рейтинг сообщения: 1
Медали: 1
Мявтор 3-й степени (1)
Предложу ещё один метод, пригодный для МК, в которых есть АЦП. Я его успешно применял в нескольких устройствах, всё работает идеально.

Обычно в AVR при помощи мультиплексора можно подключить вход АЦП к земле или к внутреннему источнику опорного напряжения. При этом никаких внешних цепей не требуется (желательно повесить конденсатор на AREF, но для генерации случайных чисел можно обойтись и без него).

Итак, алгоритм:
1. Настраиваем АЦП (опорное напряжение - AVCC, тактовая частота - лучше побольше, но в пределах допустимого, разрядность 10 бит).
2. Мультиплексором подключаем вход АЦП к земле.
3. запускаем преобразование.
4. Ждём 10 мкс.
5. Переключаем вход на источник опорного напряжения
6. Без каких либо задержек выполняем 16 преобразований подряд, младшие биты результатов собираем в 16-разрядную переменную.
7. Полученное значение используем как аргумент для srand().
8. Выключаем АЦП, чтобы что-нибудь не поломалось в остальном коде, если вдруг он использует АЦП.

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

Пример кода для ATmega8. Для других МК нужно изменить коды входов мультиплексора в соответствии с даташитом.
Код:
#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);
    //...
  }
}


Код для avr-gcc, но изменить под CVAVR его очень легко.

Дополнительно можно скомбинировать этот способ с основанным, например, на начальном состоянии RAM. Достаточно в качестве аргумента srand() указать, например,
Код:
adc_get_random() ^ seed

где seed - случайное число, полученное другим методом.

_________________
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.


Последний раз редактировалось *Trigger* Вс фев 28, 2021 22:06:28, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс фев 28, 2021 21:43:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
WiseLord писал(а):
способ с вычитыванием всей памяти EEPROM и получением некоторой "контрольной" суммы
не EEPROM, а RAM - после подачи питания она будет содержать случайные биты, а вычисление "контрольной суммы" даст "размазывание" этих битов по "непредсказуемым" позициям в числе, передаваемом в srand

для неопытного CVAVR-щика можно делать так:
Код:
__eeprom int srand_val;

void main(void){
  srand(srand_val);
  srand_val = rand();
  // дальше работа, как задумано
}
этот способ более прост и достаточно "непредсказуем".
*Trigger* писал(а):
Случайное число появляется за счёт того, что напряжение на выходе мультиплексора не может измениться мгновенно, и АЦП успевает промежуточные значения между 0 В и напряжением опорного источника
не верю! (© Станиславский)
при одинаковой температуре и влажности вероятность того, что такой способ даст то же самое "случайное" число при неоднократной попытке, весьма велика - с чего бы скорости изменения напряжения внутри МК меняться?!

Добавлено after 5 minutes 40 seconds:
и да, по сравнению с мной предлагаемым вариантом подсчета CRC области RAM, ваш способ гораздо сложнее и неприменим для attiny2313...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс фев 28, 2021 22:05:57 
Друг Кота
Аватар пользователя

Карма: 81
Рейтинг сообщений: 1377
Зарегистрирован: Пн май 11, 2009 14:15:00
Сообщений: 3059
Откуда: СПб
Рейтинг сообщения: 0
Медали: 1
Мявтор 3-й степени (1)
ARV писал(а):
с чего бы скорости изменения напряжения внутри МК меняться?!

Я думаю, тут дело не только скорости нарастания, но и в шумах АЦП, а также работе схемы SAMPLE & HOLD на быстро изменяющемся сигнале.

Накидал простенькую программку для теста. Контроллер - ATmega16.
Спойлер
Код:
/*
  Random seeding with from ADC test
  ATmega16A @ 8 MHz
 */

#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#define BAUDRATE 38400
#define UBRR_VALUE ((F_CPU + BAUDRATE * 8UL)/ (BAUDRATE * 16UL) - 1)

int print_char(char character, FILE *stream)
{
   while ((UCSRA & (1 << UDRE)) == 0) {};

   UDR = character;

   return 0;
}

FILE uart_str = FDEV_SETUP_STREAM(print_char, NULL, _FDEV_SETUP_RW);

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 = (1 << REFS1) | (1 << REFS0) | (0 << ADLAR) | 0b11111; //GND as ADC input
  ADCSRA |= (1 << ADSC);
  while(ADCSRA & (1 << ADSC));
  _delay_us(10);
  ADMUX = (0 << REFS1) | (1 << REFS0) | (0 << ADLAR) | 0b11110; //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;
}

int main(void)
{
  UBRRH = UBRR_VALUE >> 8;
  UBRRL = UBRR_VALUE & 0xFF;
  UCSRA = (1 << UDRE) | (0 << U2X) | (0 << MPCM);
  UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << UPM1) | (0 << UPM0) | (0 << USBS) | (1 << UCSZ1) | (1 << UCSZ0);
  UCSRB = (0 << RXCIE) | (0 << TXCIE) | (0 << UDRIE) | (0 << RXEN) | (1 << TXEN) | (0 << UCSZ2);
  stdout = &uart_str;

  while(1){
    printf_P(PSTR("0x%04X "), adc_get_random());
    ADMUX = 0;
    ADCSRA |= (1 << ADSC);
    while(ADCSRA & (1 << ADSC));
    _delay_ms(1000);
  }

  return 0;
}


Вывод в UART:
Спойлер
Код:
0xFB80 0x0010 0x8000 0x1FF0 0xF800 0xC000 0x9000 0x9000 0xA000 0xA000 0x8000 0x4000 0x9000 0xA000 0xC380 0xA000 0x8000 0x8000 0x4000 0xA000 0xA000 0xC000 0xC000 0x8400 0xC000 0xDC00 0xEEC8 0x1DF8 0xFF80 0x1FE0 0xC003 0xC000 0xCEE0 0xFC70 0x7E00 0xFDC0 0x7DC8 0xC000 0x0000 0xA000 0x8000 0xFDC0 0xC2DC 0xC000 0x4000 0x0100 0xC081 0x01C1 0xE000 0x0000 0x9000 0x8100 0x8800 0x0068 0x0000 0x0000 0xA006 0xC000 0xC000 0x0000 0x8000 0x8000 0x0008 0x0000 0xE380 0x9000 0x0000 0x0000 0x0000 0x1CC0 0xEFC0 0xE623 0x4000 0xDDC0 0xEFA0 0x0004 0x0000 0x0800 0x0080 0x0040 0x0000 0x0000 0x8000 0x8000 0x8000 0x8000 0x9000 0x6000 0x8000 0x2000 0x0800 0x4000 0x8000 0xC000 0x8800 0x0180 0x0000 0xC000 0x0000 0xFBF0 0xFF80 0x0000 0x0000 0xFB80 0xDFF0 0xC7E7 0x4400 0xA000 0xA000 0xC000 0xFF70 0x4000 0x4000 0x8080 0x0000 0xA000 0xC000 0xA000 0x8000 0x1000 0x0000 0x0000 0x0000 0xFFB0 0xFFE0 0x0004 0x0000 0x0000 0x0000 0xFFF3 0x2000 0x2000 0x0000 0x0000 0x0010 0xFB80 0x0000 0xFFF0 0xCE2C 0xCE00 0xC3F7 0xC72C 0xFAC0 0xFD80 0xF9C0 0xC0E0 0xC0C8 0xCFC0 0xDF80 0xC000 0xCEE0 0xC000 0xA000 0xC000 0xC000 0xC0E0 0xC000 0xC700 0xC000 0xC000 0xA000 0xC000 0xC700 0xCD00 0x9000 0xA000 0x8100 0xC000 0x9800 0x0E00 0x0000 0x39C0 0x71C0 0xDC00 0x8000 0x8000 0x8000 0x4000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0xA000 0xFC06 0xFFE2 0xFFE0 0xBE32 0xDC00 0xA000 0x8800 0xC000 0xC000 0xC000 0xC000 0x0040 0x0000 0x4000 0x1000 0x4000 0x0800 0x0100 0x0000 0x0000 0x0800 0x1000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x003F 0x7160 0x1C38 0x0000 0xFFE0 0xC000 0x8000 0xA000 0xA000 0x8000 0xEFC0 0xCEE0 0xC000 0xCD00 0xC000 0x9000 0x9000 0xA000 0x8000 0x9000 0x2000 0x1000 0xA000 0x8000 0x8100 0x8400 0x1000 0x0000 0x0200 0x2000 0x2000 0x0400 0x0002 0x0000 0x0000 0x0000 0x2000 0x4000 0x2000 0x0000 0x0000 0x0000 0x0000 0xFF80 0x3B8E 0xFF80 0x0EFF 0x38E0 0x7FC0 0xE703 0xE3F0 0x03F7 0xE7E0 0xE7D0 0xE380 0xE1F2 0xE700 0x0E38 0x1FF0 0xEE00 0xE7E0 0xFDC0 0xFFB0 0x7700

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

Я проводил эксперименты с RAM, мне не понравилось. Было очень много повторяющихся значений. Триггеры ячеек RAM имеют тенденцию устанавливаться в каком-то одном состоянии при включении, "плавающих" ячеек сравнительно мало.

Для МК без АЦП этот способ непригоден, конечно. Согласен, это недостаток данного метода.

В итоге я использовал описанный метод с АЦП и XORил полученное значение с XOR всех байт RAM.

_________________
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс фев 28, 2021 22:23:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ваш метод лучше протестировать иначе: сделать единственный вывод без цикла, и посмотреть, что будет выводиться при каждом включении питания, ведь именно в этом случае важно иметь начальное случайное число - для первичной инициализации rand

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс фев 28, 2021 22:50:12 
Друг Кота
Аватар пользователя

Карма: 81
Рейтинг сообщений: 1377
Зарегистрирован: Пн май 11, 2009 14:15:00
Сообщений: 3059
Откуда: СПб
Рейтинг сообщения: 1
Медали: 1
Мявтор 3-й степени (1)
Если тестировать с включением питания, то добавятся ещё и разнообразные переходные процессы. Сейчас попробую.

Кстати, неплохие результаты даёт и просто взятие младшего бита при измерении напряжения Vbg с внутренним ИОН:

Спойлер
Код:
/*
  Random seeding with from ADC test
  ATmega16A @ 8 MHz
 */

#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#define BAUDRATE 38400
#define UBRR_VALUE ((F_CPU + BAUDRATE * 8UL)/ (BAUDRATE * 16UL) - 1)

int print_char(char character, FILE *stream)
{
   while ((UCSRA & (1 << UDRE)) == 0) {};

   UDR = character;

   return 0;
}

FILE uart_str = FDEV_SETUP_STREAM(print_char, NULL, _FDEV_SETUP_RW);

uint16_t adc_get_random(void){
  ADCSRA = (1 << ADEN) | (0 << ADATE) | (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); //F_CPU / 64
  ADMUX = (1 << REFS1) | (1 << REFS0) | (0 << ADLAR) | 0b11110; //Vbg as ADC input
  _delay_us(10);
  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;
}

int main(void)
{
  UBRRH = UBRR_VALUE >> 8;
  UBRRL = UBRR_VALUE & 0xFF;
  UCSRA = (1 << UDRE) | (0 << U2X) | (0 << MPCM);
  UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << UPM1) | (0 << UPM0) | (0 << USBS) | (1 << UCSZ1) | (1 << UCSZ0);
  UCSRB = (0 << RXCIE) | (0 << TXCIE) | (0 << UDRIE) | (0 << RXEN) | (1 << TXEN) | (0 << UCSZ2);
  stdout = &uart_str;

  while(1){
    printf_P(PSTR("0x%04X "), adc_get_random());
    ADMUX = 0;
    ADCSRA |= (1 << ADSC);
    while(ADCSRA & (1 << ADSC));
    _delay_ms(1000);
  }

  return 0;
}


Код:
0x3C00 0xFE10 0x3FB3 0x9C2D 0xFFAF 0x3881 0x1FFC 0xE733 0xE43E 0xBBEF 0xE727 0xB403 0xE21F 0x747F 0xA79F 0xF003 0xFDF6 0xE9E6 0x7775 0xF5E9 0x7F7D 0x7EF0 0xBBF9 0x7473 0x2DB7 0x4EEF 0x9DEF 0xEFF7 0x3AD0 0x77BD 0x41F5 0xF9CF 0xFFEE 0xEF0E 0x87D1 0x45F0 0xF7FD 0xF067 0xFFAF 0xB8CB 0xBB5F 0xB4FE 0xF7EE 0x8777 0x438E 0xD7FE 0x9DED 0xBFFE 0xBB4B 0xFFD1 0x5A15 0xF773 0xE087 0xFEF3 0xE011 0xEBFF 0x4773 0x47FF 0xFECB 0x2FFB 0x800D 0x7E7F 0xFCE9 0xFF87 0x8F8F 0xB3ED 0xF070 0x7BB9 0xE89A 0x6403 0x758D 0x7FD2 0x0383 0x8687 0xE9C2 0x7EF8 0x3B90 0xEEA3 0x2E1D 0x04EF 0xEEC6 0xEEE4 0x0F1E 0x800F 0x2E37 0xF64E 0x0EBA 0x7EFB 0x81BF 0xFE6A 0x16BD 0xF6EB 0xFEE0 0x17C3 0x6CF3 0xDBEC 0xEBEE 0xE8F3 0xEE47 0x361A 0xBF1D 0x9BCC 0x87C2 0x5436 0x7B6F 0xF6FD 0x2FC0 0x8FDA 0x41D7 0x0BF8 0x0000 0x0000 0x0000 0xF5F7 0xADDD 0xF627 0x5DC5 0xB2BD 0x9EC8 0xE9CF 0xF1D1 0x7FE7 0x8FEE 0xB877 0xC2F7 0x8EB5 0x8FCE 0x9CEF 0x1E7F 0xBF7F 0x6DB6 0x7F7E 0xB8E9 0xF7B4 0x9F99 0xFFEC 0x87FF 0xF1F8 0xBFFF 0xF726 0x5DEC 0xFF7E 0xF3E9 0xFFCF 0x8FEC 0x9C1E 0x78DB 0xF6FF 0x8E7E 0x8E77 0xD807 0xFFDF 0x81DF 0xFEFE 0x5CEF 0xF9EF 0xEEF2 0x8EBE 0xFED7 0xFEF6 0xFFEE 0xFEF7 0xF721 0xB9CB 0xFE1D 0x9C7F 0xF7EF 0xFEE0 0xB7BD 0x7BB8 0xFFBE 0xE3C3 0x9DDE 0x5B9E 0x6BB7 0x5AF7 0x77F9 0xEEF1 0xB4EB 0x9DAF 0x7F58 0xFE7E 0x7EFF 0x72FD 0x7BF9 0xFFB7 0x877F 0x83F7 0x9CE5 0xFFE7 0x7952 0xF7F1 0xBBFE 0xFE1F 0x5BFF 0x9BEF 0xDFE7 0xFFE6 0xEF70 0xF689 0x877F 0xBEF0 0x8E7E 0x81EC 0x9DDF 0xFFB1 0xBEFE 0x9CFD 0x7FDE 0xE5FA 0xF160 0xFFDF 0xB9EF 0xB9FF 0xEF76 0xF543 0xBB8E 0xB9BC 0x9FFF 0xF3A1 0xF773 0xB7FF 0x80EF 0xF3BD 0x78FE 0xEDEF 0x9FFE 0xFFFF 0xF727 0xF7F1 0xE877 0xF3DF 0xEB8F 0xF747 0x81DC 0xE7FF 0xF6F3 0x7BB9 0x4FF9 0xEBFE 0xF7F1 0x9F5D 0xBFE8 0xFDF0 0xBFEF 0xFDE8 0xB7EB 0x5DFF 0x7DBB 0xDEFF 0xF3FE 0xBF8F 0xB86A 0x7FFF 0xF4E7 0xDB67 0xFD7B 0x7EFF 0x7FF7 0x9BEC 0xBB66 0xFFA7 0xB3ED 0xF3F9 0x5FFF 0xB7C0 0x78E9


Это, наверное, даже лучше варианта с переключением мультиплексора.

Добавлено after 21 minute 6 seconds:
Вот так получается, если вызвать adc_get_random() в исходной версии сразу после подачи питания:
Код:
0x402D 0x8008 0x2000 0x4000 0x8010 0x0800 0x1000 0x0012 0x0000 0x0010 0x8080 0x2040 0x8100 0x8800 0x4000 0x0040 0x0000 0x0000 0x8000 0xCC00 0x8000 0x6000


После добавления задержки в 500 мс после включения и убирания задержки 10 мкс из adc_get_random():
Код:
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


Тут есть довольно широкое поле для экспериментов. Не так важна конкретная реализация, как сам принцип использования АЦП в немного нестандартных режимах для получения случайных чисел.

_________________
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пн мар 01, 2021 00:42:51 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1018
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4875
Откуда: Минск
Рейтинг сообщения: 1
ARV писал(а):
не EEPROM, а RAM
Да, описка. Естественно, RAM имел в виду, как Вы раньше и описывали этот способ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пн мар 01, 2021 11:15:57 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
я пишу в CVAVR... выдает ошибки
Ну ё-маё, блин... Вы как программу то пишите ?
Неужели, приведённый мной кусок кода, Вам вообще ни о чём не говорит ? Он же прост, как 2 копейки ... :facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср мар 03, 2021 05:54:21 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 77
Зарегистрирован: Пт фев 27, 2015 12:00:53
Сообщений: 781
Откуда: Рязанская область
Рейтинг сообщения: 0
спасибо все работает!
но меня мучает вопрос, что тут написано? :facepalm:
для неопытного CVAVR-щика можно делать так:
Код:
__eeprom int srand_val;

void main(void){
  srand(srand_val);
  srand_val = rand();
  // дальше работа, как задумано
}
этот способ более прост и достаточно "непредсказуем".
.

__eeprom - читаем все ячейки ? энергонезависимой памяти
и сохраняем сумму ? в переменной int srand_val;
так?

я не использую EEPROM значит там и ни чего не меняется... откуда случайное число берется?
ну пусть там какой то мусор записан, но он же статичен и не меняется,
а если я в программе AVRDUDE_PROG 3.3 нажму стереть EEPROM то там в ячейки 00 будут и тогда этот метод уже работать не будет? :shock:

а наверно понял это мы записываем в ячейку int srand_val; EEPROM (srand_val = rand();) а потом читаем srand(srand_val); из нее . так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср мар 03, 2021 09:18:34 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Serzh2000 писал(а):
что тут написано?
Serzh2000, а вы не пробовали немного почитать книжки про язык Си и документацию про ваш CVAVR? как можно писать программы, не имея ни малейшего понятия о том, как это делается, что такое язык программирования и из каких частей формируются строки программ?!
Serzh2000 писал(а):
__eeprom int srand_val;
здесь всего-навсего описана "переменная" в EEPROM типа int, в которой хранится "стартовое" значение для настройки генератора псевдослучаной последовательности
Serzh2000 писал(а):
я не использую EEPROM
теперь используете
Serzh2000 писал(а):
откуда случайное число берется?
оно заносится в "переменную" srand_val вот здесь:
Serzh2000 писал(а):
srand_val = rand();
Serzh2000 писал(а):
нажму стереть EEPROM
принципиально ничего не изменится, просто генератор псевдослучайных чисел настроится на некую последовательность "0".
Serzh2000 писал(а):
а наверно понял
даже удивительно! а с самого начала подумать нельзя было?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт мар 04, 2021 19:13:30 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 77
Зарегистрирован: Пт фев 27, 2015 12:00:53
Сообщений: 781
Откуда: Рязанская область
Рейтинг сообщения: 3
Цитата:
unsigned char crc = 0;
unsigned char *p_mem = (unsigned char*) 0;
for( i=0; i<MAX_RAM; i++) crc += p_mem[i];
srand(crc);

я в первый раз не вник в предложенный Вами Аlex вариант простой как "две копейки"
Цитата:
Ну ё-маё, блин... Вы как программу то пишите ?
Неужели, приведённый мной кусок кода, Вам вообще ни о чём не говорит ? Он же прост, как 2 копейки ... :facepalm:

прошил атмегу 8 ... включил выключил и сново включил и так совпало, что звезда с одного итого же луча засветилась
затем посмотрел в протеусе число= crc не меняется это и привело меня к неправильному выводу :facepalm:

по совету ARV
Цитата:
Serzh2000, а вы не пробовали немного почитать книжки про язык Си и документацию про ваш CVAVR? как можно писать программы, не имея ни малейшего понятия о том, как это делается, что такое язык программирования и из каких частей формируются строки программ?!

почитал, подумал, вникнул в суть написанного :roll: прошил ардуино этим кодом и в мониторе порта увидел действительно crc меняется! :))) наверно протеусу не под силу это. :dont_know:

... залил в атмегу 8 все работает как надо спасибо :beer: и прошу прощения за за свою бестолковость :oops:

осталось попробовать третий вариант который предложил *Trigger* :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт мар 04, 2021 22:00:52 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Serzh2000 писал(а):
затем посмотрел в протеусе число= crc не меняется
Потому что это - протеус. Нужно понимать, что это не железо, и все значения регистров там при включении - не рандомные.

Вы, похоже, просто не поняли принцип :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт мар 18, 2021 20:34:03 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн янв 24, 2011 01:51:48
Сообщений: 197
Откуда: Украина, Киев
Рейтинг сообщения: 0
добрый вечер! ткните носом на новую версию CodeVision с таблеткой. что-то я начал наблюдать утечку памяти у этой IDE хочу обновиться


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт мар 18, 2021 22:22:46 
Опытный кот
Аватар пользователя

Карма: 10
Рейтинг сообщений: 77
Зарегистрирован: Пт фев 27, 2015 12:00:53
Сообщений: 781
Откуда: Рязанская область
Рейтинг сообщения: 0
держи, дружище :)))
https://radioaktiv.ru/loads/softf/compi ... r-312.html


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт мар 19, 2021 08:27:58 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн янв 24, 2011 01:51:48
Сообщений: 197
Откуда: Украина, Киев
Рейтинг сообщения: 0
держи, дружище :)))
тонкий подкол. 3.12 - версия 2014 года у меня как раз такая и стоит) http://www.hpinfotech.ro/cvavr-revision3.html


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт мар 19, 2021 09:16:18 
Встал на лапы

Зарегистрирован: Пт мар 19, 2021 08:58:45
Сообщений: 103
Рейтинг сообщения: 0
Народ привет! Сижу ковыряюсь с INA226 хочу подружить с atmega8. Не могу правильно считать старший и младший байт, на логическом анализаторе после чтения старшего байта видно что NACK - как я понимаю нет подтверждения но мастера. Что не так делаю? Особо примеров перед глаза не нашлось...
Код:
//Функция чтения
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;                              //Возвращаем значение прочитанного
}

Перфое фото нет ACK, мой код
Изображение

Второе как отвечает работает библиотека ардуино, данные принимаются адекватные
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт мар 19, 2021 22:55:45 
Родился
Аватар пользователя

Зарегистрирован: Чт авг 27, 2020 13:15:49
Сообщений: 16
Рейтинг сообщения: 0
Может задержка в 10мкС мала?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Сб мар 20, 2021 07:44:28 
Встал на лапы

Зарегистрирован: Пт мар 19, 2021 08:58:45
Сообщений: 103
Рейтинг сообщения: 0
Может задержка в 10мкС мала?

удалось решить проблему, подсказали
Код:
MSB=i2c_read(1);                //читаем старший байт
LSB=i2c_read(0);                //читаем младший байт

все встало на свои места


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вт мар 23, 2021 10:31:29 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн янв 24, 2011 01:51:48
Сообщений: 197
Откуда: Украина, Киев
Рейтинг сообщения: 0
у CVAVR есть аналог __no_init ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вт апр 27, 2021 18:01:17 
Открыл глаза

Зарегистрирован: Вт сен 10, 2019 16:18:33
Сообщений: 64
Рейтинг сообщения: 0
Ребят подскажите,где скачать СodeVision,у которого нет ограничение компиляции в 4кб


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Вс май 16, 2021 09:49:53 
Мучитель микросхем

Зарегистрирован: Вс апр 18, 2021 15:43:55
Сообщений: 422
Рейтинг сообщения: 0
Объясните, пожалуйста, что означают записи такого вида:

TCCR2=(1<<PWM2) | (1<<COM21) | (0<<COM20) | (1<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);

Вроде как регистры содержат шестнадцатеричное число?

Добавлено after 2 minutes 30 seconds:
Аа... наверно можно и восьмибитное число писать? Каждая запись в строчке - это бит? Тогда не понятно откуда взялись буквенные обозначения? Константы?


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8273 ]     ... , , , 410, , , ,  

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y