From e9601a5adada7e6abe80f5d711a8adefc894dfeb Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Tue, 29 Apr 2014 16:38:43 +0200 Subject: speaker: Initial implementation --- Makefile | 2 +- main.c | 6 ++++++ speaker.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ speaker.h | 9 +++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 speaker.c create mode 100644 speaker.h diff --git a/Makefile b/Makefile index addea24..8996720 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ MCU = atmega88 all: sanduhr.hex -sanduhr.elf: main.c i2c.c i2c.h uart.c uart.h timer.c timer.h gyro.c gyro.h accel.c accel.h common.h +sanduhr.elf: main.c i2c.c i2c.h uart.c uart.h timer.c timer.h gyro.c gyro.h accel.c accel.h common.h speaker.c speaker.h avr-gcc -std=gnu99 -mmcu=$(MCU) -Os -o $@ $^ sanduhr.hex: sanduhr.elf diff --git a/main.c b/main.c index a581ea8..608327c 100644 --- a/main.c +++ b/main.c @@ -13,6 +13,7 @@ #include "timer.h" #include "gyro.h" #include "accel.h" +#include "speaker.h" static void ledInit () { /* set led1,led2 to output */ @@ -49,6 +50,7 @@ int main () { uartInit (); gyroInit (); accelInit (); + speakerInit (); set_sleep_mode (SLEEP_MODE_IDLE); printf ("initialization done\n"); @@ -58,6 +60,10 @@ int main () { gyroStart (); accelStart (); + speakerStart (); + _delay_ms (200); + speakerStop (); + timerStart (); bool checkGyro = false; while (1) { 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 +#include +#include + +#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 (); +} + diff --git a/speaker.h b/speaker.h new file mode 100644 index 0000000..dec1d20 --- /dev/null +++ b/speaker.h @@ -0,0 +1,9 @@ +#ifndef SPEAKER_H +#define SPEAKER_H + +void speakerInit (); +void speakerStart (); +void speakerStop (); + +#endif /* SPEAKER_H */ + -- cgit v1.2.3