From b373d816c2ef4e99c543aab510034c63a92ef371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergiusz=20=27q3k=27=20Baza=C5=84ski?= Date: Sun, 15 Sep 2013 13:17:38 +0200 Subject: [PATCH] Buzzer code. --- .gitignore | 1 + software/keypad/Makefile | 2 +- software/keypad/buzzer.c | 38 ++++++++++++++++++++++++++++++++++++++ software/keypad/buzzer.h | 10 ++++++++++ software/keypad/io.h | 26 ++++++++++++++++++++++++++ software/keypad/main.c | 35 +++++++++++++++-------------------- 6 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 software/keypad/buzzer.c create mode 100644 software/keypad/buzzer.h create mode 100644 software/keypad/io.h diff --git a/.gitignore b/.gitignore index 674aaad..e88608a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ openwrt sdk +*swp diff --git a/software/keypad/Makefile b/software/keypad/Makefile index 12af85f..85ba61b 100644 --- a/software/keypad/Makefile +++ b/software/keypad/Makefile @@ -1,5 +1,5 @@ PRG = uart_hello -OBJ = main.o +OBJ = main.o buzzer.o PROGRAMMER = buspirate PORT = /dev/ttyACM0 MCU_TARGET = atmega8 diff --git a/software/keypad/buzzer.c b/software/keypad/buzzer.c new file mode 100644 index 0000000..10b6265 --- /dev/null +++ b/software/keypad/buzzer.c @@ -0,0 +1,38 @@ +#include +#include + +#include "io.h" + +IMPORT_IO(BUZZER); + +void buzzer_init(void) +{ + // Set up Timer1 - CTC and /256 prescaler + TCCR1A = 0; + TCCR1B = _BV(WGM12) | _BV(CS12); + TCNT1 = 0; + OCR1A = 4; + OCR1B = 0xFFFF; +} + +void buzzer_start(uint16_t ticks) +{ + cli(); + TIMSK &= ~_BV(OCIE1A); + OCR1A = ticks; + TIMSK = _BV(OCIE1A); + TCNT1 = 0; + sei(); +} + +void buzzer_stop(void) +{ + cli(); + TIMSK &= ~_BV(OCIE1A); + sei(); +} + +ISR(TIMER1_COMPA_vect) +{ + IO_TOGGLE(BUZZER); +} diff --git a/software/keypad/buzzer.h b/software/keypad/buzzer.h new file mode 100644 index 0000000..1d6eaa9 --- /dev/null +++ b/software/keypad/buzzer.h @@ -0,0 +1,10 @@ +#ifndef __BUZZER_H__ +#define __BUZZER_H__ + +void buzzer_init(void); + +#define TONE_LOW 8 +#define TONE_MID 4 +#define TONE_HIGH 2 + +#endif diff --git a/software/keypad/io.h b/software/keypad/io.h new file mode 100644 index 0000000..b4f4264 --- /dev/null +++ b/software/keypad/io.h @@ -0,0 +1,26 @@ +#ifndef _Q__IO_H__ +#define _Q__IO_H__ + +typedef struct +{ + volatile uint8_t *DDR; + volatile uint8_t *PORT; + volatile uint8_t *PIN; + uint8_t Bitmap; +} TIOPort; + +#define DECLARE_IO(name, port, bit) TIOPort g_IO_##name = { &DDR##port, &PORT##port, &PIN##port, (1 << bit) } +#define IMPORT_IO(name) extern TIOPort g_IO_##name +#define IO_SET_OUTPUT(name) do { *g_IO_##name.DDR |= g_IO_##name.Bitmap; } while(0) +#define IO_SET_INPUT(name) do { *g_IO_##name.DDR &= ~g_IO_##name.Bitmap; } while(0) +#define IO_INPUT_PULLUP(name) do { *g_IO_##name.PORT |= g_IO_##name.Bitmap; } while(0) + +#define IO_OUT(name, value) do { if (value) \ + *g_IO_##name.PORT |= g_IO_##name.Bitmap; \ + else \ + *g_IO_##name.PORT &= ~g_IO_##name.Bitmap; } while(0) +#define IO_TOGGLE(name) do { *g_IO_##name.PORT ^= g_IO_##name.Bitmap; } while(0) +#define IO_IN(name) (*g_IO_##name.PIN & g_IO_##name.Bitmap) + + +#endif diff --git a/software/keypad/main.c b/software/keypad/main.c index 071c173..d87952f 100644 --- a/software/keypad/main.c +++ b/software/keypad/main.c @@ -1,31 +1,15 @@ #include #include +#include #include +#include "io.h" +#include "buzzer.h" + ///////////////////// // I/O ports setup // ///////////////////// -typedef struct -{ - volatile uint8_t *DDR; - volatile uint8_t *PORT; - volatile uint8_t *PIN; - uint8_t Bitmap; -} TIOPort; - -#define DECLARE_IO(name, port, bit) TIOPort g_IO_##name = { &DDR##port, &PORT##port, &PIN##port, (1 << bit) } -#define IO_SET_OUTPUT(name) do { *g_IO_##name.DDR |= g_IO_##name.Bitmap; } while(0) -#define IO_SET_INPUT(name) do { *g_IO_##name.DDR &= ~g_IO_##name.Bitmap; } while(0) -#define IO_INPUT_PULLUP(name) do { *g_IO_##name.PORT |= g_IO_##name.Bitmap; } while(0) - -#define IO_OUT(name, value) do { if (value) \ - *g_IO_##name.PORT |= g_IO_##name.Bitmap; \ - else \ - *g_IO_##name.PORT &= ~g_IO_##name.Bitmap; } while(0) -#define IO_TOGGLE(name) do { *g_IO_##name.PORT ^= g_IO_##name.Bitmap; } while(0) -#define IO_IN(name) (*g_IO_##name.PIN & g_IO_##name.Bitmap) - // Buzzer on PC2 DECLARE_IO(BUZZER, C, 2); // Red LED pn PC1 @@ -54,6 +38,17 @@ int main (void) IO_OUT(LED_GREEN, 1); IO_OUT(LED_RED, 1); + buzzer_init(); + sei(); + + buzzer_start(TONE_LOW); + _delay_ms(10); + buzzer_start(TONE_MID); + _delay_ms(10); + buzzer_start(TONE_HIGH); + _delay_ms(10); + buzzer_stop(); + for (;;) {} return 0; }