13 #include "FrequencyTimer2.h" 16 #if (F_CPU != 16000000
) 18 "Mozzi has been tested with a cpu clock speed of 16MHz on Arduino! Results may vary with other speeds." 22 #define MOZZI_FAST_ANALOG_IMPLEMENTED 23 extern uint8_t analog_reference;
25 #define getADCReading() ADC 26 #define channelNumToIndex(channel) channel 27 uint8_t adcPinToChannelNum(uint8_t pin) {
28 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 29 if (pin >= 54) pin -= 54;
30 #elif defined(__AVR_ATmega32U4__) 31 if (pin >= 18) pin -= 18;
32 pin = analogPinToChannel(pin);
33 #elif defined(__AVR_ATmega1284__) 34 if (pin >= 24) pin -= 24;
36 if (pin >= 14) pin -= 14;
41 void adcStartConversion(uint8_t channel) {
42 #if defined(__AVR_ATmega32U4__) 43 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((channel >> 3) & 0x01) << MUX5);
44 #elif defined(ADCSRB) && defined(MUX5) 47 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((channel >> 3) & 0x01) << MUX5);
55 # if defined(TEENSYDUINO) 56 ADMUX = (1 << REFS0) | (channel & 0x07);
58 ADMUX = (analog_reference << 6) | (channel & 0x07);
61 #if defined(ADCSRA) && defined(ADCL) 63 ADCSRA |= (1 << ADSC);
67 static void startSecondADCReadOnCurrentChannel() {
68 ADCSRA |= (1 << ADSC);
77 ISR(ADC_vect, ISR_BLOCK)
83 if (speed == FAST_ADC){
84 ADCSRA |= (1 << ADPS2);
85 ADCSRA &= ~(1 << ADPS1);
86 ADCSRA &= ~(1 << ADPS0);
87 }
else if(speed == FASTER_ADC){
88 ADCSRA &= ~(1 << ADPS2);
89 ADCSRA |= (1 << ADPS1);
90 ADCSRA |= (1 << ADPS0);
91 }
else if(speed == FASTEST_ADC){
92 ADCSRA &= ~(1 << ADPS2);
93 ADCSRA |= (1 << ADPS1);
94 ADCSRA &= ~(1 << ADPS0);
98 void setupMozziADC(int8_t speed) {
99 ADCSRA |= (1 << ADIE);
100 adcDisconnectAllDigitalIns();
133 static uint8_t pre_mozzi_TCCR1A, pre_mozzi_TCCR1B, pre_mozzi_OCR1A,
136 #if (AUDIO_MODE == HIFI) 138 static uint8_t pre_mozzi_TCCR2A, pre_mozzi_TCCR2B, pre_mozzi_OCR2A,
141 static uint8_t pre_mozzi_TCCR2, pre_mozzi_OCR2, pre_mozzi_TIMSK;
142 #elif defined(TCCR4A) 143 static uint8_t pre_mozzi_TCCR4A, pre_mozzi_TCCR4B, pre_mozzi_TCCR4C,
144 pre_mozzi_TCCR4D, pre_mozzi_TCCR4E, pre_mozzi_OCR4C, pre_mozzi_TIMSK4;
148 static void backupPreMozziTimer1() {
150 pre_mozzi_TCCR1A = TCCR1A;
151 pre_mozzi_TCCR1B = TCCR1B;
152 pre_mozzi_OCR1A = OCR1A;
153 pre_mozzi_TIMSK1 = TIMSK1;
156 #if (AUDIO_MODE == HIFI) 158 static uint8_t mozzi_TCCR2A, mozzi_TCCR2B, mozzi_OCR2A, mozzi_TIMSK2;
160 static uint8_t mozzi_TCCR2, mozzi_OCR2, mozzi_TIMSK;
161 #elif defined(TCCR4A) 162 static uint8_t mozzi_TCCR4A, mozzi_TCCR4B, mozzi_TCCR4C, mozzi_TCCR4D,
163 mozzi_TCCR4E, mozzi_OCR4C, mozzi_TIMSK4;
167 #if (EXTERNAL_AUDIO_OUTPUT == true) 168 static void startAudio() {
169 backupPreMozziTimer1();
170 Timer1.initializeCPUCycles(
177 ISR(TIMER1_OVF_vect, ISR_BLOCK) {
178 defaultAudioOutput();
180 #elif (AUDIO_MODE == STANDARD) || (AUDIO_MODE == STANDARD_PLUS) 181 # if (AUDIO_MODE == STANDARD_PLUS) 182 # include "AudioConfigStandardPlus.h" 184 # include "AudioConfigStandard9bitPwm.h" 186 inline void audioOutput(
const AudioOutput f)
189 # if (AUDIO_CHANNELS > 1
) 190 AUDIO_CHANNEL_2_OUTPUT_REGISTER = f.r()+AUDIO_BIAS;
194 static void startAudio() {
195 backupPreMozziTimer1();
199 # if (AUDIO_MODE == STANDARD) 200 Timer1.initializeCPUCycles(
204 Timer1.initializeCPUCycles(F_CPU / PWM_RATE,
209 # if (AUDIO_CHANNELS > 1
) 210 Timer1.pwm(AUDIO_CHANNEL_2_PIN, AUDIO_BIAS);
219 ISR(TIMER1_OVF_vect, ISR_BLOCK) {
220 # if (AUDIO_MODE == STANDARD_PLUS) && (AUDIO_RATE == 16384
) 221 static boolean alternate;
222 alternate = !alternate;
223 if (alternate)
return;
226 defaultAudioOutput();
229 #elif (AUDIO_MODE == HIFI) 230 # if (EXTERNAL_AUDIO_OUTPUT != true) 231 # include "AudioConfigHiSpeed14bitPwm.h" 232 inline void audioOutput(
const AudioOutput f) {
256 AUDIO_CHANNEL_1_highByte_REGISTER = (f.l()+AUDIO_BIAS) >> AUDIO_BITS_PER_REGISTER;
257 AUDIO_CHANNEL_1_lowByte_REGISTER = (f.l()+AUDIO_BIAS) & ((1 << AUDIO_BITS_PER_REGISTER) - 1);
261 static void setupTimer2();
262 static void startAudio() {
263 backupPreMozziTimer1();
265 pinMode(AUDIO_CHANNEL_1_highByte_PIN,
267 pinMode(AUDIO_CHANNEL_1_lowByte_PIN,
269 Timer1.initializeCPUCycles(
272 Timer1.pwm(AUDIO_CHANNEL_1_highByte_PIN,
274 Timer1.pwm(AUDIO_CHANNEL_1_lowByte_PIN,
283 static void backupPreMozziTimer2() {
286 pre_mozzi_TCCR2A = TCCR2A;
287 pre_mozzi_TCCR2B = TCCR2B;
288 pre_mozzi_OCR2A = OCR2A;
289 pre_mozzi_TIMSK2 = TIMSK2;
291 pre_mozzi_TCCR2 = TCCR2;
292 pre_mozzi_OCR2 = OCR2;
293 pre_mozzi_TIMSK = TIMSK;
294 #elif defined(TCCR4A) 295 pre_mozzi_TCCR4B = TCCR4A;
296 pre_mozzi_TCCR4B = TCCR4B;
297 pre_mozzi_TCCR4B = TCCR4C;
298 pre_mozzi_TCCR4B = TCCR4D;
299 pre_mozzi_TCCR4B = TCCR4E;
300 pre_mozzi_OCR4C = OCR4C;
301 pre_mozzi_TIMSK4 = TIMSK4;
307 static void setupTimer2() {
308 backupPreMozziTimer2();
309 unsigned long period = F_CPU / AUDIO_RATE;
310 FrequencyTimer2::setPeriodCPUCycles(period);
311 FrequencyTimer2::setOnOverflow(dummy);
312 FrequencyTimer2::enable();
315 #if defined(TIMER2_COMPA_vect) 316 ISR(TIMER2_COMPA_vect)
317 #elif defined(TIMER2_COMP_vect) 318 ISR(TIMER2_COMP_vect)
319 #elif defined(TIMER4_COMPA_vect) 320 ISR(TIMER4_COMPA_vect)
323 "This board does not have a hardware timer which is compatible with FrequencyTimer2" 324 void dummy_function(
void)
327 defaultAudioOutput();
341 TCCR1A = pre_mozzi_TCCR1A;
342 TCCR1B = pre_mozzi_TCCR1B;
343 OCR1A = pre_mozzi_OCR1A;
345 TIMSK1 = pre_mozzi_TIMSK1;
347 #if (AUDIO_MODE == HIFI) 349 TCCR2A = pre_mozzi_TCCR2A;
350 TCCR2B = pre_mozzi_TCCR2B;
351 OCR2A = pre_mozzi_OCR2A;
352 TIMSK2 = pre_mozzi_TIMSK2;
354 TCCR2 = pre_mozzi_TCCR2;
355 OCR2 = pre_mozzi_OCR2;
356 TIMSK = pre_mozzi_TIMSK;
357 #elif defined(TCCR4A) 358 TCCR4B = pre_mozzi_TCCR4A;
359 TCCR4B = pre_mozzi_TCCR4B;
360 TCCR4B = pre_mozzi_TCCR4C;
361 TCCR4B = pre_mozzi_TCCR4D;
362 TCCR4B = pre_mozzi_TCCR4E;
363 OCR4C = pre_mozzi_OCR4C;
364 TIMSK4 = pre_mozzi_TIMSK4;
void stopMozzi()
Stops audio and control interrupts and restores the timers to the values they had before Mozzi was st...
#define AUDIO_CHANNEL_1_OUTPUT_REGISTER
#define AUDIO_CHANNEL_1_PIN
void setupFastAnalogRead(int8_t speed)
NOTE: Code needed to set up faster than usual analog reads, e.g.