Having a great deal of issues with the following code. without the #if defined (arduino_teensy40)
this code runs flawlessly on a teensy 3.6. When the code has been updated to T4 -- there is a major error reported with the following errors:
I am unable to find documentation that points to the setting of the ADC for teensy 4
If anyone can help me figure out the errors that are happening... I am assuming that the the code is referencing registers that don't exist?
Wrong ADC registers?
this code runs flawlessly on a teensy 3.6. When the code has been updated to T4 -- there is a major error reported with the following errors:
'ADC0_CFG1' was not declared in this scope
sketch_feb18a: In function 'void setup()':
sketch_feb18a:39: error: 'ADC0_CFG1' was not declared in this scope
ADC0_CFG1 = 0b00011000;
^
sketch_feb18a:48: error: 'ADC0_CFG2' was not declared in this scope
ADC0_CFG2 = 0b00000;
^
sketch_feb18a:59: error: 'ADC0_SC2' was not declared in this scope
ADC0_SC2 = 0b0000000;
^
sketch_feb18a:71: error: 'ADC0_SC3' was not declared in this scope
ADC0_SC3 = 0b10000111;
^
sketch_feb18a:74: error: 'ADC_SC3_CAL' was not declared in this scope
while (ADC0_SC3 & ADC_SC3_CAL) {}
^
sketch_feb18a:78: error: 'ADC0_CLPS' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:78: error: 'ADC0_CLP4' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:78: error: 'ADC0_CLP3' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:78: error: 'ADC0_CLP2' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:78: error: 'ADC0_CLP1' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:78: error: 'ADC0_CLP0' was not declared in this scope
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
^
sketch_feb18a:80: error: 'ADC0_PG' was not declared in this scope
ADC0_PG = sum;
^
sketch_feb18a:81: error: 'ADC0_CLMS' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:81: error: 'ADC0_CLM4' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:81: error: 'ADC0_CLM3' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:81: error: 'ADC0_CLM2' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:81: error: 'ADC0_CLM1' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:81: error: 'ADC0_CLM0' was not declared in this scope
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
^
sketch_feb18a:83: error: 'ADC0_MG' was not declared in this scope
ADC0_MG = sum;
^
sketch_feb18a: In function 'void processData()':
sketch_feb18a:107: error: 'ADC0_SC1A' was not declared in this scope
ADC0_SC1A = 0b0000000;
^
sketch_feb18a:110: error: 'ADC_SC1_COCO' was not declared in this scope
while (!(ADC0_SC1A & ADC_SC1_COCO)) {}
^
sketch_feb18a:113: error: 'ADC0_RA' was not declared in this scope
ADC_res = ADC0_RA;
^
sketch_feb18a:120: error: 'GPIOC_PDOR' was not declared in this scope
GPIOC_PDOR |= 1; // 1 = 1<<0
^
I am unable to find documentation that points to the setting of the ADC for teensy 4
If anyone can help me figure out the errors that are happening... I am assuming that the the code is referencing registers that don't exist?
Wrong ADC registers?
Code:
#if defined(ARDUINO_TEENSY40)
//
// code for Teensy 4.0 only
//
#elif defined(ARDUINO_TEENSY40)
//
// code for Teensy 4.0 only
//
#endif
// Result from ADC
int ADC_res;
void setup() {
// Prepare USB connection
Serial.begin(0);
// Prepare output signal
pinMode(13, OUTPUT);
// Prepare reset signal
pinMode(15, OUTPUT);
// Prepare intterrupt signal
pinMode(14, INPUT);
attachInterrupt(14, processData, RISING);
// Configure ADC
/* DEFAULT
0 ADLPC (Low-Power Configuration)
0 ADIV (Clock Divide Select)
0
0 ADLSMP (Sample time configuration)
0 MODE (Conversion mode selection) (00=8/9, 01=12/13, 10=10/11, 11=16/16 bit; diff=0/1)
0
0 ADICLK (Input Clock Select)
0
*/
ADC0_CFG1 = 0b00011000;
/* DEFAULT
0 MUXSEL (ADC Mux Select)
0 ADACKEN (Asynchrononous Clock Output Enable)
0 ADHSC (High-Speed Configuration)
0 ADLSTS (Long Sample Time Select) (00=+20 cycles, 01=+12, 10=+6, 11=+2)
0
*/
ADC0_CFG2 = 0b00000;
/* DEFAULT
0 ADTRG (Conversion Trigger Select)
0 ACFE (Compare Function Enable)
0 ACFGT (Compare Function Greater than Enable)
0 ACREN (Compare Function Range Enable)
0 ACREN (COmpare Function Range Enable)
0 DMAEN (DMA Enable)
0 REFSEL (Voltage Reference Selection) (00=default,01=alternate,10=reserved,11=reserved)
*/
ADC0_SC2 = 0b0000000;
/* DEFAULT
0 CAL (Calibration)
0 CALF (read only)
0 (Reserved)
0
0 ADCO (Continuous Conversion Enable)
0 AVGS (Hardware Average Enable)
0 AVGS (Hardware Average Select) (00=4 times, 01=8, 10=16, 11=32)
0
*/
ADC0_SC3 = 0b10000111;
// Waiting for calibration to finish. The documentation is confused as to what flag to be waiting for (SC3[CAL] on page 663 and SC1n[COCO] on page 687+688).
while (ADC0_SC3 & ADC_SC3_CAL) {}
uint16_t sum;
sum = ADC0_CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0;
sum = (sum / 2) | 0x8000;
ADC0_PG = sum;
sum = ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0;
sum = (sum / 2) | 0x8000;
ADC0_MG = sum;
/* End of borrowed code */
}
void loop() {
}
void processData() {
// Wait for signal to reach peak
delayMicroseconds(2);
// DEBUG: Signal HIGH that ADC and then USB will be running
//GPIOC_PDOR |= 1<<5;
// Start ADC
/* DEFAULT
0 AIEN (Interrupt Enable)
0 DIFF (0=single, 1=diff)
1 ADCH (00000=A10 for DIFF=0; 00000=A10+A11 for DIFF=1; See page 98 in documentation)
1
1
1
1
*/
ADC0_SC1A = 0b0000000;
// Wait for ADC
while (!(ADC0_SC1A & ADC_SC1_COCO)) {}
// Retrieve data from ADC
ADC_res = ADC0_RA;
// Send data away
Serial.println( ADC_res );
Serial.send_now();
// Set RESET signal to HIGH for 1 µs
GPIOC_PDOR |= 1; // 1 = 1<<0
delayMicroseconds(1);
// DEBUG: Signal LOW that ADC and USB are done (takes ~40 µs with max cycles and sampling at 16 bit)
// And set RESET signal to LOW
//GPIOC_PDOR &= ~(1<<5 | 1);
GPIOC_PDOR &= ~1;
}