Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2019, 19:34   #1
Marcus75
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 15
По умолчанию Неправильно работает функция rand() на микроконтроллере ATMEGA328P

Добрый день, неправильно работает функция rand(). Должно генерироваться число от 1 до 12, но вместо этого всегда генерируется число 6.
Код:
int main(void)
{
    DDRB = 0x3F;
    PORTB = 0;
    DDRC = 0x3F;
    PORTC = 0;
    
    while (1)
    {
        srand(time(NULL));
        int r = rand() % 12;
        for (int i = 0; i < r; i++)
        {
            if(i<6)
            {
                PORTB |= (1 << i);
                _delay_ms(300);
                PORTB &= ~(1<<i);
            }
            else
            {
                PORTC |= (1 << (i-6));
                _delay_ms(300);
                PORTC &= ~(1<<(i-6));
            }
        }
    }
}
Marcus75 вне форума Ответить с цитированием
Старый 18.02.2019, 12:32   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

У вас там RTC к микроконтроллеру подключен? Я бы не стал закладываться на time(), понятия не имею, что именно возвращает time() при отсутствии RTC.. Но в любом случае инициализировать ГСЧ через srand на каждой итерации - плохая идея
Black Fregat вне форума Ответить с цитированием
Старый 01.03.2019, 12:32   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 754
По умолчанию

Цитата:
Сообщение от Marcus75 Посмотреть сообщение
Код:
rand() % 12;
- так будет генерироваться от 0 до 11, а не от 1 до 12, как Вы хотели.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 01.03.2019, 13:33   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,350
По умолчанию

Вынесите srand за тело цикла.
waleri вне форума Ответить с цитированием
Старый 12.11.2019, 06:36   #5
MalaTang
Новичок
Джуниор
 
Регистрация: 11.11.2019
Сообщений: 1
По умолчанию

Микроконтроллер (ATSAMC21-XPRO):
8-разрядный микроконтроллер работает на частотах от 16 до 50 МГц, подчеркивая простоту производительности и низкую стоимость приложений, и до сих пор занимает определенную позицию на текущем рынке микроконтроллеров, и многие операторы микроконтроллеров продолжают разрабатывать энергосберегающие конструкции для 8-разрядных микроконтроллеров с частотной коррекцией. Разработка продукта нуждается в зеленом веке.
16-битный MCU - это 16-битные вычисления, 16/24-битная адресация и частота - основные спецификации от 24 до 100 МГц. Некоторые 16-битные MCU дополнительно предоставляют 32-битные специальные инструкции сложения / вычитания / умножения / деления. В связи с появлением и постоянным снижением цен на 32-битные микроконтроллеры и простыми, долговечными и дешевыми недорогими преимуществами 8-битных микроконтроллеров, рынок 16-битных микроконтроллеров постоянно сжимается, что делает его самым низким коэффициентом отгрузки.
Можно сказать, что 32-разрядный MCU является основным направлением рынка MCU. Единая цена составляет от 1,5 до 4 долларов США. Рабочая частота в основном находится в диапазоне от 100 до 350 МГц. Производительность выше, а тип приложения довольно разнообразен. Однако из-за увеличения операндов и длины памяти 32-битный MCU увеличит длину программного кода той же функции на 30 ~ 40% по сравнению с 8/16-битным MCU, что приводит к тому, что объем встроенной памяти OTP / FlashROM не будет слишком маленьким, а также количество внешних выводов на чипе. Этот скачок еще больше ограничил возможности снижения стоимости 32-битных микроконтроллеров
MalaTang вне форума Ответить с цитированием
Старый 12.11.2019, 11:26   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,628
По умолчанию

Ну и какой смысл в этом довольно-таки корявом переводе, причем в совершенно чужом топике? Вроде тут не кафедра иностранных языков, чтоб зачет поставить ?

Последний раз редактировалось digitalis; 12.11.2019 в 11:28.
digitalis вне форума Ответить с цитированием
Старый 12.11.2019, 11:32   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,766
По умолчанию

А какже ссылочка?
p51x вне форума Ответить с цитированием
Старый 12.11.2019, 12:50   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,628
По умолчанию

Ясно. Рекламщик проявился. Ну и жлобьё! Да я за 51$ ноутбук лучше куплю секондо-хендовый.
Изображения
Тип файла: jpg 51.JPG (24.7 Кб, 39 просмотров)

Последний раз редактировалось digitalis; 12.11.2019 в 12:59. Причина: add
digitalis вне форума Ответить с цитированием
Старый 14.11.2019, 13:34   #9
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 754
По умолчанию

А, ну, я тоже ей писал. Она из Китая, Гонконг. Все время предлагала свой товар.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 14.11.2019 в 13:35. Причина: Добавил фразу.
Cuprum5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно работает рекурсивная функция [FENIX] PHP 0 05.12.2018 09:03
Функция rand() axel__ Общие вопросы C/C++ 12 19.06.2015 14:20
функция rand() goluzov Общие вопросы C/C++ 11 05.02.2013 09:41
Неправильно работает функция округления числа Nomicos Помощь студентам 3 09.07.2012 16:23
rand() неправильно работает demigod82 Общие вопросы C/C++ 7 02.04.2012 17:35