diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2014-04-29 16:38:43 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2014-04-29 16:38:43 +0200 |
commit | e9601a5adada7e6abe80f5d711a8adefc894dfeb (patch) | |
tree | fcf5fc4f830b3a873b9ad4b74f47b1ef13baed0f /speaker.c | |
parent | 6dc875e136b4ab418cf63154bdd2ffea46c6e67a (diff) | |
download | hourglass-e9601a5adada7e6abe80f5d711a8adefc894dfeb.tar.gz hourglass-e9601a5adada7e6abe80f5d711a8adefc894dfeb.tar.bz2 hourglass-e9601a5adada7e6abe80f5d711a8adefc894dfeb.zip |
speaker: Initial implementation
Diffstat (limited to 'speaker.c')
-rw-r--r-- | speaker.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/speaker.c b/speaker.c new file mode 100644 index 0000000..d903c57 --- /dev/null +++ b/speaker.c @@ -0,0 +1,49 @@ +/* speaker control, uses timer2 + */ + +#include <avr/io.h> +#include <avr/interrupt.h> +#include <stdbool.h> + +#include "speaker.h" + +static bool value = false; + +static void speakerSet () { + if (value) { + PORTD = PORTD | (1 << PD6); + } else { + PORTD = PORTD & ~(1 << PD6); + } +} + +ISR(TIMER2_OVF_vect) { + value = !value; + speakerSet (); +} + +void speakerInit () { + /* set PD6 to output */ + DDRD |= (1 << PD6); + /* value is false */ + speakerSet (); +} + +void speakerStart () { + /* reset timer value */ + TCNT2 = 0; + /* set normal mode timer0 */ + TCCR2A = 0; + /* enable overflow interrupt */ + TIMSK2 = (1 << TOIE2); + /* io clock with 1024 prescaler */ + TCCR2B = (TCCR2B & ~((1 << CS21)) | (1 << CS22) | (1 << CS20)); +} + +void speakerStop () { + /* zero clock source */ + TCCR2B = 0; + value = false; + speakerSet (); +} + |