#include #include #include #include #include #include "main.h" volatile uint8_t sample_pending; // 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; uint8_t counter = 0; uint8_t pulsewidth = 0; uint16_t maxcounter = 0xFF; uint16_t pulsecounter = 0; 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 = 1728; } 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 >> 8) & 0xff; } } static void init_sampletimer(void) { // Timer 0 // //set timer0 to CTC & prescaler 64 == 125k TCCR0A = (1 << WGM01); TCCR0B = (1 << CS00) | (1 << CS01); //count up to 5 : OCR0A = 3; TCNT0=0; //enable interrupt TIMSK0 |= (1< maxcounter){ counter = 0; }; pulsecounter++; if (pulsecounter > 0x0200){ pulsecounter = 0; pulsewidth++; if (pulsewidth > maxcounter){ pulsewidth = 0; } } OCR1B = ((counter > pulsewidth) ? maxcounter : 0x00); //OCR1B = counter; //OCR1B = OCR1B + 4; if (OCR1B > 0x007F) { // OCR1B = 0x00F; } PORTC ^= 0b01; //ICR1 = synth.output; //sample_pending = 1; }