From 4fde5f01aee09899e8be0c19a4e4f8eba7504f5c Mon Sep 17 00:00:00 2001 From: twobit Date: Thu, 26 Jul 2012 01:26:45 +0200 Subject: [PATCH] start synth implementation --- firmware/Makefile | 2 +- firmware/main.c | 67 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/firmware/Makefile b/firmware/Makefile index 8d77fe0..b415906 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -60,7 +60,7 @@ EXTRAINCDIRS = # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -ahlms: create assembler listing -CFLAGS = -O$(OPT) +CFLAGS = -O$(OPT) -g CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -fpack-struct diff --git a/firmware/main.c b/firmware/main.c index a3034c9..1bd91f2 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -6,6 +6,55 @@ #include "main.h" + +// sample rate is 8M / (5 * 64) = 25000 + +enum { + synth_channel_count = 2 +}; + +typedef struct { + uint16_t phase; + uint16_t speed; + +} synth_channel_t; + +typedef struct { + synth_channel_t channels[synth_channel_count]; + uint16_t output; +} synth_t; + + +static synth_t synth; + +static void synth_init(void) +{ + // some test values + synth.channels[0].phase = 0; + synth.channels[0].speed = 1153; + + synth.channels[1].phase = 0; + synth.channels[1].speed = 23456; +} + + +static inline void synth_mix(void) +{ + synth.output = 0; + + for(int i = 0; i < synth_channel_count; i++) { + synth_channel_t* chan = &synth.channels[i]; + chan->phase += chan->speed; + + synth.output += (chan->phase >> 16) & 0xff; + } +} + + + + + + static inline void init_pwm(void) { //PB1 set to output: @@ -44,16 +93,16 @@ static void init_motor(void) static void stupid_pwmtest(void) { - uint8_t i,t,r; - ICR1 = 0xAA00; - r=1; + uint8_t i, t, r; + ICR1 = 0xAA00; + t = r = 1; for (;;) { - t = (r)?(t+1):(t-1); + t = (r) ? (t+1) : (t-1); ICR1 = (t << 7); - if(t=0) r ^= 1; - for(i=1;i<100;i++) __asm("nop"); + if(t == 0) r ^= 1; + for(i = 1; i < 100; i++) __asm("nop"); @@ -65,14 +114,16 @@ static void stupid_pwmtest(void) int main(void) { - //hardware initialisation: + //hardware initialisation: init_leds(); init_motor(); init_pwm(); + synth_init(); + //just stupid test for now.... stupid_pwmtest(); //never get here - return; + return 0; }