Champignon55T
Member
Code:
#include <FreeRTOS.h>
#include <task.h>
#include <ADC.h>
#include <Arduino.h>
#include <DMAChannel.h>
#include <semphr.h>
#include <queue.h>
ADC adc;
const int bufferSize = 512;
uint16_t bufferA0[bufferSize];
uint16_t bufferA1[bufferSize];
uint32_t bufferSumA0 = 0;
uint32_t bufferSumA1 = 0;
uint16_t avSampleA0 = 0;
uint16_t peakA1 = 0;
DMAChannel dmaA0;
DMAChannel dmaA1;
int dmaBufferSize = bufferSize * sizeof(uint16_t);
volatile bool dmaA0TransferComplete = false;
volatile bool dmaA1TransferComplete = false;
SemaphoreHandle_t semA7 = NULL;
SemaphoreHandle_t semA13 = NULL;
QueueHandle_t queuePrint = NULL;
typedef struct {
uint16_t avSampleA0;
uint16_t peakA1;
} printMessage_t;
void taskADCA7(void *pvParameters)
{
for (;;) {
xSemaphoreTake(semA7, portMAX_DELAY);
bufferSumA0 = 0;
for (int i = 0; i < bufferSize; i++) {
bufferA0[i] = adc.analogRead(A7);
bufferSumA0 += bufferA0[i];
}
avSampleA0 = bufferSumA0 / bufferSize;
xQueueSend(queuePrint, &avSampleA0, portMAX_DELAY);
}
}
void taskADCA13(void *pvParameters)
{
for (;;) {
xSemaphoreTake(semA13, portMAX_DELAY);
bufferSumA1 = 0;
peakA1 = 0;
for (int i = 0; i < bufferSize; i++) {
bufferA1[i] = adc.analogRead(A13);
bufferSumA1 += bufferA1[i];
if (bufferA1[i] > peakA1) {
peakA1 = bufferA1[i];
}
}
xQueueSend(queuePrint, &peakA1, portMAX_DELAY);
}
}
void taskPrint(void *pvParameters)
{
uint16_t avSampleA0;
uint16_t peakA1;
for (;;) {
xQueueReceive(queuePrint, &avSampleA0, portMAX_DELAY);
xQueueReceive(queuePrint, &peakA1, portMAX_DELAY);
Serial.print("A7 Average: ");
Serial.print(avSampleA0);
Serial.print(", A13 Peak: ");
Serial.println(peakA1);
vTaskDelay(pdMS_TO_TICKS(100)); // delay for 100 milliseconds before running again
}
}
void taskPWM(void *pvParameters)
{
// TODO: Implement PWM task
}
void setup()
{
Serial.begin(115200);
adc.setReference(ADC_REFERENCE::REF_3V3); // set the ADC reference voltage to 3.3V
adc.setAveraging(1); // set the number of ADC readings to average to 0
adc.setResolution(12); // set the ADC resolution to 12 bits
adc.setConversionSpeed(ADC_CONVERSION_SPEED::VERY_HIGH_SPEED); // set the ADC conversion speed to very high speed
adc.setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED); // set the ADC sampling speed to very high speed
dmaA0.begin(true); // set the DMA channel to be interrupt-based
dmaA0.destinationBuffer(bufferA0, dmaBufferSize); // set the destination buffer to buffer
dmaA0.attachInterrupt([]() {
dmaA0TransferComplete = true;
dmaA0.clearInterrupt();
});
dmaA1.begin(true);
dmaA1.destinationBuffer(bufferA1, dmaBufferSize);
dmaA1.attachInterrupt([]() {
dmaA1TransferComplete = true;
dmaA1.clearInterrupt();
});
adc.adc0->enableDMA();
adc.adc1->enableDMA();
dmaA0.transferSize(bufferSize);
dmaA1.transferSize(bufferSize);
// Start the continuous conversions on A7 and A13
adc.startContinuous(A7, A13);
// Create the time semaphores
semA7 = xSemaphoreCreateBinary();
semA13 = xSemaphoreCreateBinary();
// Create the message queue
queuePrint = xQueueCreate(10, sizeof(printMessage_t));
// Create the tasks
xTaskCreate(taskADCA7, "ADCA7", 1000, NULL, 1, NULL);
xTaskCreate(taskADCA13, "ADCA13", 1000, NULL, 1, NULL);
xTaskCreate(taskPrint, "Print", 1000, NULL, 1, NULL);
xTaskCreate(taskPWM, "PWM", 1000, NULL, 1, NULL);
// Start the scheduler
vTaskStartScheduler();
}
void loop()
{
// Empty. All tasks are running independently under the FreeRTOS scheduler.
}
Gives me the follow errors:
Code:
In file included from C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC.h:59:0,
from C:\Users\soren\OneDrive\Documents\Arduino\2Channel_DMA_ADC_Sample\2Channel_DMA_ADC_Sample.ino:3:
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'void ADC_Module::continuousMode()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:248:9: error: 'atomic' has not been declared
atomic::setBitFlag(adc_regs.GC, ADC_GC_ADCO);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'void ADC_Module::singleMode()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:257:9: error: 'atomic' has not been declared
atomic::clearBitFlag(adc_regs.GC, ADC_GC_ADCO);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'void ADC_Module::setSoftwareTrigger()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:284:9: error: 'atomic' has not been declared
atomic::clearBitFlag(adc_regs.CFG, ADC_CFG_ADTRG);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'void ADC_Module::setHardwareTrigger()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:294:9: error: 'atomic' has not been declared
atomic::setBitFlag(adc_regs.CFG, ADC_CFG_ADTRG);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'volatile bool ADC_Module::isConverting()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:309:16: error: 'atomic' has not been declared
return atomic::getBitFlag(adc_regs.GS, ADC_GS_ADACT);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'volatile bool ADC_Module::isComplete()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:326:16: error: 'atomic' has not been declared
return atomic::getBitFlag(adc_regs.HS, ADC_HS_COCO0);
^
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h: In member function 'volatile bool ADC_Module::isContinuous()':
C:\Users\soren\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.57.1\libraries\ADC/ADC_Module.h:353:16: error: 'atomic' has not been declared
return atomic::getBitFlag(adc_regs.GC, ADC_GC_ADCO);
^
exit status 1
Compilation error: exit status 1
The purpose of the code is to sample on 2 different channels, and then also print a PWM. I have yet to do the PWM.
Then a separate task to print the values from the 2 ADC tasks.
However, it's giving me the "atomic" error, which I am unsure what the relation is.
EDIT: I get the error, whether or not I've included the atomic.h header.
EDIT 2: It's on a Teensy 4.1
Last edited: