Рассмотрим несколько способов генерирования случайных чисел на микроконтроллере.
Иногда необходимо некое случайное число, например для какой нибудь игры или для случайного генератора временных интервалов, вообщем может понадобится где угодно.
Я знаю как минимум 3 способа сгенерировать случайное число:
- Функция rand() + программный таймер в CVAVR.
- Программный таймер.
- Использование наводок от АЦП.
Схема в симуляторе у нас будет вот такая, простенькая. Данные будем отправлять в терминал.
Рассмотрим по очереди каждый из способов.
1. Функция rand() + программный таймер в CVAVR.
Данная функция находится в подключаемом файле #include <stdlib.h>
Использование одной этой функции не даёт желаемого результата — цифры повторяются при каждой инициализации. Поэтому задействован программный таймер который постоянно тикает. В момент нажатия кнопки значение берётся с таймера и записывается в функцию настройки генератора: srand(tik).
Сразу после этого извлекаем случайное число:
num = rand()%120; //генерируем число с максимальным 120
Пример кода:
#include <tiny13.h> #include "stx.c" #include <delay.h> #define BTN PINB.1 #define RAND_MAX 120 #include <stdlib.h> //библиотека для генератора случайных чисел volatile unsigned long int num=0; //переменная в которой хранится число volatile unsigned char tik=0; //счётчик для генератора случайных чисел unsigned char buf[3]={0,0,0}; //буфер для отправки данных char i=0; void pr() { tik++; //таймер для настройки генератора случайных чисел. if(BTN==0) //нажата кнопка { delay_ms(10); while(!BTN){;}; s rand(tik); //настраиваем генератор случайных чисел num = rand()%120; //генерируем число с маkсимальным 120 //далее идет все то что касается отправки данных в порт. stx_char(' '); //делаем пробел itoa(num,buf); //преобразуем число в строку for(i=0;i<3;i++) //последовательно отправляем данные из буфера { stx_char(buf[i]); //отправляем текущую позицию буфера buf[i]=0; //и сразу обнуляем его } } } void main(void) { // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0); // State: Bit5=P Bit4=P Bit3=P Bit2=P Bit1=P Bit0=0 PORTB=(1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (0<<PORTB0); while (1) { pr(); } }
Данный код отправляет случайное число в порт UART (программно сделанный).