From d757bccbb403cb217e94d1fd1628466c13dc3c83 Mon Sep 17 00:00:00 2001 From: Owen L - SFE Date: Thu, 27 Feb 2020 09:39:04 -0700 Subject: [PATCH 1/5] disable adc channels while reconfiguring --- cores/arduino/ard_sup/analog/ap3_analog.cpp | 34 ++++++++++++--------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index 3b27704b..f0ba69a5 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -119,14 +119,15 @@ static const uint8_t outcfg_tbl[32][4] = {OUTC(1, 7, 1), OUTC(0, 6, 0), OUTC(1, 7, 0), OUTC(1, 3, 1)}, // CTX31: B7OUT2, A6OUT, B7OUT, B3OUT2 }; -uint16_t _analogBits = 10; //10-bit by default -uint8_t _analogWriteBits = 8; // 8-bit by default for writes -uint8_t _servoWriteBits = 8; // 8-bit by default for writes +uint16_t _analogBits = 10; //10-bit by default +uint8_t _analogWriteBits = 8; // 8-bit by default for writes +uint8_t _servoWriteBits = 8; // 8-bit by default for writes static bool ap3_adc_initialized = false; // flag to show if the ADC has been initialized uint16_t analogRead(uint8_t pinNumber) { - if(!ap3_adc_initialized){ + if (!ap3_adc_initialized) + { ap3_adc_setup(); ap3_adc_initialized = true; } @@ -297,13 +298,6 @@ ap3_err_t ap3_adc_setup() return AP3_ERR; } - // Enable the ADC. - if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle)) - { - //Serial.println("Error - enabling ADC failed.\n"); - return AP3_ERR; - } - return AP3_OK; } @@ -350,6 +344,11 @@ ap3_err_t ap3_change_channel(uint8_t padNumber) ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1; ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT; + if (AM_HAL_STATUS_SUCCESS != am_hal_adc_disable(g_ADCHandle)) + { + return AP3_ERR; + } + //Look up adc channel based on pad number uint8_t indi; for (indi = 0; indi < AP3_ANALOG_CHANNELS; indi++) @@ -375,6 +374,11 @@ ap3_err_t ap3_change_channel(uint8_t padNumber) return AP3_ERR; } + if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle)) + { + return AP3_ERR; + } + return AP3_OK; } @@ -667,12 +671,12 @@ ap3_err_t servoWriteResolution(uint8_t res) uint8_t getServoResolution() { - return(_servoWriteBits); + return (_servoWriteBits); } ap3_err_t servoWrite(uint8_t pin, uint32_t val) { - return(servoWrite(pin, val, 544, 2400)); //Call servoWrite with Arduino default min/max microseconds. See: https://www.arduino.cc/en/Reference/ServoAttach + return (servoWrite(pin, val, 544, 2400)); //Call servoWrite with Arduino default min/max microseconds. See: https://www.arduino.cc/en/Reference/ServoAttach } ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t maxMicros) @@ -684,9 +688,9 @@ ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t max uint32_t fw = 60000; // 20 ms wide frame //Convert microSeconds to PWM counts. - uint32_t min = minMicros * 3; + uint32_t min = minMicros * 3; uint32_t max = maxMicros * 3; - + uint32_t th = (uint32_t)(((max - min) * val) / fsv) + min; return ap3_pwm_output(pin, th, fw, clk); From 6902d0e61b36c9d2df88fc93988d25534813bdc6 Mon Sep 17 00:00:00 2001 From: Owen L - SFE Date: Thu, 27 Feb 2020 09:46:10 -0700 Subject: [PATCH 2/5] get interrupt status before clearing interrupts in analogRead Addresses #130 --- cores/arduino/ard_sup/analog/ap3_analog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index f0ba69a5..ae23b919 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -175,6 +175,7 @@ uint16_t analogRead(uint8_t pinNumber) ap3_change_channel(padNumber); //Point ADC channel at this pad // Clear the ADC interrupt. + am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, true); if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask)) { //Serial.println("Error clearing ADC interrupt status"); From e0aae55d5a37027bc02c1edd1d2344b6468a4c74 Mon Sep 17 00:00:00 2001 From: Owen L - SFE Date: Mon, 2 Mar 2020 10:39:16 -0700 Subject: [PATCH 3/5] undo VSC autoformatter whitespace changes (they're just awfully annoying!) --- cores/arduino/ard_sup/analog/ap3_analog.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index ae23b919..07e0b767 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -119,15 +119,14 @@ static const uint8_t outcfg_tbl[32][4] = {OUTC(1, 7, 1), OUTC(0, 6, 0), OUTC(1, 7, 0), OUTC(1, 3, 1)}, // CTX31: B7OUT2, A6OUT, B7OUT, B3OUT2 }; -uint16_t _analogBits = 10; //10-bit by default -uint8_t _analogWriteBits = 8; // 8-bit by default for writes -uint8_t _servoWriteBits = 8; // 8-bit by default for writes +uint16_t _analogBits = 10; //10-bit by default +uint8_t _analogWriteBits = 8; // 8-bit by default for writes +uint8_t _servoWriteBits = 8; // 8-bit by default for writes static bool ap3_adc_initialized = false; // flag to show if the ADC has been initialized uint16_t analogRead(uint8_t pinNumber) { - if (!ap3_adc_initialized) - { + if(!ap3_adc_initialized){ ap3_adc_setup(); ap3_adc_initialized = true; } @@ -175,7 +174,6 @@ uint16_t analogRead(uint8_t pinNumber) ap3_change_channel(padNumber); //Point ADC channel at this pad // Clear the ADC interrupt. - am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, true); if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask)) { //Serial.println("Error clearing ADC interrupt status"); @@ -672,12 +670,12 @@ ap3_err_t servoWriteResolution(uint8_t res) uint8_t getServoResolution() { - return (_servoWriteBits); + return(_servoWriteBits); } ap3_err_t servoWrite(uint8_t pin, uint32_t val) { - return (servoWrite(pin, val, 544, 2400)); //Call servoWrite with Arduino default min/max microseconds. See: https://www.arduino.cc/en/Reference/ServoAttach + return(servoWrite(pin, val, 544, 2400)); //Call servoWrite with Arduino default min/max microseconds. See: https://www.arduino.cc/en/Reference/ServoAttach } ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t maxMicros) @@ -689,9 +687,9 @@ ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t max uint32_t fw = 60000; // 20 ms wide frame //Convert microSeconds to PWM counts. - uint32_t min = minMicros * 3; + uint32_t min = minMicros * 3; uint32_t max = maxMicros * 3; - + uint32_t th = (uint32_t)(((max - min) * val) / fsv) + min; return ap3_pwm_output(pin, th, fw, clk); From efb0bda6fd96a7a5a732c2144604ba19fb324079 Mon Sep 17 00:00:00 2001 From: Owen L - SFE Date: Mon, 2 Mar 2020 10:40:44 -0700 Subject: [PATCH 4/5] add intmask initialization --- cores/arduino/ard_sup/analog/ap3_analog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index 07e0b767..d07c1708 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -131,7 +131,7 @@ uint16_t analogRead(uint8_t pinNumber) ap3_adc_initialized = true; } - uint32_t ui32IntMask; + uint32_t ui32IntMask = 0xff; am_hal_adc_sample_t Sample; uint32_t ui32NumSamples = 1; From 604e4594757b49e3566d3c3ae6a786d1ce100468 Mon Sep 17 00:00:00 2001 From: Owen L - SFE Date: Mon, 2 Mar 2020 10:44:40 -0700 Subject: [PATCH 5/5] change method of clearing ADC interrupt first get any active interrupts into the interrupt mask --- cores/arduino/ard_sup/analog/ap3_analog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/arduino/ard_sup/analog/ap3_analog.cpp b/cores/arduino/ard_sup/analog/ap3_analog.cpp index d07c1708..c8736a35 100644 --- a/cores/arduino/ard_sup/analog/ap3_analog.cpp +++ b/cores/arduino/ard_sup/analog/ap3_analog.cpp @@ -131,7 +131,7 @@ uint16_t analogRead(uint8_t pinNumber) ap3_adc_initialized = true; } - uint32_t ui32IntMask = 0xff; + uint32_t ui32IntMask; am_hal_adc_sample_t Sample; uint32_t ui32NumSamples = 1; @@ -174,6 +174,7 @@ uint16_t analogRead(uint8_t pinNumber) ap3_change_channel(padNumber); //Point ADC channel at this pad // Clear the ADC interrupt. + am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false); if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask)) { //Serial.println("Error clearing ADC interrupt status");