## Noise Toys To turn a blinky LED program into a simple square-wave synthesizer, plug a speaker into PB4 and ground (where the LED was before), and turn up the frequency. The code is largely the same, just toggling a pin on and off, but now doing it at different speeds (for different tones) and for differing time periods (notes duration). ## squareOne.c /* Makes a quick square wave for noise-making experimentation. */ #include #include #define F_CPU 16000000L /* really? tested with the scope for Tiny45 */ #include void init(void){ DDRB |= _BV(PB4); } int main(void){ uint8_t i, j, k; uint16_t wavelength; init(); while(1){ for (k = 10; k > 3; k--){ /* pitch multiplier: makes different notes */ wavelength = 20*k; for (j=0; j < 200/k; j++){ /* number of cycles at each pitch: controls speed of loop */ PORTB |= _BV(PB4); for (i=0; i < wavelength; i++) /* on for 20*wavelength microsecs */ _delay_us(20); /* loop needed b/c each call to the delay function can't delay all that long before it overflows */ PORTB &= ~_BV(PB4); /* off for 20*wavelength microsecs */ for (i=0; i < wavelength; i++) _delay_us(20); } } } } ## spacePhaser.c /* Starts with a very short pulse (high-frequency) and drops rapidly. */ #include #include #define F_CPU 16000000L /* really? tested with the scope */ #include void init(void){ DDRB |= _BV(PB4); } int main(void){ uint8_t i, j, k; uint16_t wavelength; init(); while(1){ for (k = 3; k < 120; k++){ /* pitch multiplier: makes different notes */ wavelength = k; for (j=0; j < 200/k; j++){ /* number of cycles at each pitch: controls speed of loop */ PORTB |= _BV(PB4); for (i=0; i < wavelength; i++) /* on for 20*wavelength microsecs */ _delay_us(20); /* loop needed b/c each call to the delay function can't delay all that long before it overflows */ PORTB &= ~_BV(PB4); /* off for 20*wavelength microsecs */ for (i=0; i < wavelength; i++) _delay_us(20); } } for (j=0; j < 60; j++){ /* with delay between shots */ for (i=0; i < 250; i++) _delay_us(200); } } } ## chaosEngine.c /* Now the frequency of the wave is a crazy function. */ #include #include #define F_CPU 16000000L /* really? tested with the scope */ #include void init(void){ DDRB |= _BV(PB4); } int main(void){ uint8_t i, j, k; uint16_t wavelength; init(); while(1){ wavelength = (13 * wavelength + 1) % 123 + 100; for (j=0; j < 30; j++){ /* number of cycles at each pitch */ PORTB |= _BV(PB4); for (i=0; i < wavelength; i++) /* on for 20*wavelength microsecs */ _delay_us(20); /* loop needed b/c each call to the delay function can't delay all that long before it overflows */ PORTB &= ~_BV(PB4); /* off for 20*wavelength microsecs */ for (i=0; i < wavelength; i++) _delay_us(20); } } for (j=0; j < 60; j++){ /* longer delay between shots */ for (i=0; i < 250; i++) _delay_us(200); } } [Category: AVR Tutorial](Category:_AVR_Tutorial "wikilink")