This project is very similar to ATtiny13 – randomly flashing LED with PRNG based on LFSR. However, this time I used BBS (Blum-Blum-Shumb) algorithm as PRNG (Pseudo Random Number Generator) to generate 16-bit (pseudo) random numbers. The less significant bit of randomly generated number is a major factor in decision to on/off the LED. The code is on Github, click here
Parts Required
- ATtiny13 – i.e. MBAVR-1 development board
- Resistor – 220Ω, see LED Resistor Calculator
- LED
Circuit Diagram
Software
This code is written in C and can be compiled using the avr-gcc. All information about how to compile this project is here.
/**
* Copyright (c) 2019, Łukasz Marcin Podkalicki <lpodkalicki@gmail.com>
* ATtiny13/048
* Randomly flashing LED with PRNG based on BBS (Blum-Blum-Shumb).
*/
#include <avr/io.h>
#include <util/delay.h>
#define LED_PIN PB0
#define BBS_P (13)
#define BBS_Q (97)
#define BBS_SEED (123)
#define DELAY (64)
static uint16_t m;
static uint16_t x;
static uint16_t r;
/* Initialize vector of BBS algorithm, where:
-> p: prime number
-> q: prime number
-> seed: random integer greater then 1,
which is co-prime to 'm',
where 'm = p*q' and 'GCD(m, seed) == 1'
Note that value of 'm' must be less than '(2^16) - 1'
*/
static void
bbs_init(uint16_t p, uint16_t q, uint16_t seed)
{
m = p * q;
r = x = seed;
}
static uint16_t
bbs_next(void)
{
return (r = (r * x) % m);
}
int
main(void)
{
/* setup */
DDRB |= _BV(LED_PIN); // set LED pin as OUTPUT
bbs_init(BBS_P, BBS_Q, BBS_SEED); // initialize BBS alg.
/* loop */
while (1) {
if (bbs_next() & 1) {
PORTB |= _BV(LED_PIN);
} else {
PORTB &= ~_BV(LED_PIN);
}
_delay_ms(DELAY);
}
}

Hello Sir,
How to get 10 seconds delay and start with another random blink and go on….??
Please suggest…
Hi. Sorry for late reply.
void
sleep(uint16_t seconds)
{
while (seconds–) _delay_ms(1000);
}