Serial Musical Organ 1.0
Buzzer controller and musical organ
Loading...
Searching...
No Matches
organ.c
Go to the documentation of this file.
1
12#include "includes/CPU.h"
13#include <avr/io.h>
14#include <util/delay.h>
15#include "includes/organ.h"
16#include "includes/pinDefines.h"
17
66void playNote(uint16_t half_us, uint16_t duration_ms)
67{
68 /* Calculate the number of complete cycles needed
69 * Optimized formula: (0.5e6 / half_us) * duration_ms / 1000
70 * Equivalent to: cycles = frequency_Hz * (duration_ms/1000)
71 */
72 uint16_t cycles = (500000 / half_us) * duration_ms / 1000;
73
74 /* Main tone generation loop */
75 for (uint16_t i = 0; i < cycles; i++)
76 {
77 /* HIGH phase of square wave */
78 BUZZER_PORT |= (1 << BUZZER_PIN); /* Set pin high */
79 for (uint16_t k = 0; k < half_us; k++) /* Half cycle delay */
80 _delay_us(1);
81
82 /* LOW phase of square wave */
83 BUZZER_PORT &= ~(1 << BUZZER_PIN); /* Set pin low */
84 for (uint16_t m = 0; m < half_us; m++) /* Half cycle delay */
85 _delay_us(1);
86 }
87
88 /* Short pause between notes to eliminate transition noise */
89 _delay_ms(30);
90}
91
92void rest(uint16_t duration)
93{
94 for (uint16_t i = 0; i < duration; i++)
95 _delay_ms(1);
96}
CPU configuration and definitions for ATmega168.
#define BUZZER_PIN
BUZZER pin number within its port.
Definition pinDefines.h:42
#define BUZZER_PORT
Output port register for BUZZER pin.
Definition pinDefines.h:52
void playNote(uint16_t half_us, uint16_t duration_ms)
Generates a musical tone with specific duration.
Definition organ.c:66
void rest(uint16_t duration)
Definition organ.c:92
Organ tone generator interface.
Hardware pin mapping for BUZZER/buzzer output.