30 extern uint8_t teensy_pin;
33 extern uint8_t stm32_current_adc_pin;
34 void stm32_adc_eoc_handler();
37 extern uint8_t analog_reference;
42 if (speed == FAST_ADC){
43 ADCSRA |= (1 << ADPS2);
44 ADCSRA &= ~(1 << ADPS1);
45 ADCSRA &= ~(1 << ADPS0);
46 }
else if(speed == FASTER_ADC){
47 ADCSRA &= ~(1 << ADPS2);
48 ADCSRA |= (1 << ADPS1);
49 ADCSRA |= (1 << ADPS0);
50 }
else if(speed == FASTEST_ADC){
51 ADCSRA &= ~(1 << ADPS2);
52 ADCSRA |= (1 << ADPS1);
53 ADCSRA &= ~(1 << ADPS0);
57 if (speed == FASTEST_ADC) adc.setSampleRate(ADC_SMPR_1_5);
58 else if (speed == FASTER_ADC) adc.setSampleRate(ADC_SMPR_13_5);
59 else (adc.setSampleRate(ADC_SMPR_41_5));
71 void setupMozziADC(int8_t speed) {
74 adc->enableInterrupts(ADC_0);
77 setupFastAnalogRead(speed);
78 adc.attachInterrupt(stm32_adc_eoc_handler, ADC_EOC);
80 ADCSRA |= (1 << ADIE);
81 setupFastAnalogRead(speed);
82 adcDisconnectAllDigitalIns();
84 #warning Fast ADC not implemented on this platform 91 DIDR0 |= 1<<channel_num;
98 DIDR0 &= ~(1<<channel_num);
105 for (uint8_t i = 0; i<NUM_ANALOG_INPUTS; i++){
114 for (uint8_t i = 0; i<NUM_ANALOG_INPUTS; i++){
121 uint8_t adcPinToChannelNum(uint8_t pin) {
124 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 125 if (pin >= 54) pin -= 54;
126 #elif defined(__AVR_ATmega32U4__) 127 if (pin >= 18) pin -= 18;
128 pin = analogPinToChannel(pin);
129 #elif defined(__AVR_ATmega1284__) 130 if (pin >= 24) pin -= 24;
132 if (pin >= 14) pin -= 14;
140 static void adcSetChannel(uint8_t channel) {
142 #if defined(__AVR_ATmega32U4__) 143 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((channel >> 3) & 0x01) << MUX5);
144 #elif defined(ADCSRB) && defined(MUX5) 147 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((channel >> 3) & 0x01) << MUX5);
155 #if defined(TEENSYDUINO) 156 ADMUX = (1 << REFS0) | (channel & 0x07);
158 ADMUX = (analog_reference << 6) | (channel & 0x07);
172 void adcStartConversion(uint8_t channel) {
174 teensy_pin = channel;
175 adc->startSingleRead(teensy_pin);
177 stm32_current_adc_pin = channel;
178 adc.setPins(&stm32_current_adc_pin, 1);
179 adc.startConversion();
181 adcSetChannel(channel);
182 #if defined(ADCSRA) && defined(ADCL) 184 ADCSRA |= (1 << ADSC);
187 #warning Fast analog read not implemented on this platform 199 static volatile int analog_readings[NUM_ANALOG_INPUTS];
200 static Stack <
volatile int8_t,NUM_ANALOG_INPUTS> adc_channels_to_read;
201 volatile static int8_t current_channel = -1;
202 static bool first =
true;
206 void adcStartReadCycle(){
207 if (current_channel == -1)
209 #if (USE_AUDIO_INPUT == true) 210 adc_channels_to_read.push(AUDIO_INPUT_PIN);
212 adcReadSelectedChannels();
222 void adcReadSelectedChannels() {
223 current_channel = adc_channels_to_read.pop();
224 if(current_channel != -1) adcStartConversion(current_channel);
231 #warning Asynchronouos analog reads not implemented for this platform 232 return analogRead(pin);
236 pin = adcPinToChannelNum(pin);
238 adc_channels_to_read.push(pin);
239 return analog_readings[pin];
251 void startSecondControlADC() {
253 adc->startSingleRead(teensy_pin);
255 adc.setPins(&stm32_current_adc_pin, 1);
256 adc.startConversion();
258 ADCSRA |= (1 << ADSC);
263 void receiveSecondControlADC(){
265 analog_readings[current_channel] = adc->readSingle();
267 analog_readings[current_channel] = adc.getData();
269 analog_readings[current_channel] = ADC;
280 #if(USE_AUDIO_INPUT==false) 284 void stm32_adc_eoc_handler()
286 ISR(ADC_vect, ISR_BLOCK)
293 startSecondControlADC();
299 receiveSecondControlADC();
300 adcReadSelectedChannels();
int mozziAnalogRead(uint8_t pin)
Reads the analog input of a chosen channel, without blocking other operations from running...
void adcReconnectAllDigitalIns()
Reconnect the digital input buffers for analog input channels which have been set for analog input wi...
void reconnectDigitalIn(uint8_t channel_num)
Reconnect the digital input buffer for an analog input channel which has been set for analog input wi...
void disconnectDigitalIn(uint8_t channel_num)
Prepare an analog input channel by turning off its digital input buffer.
void setupFastAnalogRead(int8_t speed=FAST_ADC)
This is automatically called in startMozzi.
void adcDisconnectAllDigitalIns()
Prepare all analog input channels by turning off their digital input buffers.