Skip to content

Commit 15455eb

Browse files
committed
DU compile is working now!
1 parent aa439c4 commit 15455eb

23 files changed

Lines changed: 1129 additions & 586 deletions

.github/workflows/compile-examples.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,10 @@ jobs:
229229
flash-class: 128
230230
- device-family: eb
231231
flash-class: 64
232-
# Only headers for 16EB released.
233232
- device-family: eb
234-
flash-class: 32
233+
pincount: 64
234+
- device-family: eb
235+
pincount: 48
235236
# ugly Dx/Ex hack. Dx excludes 20 MHz internal osc, Ex 24 MHz.
236237
- int-osc: 20
237238
device-family: da
@@ -304,8 +305,6 @@ jobs:
304305
- overclock-osc: 16
305306
device-family: ea
306307
clocksource: extclock
307-
- device-family: eb
308-
- device-family: du
309308
steps:
310309
- name: Checkout repository
311310
uses: actions/checkout@v4

ChangeLog.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ These items are in addition to what was listed under changes already in release.
88
* Enhancement: We need pinout diagrams for DU-series too!
99
* Enhancement: We need pinout diagrams for EB-series too!
1010
* Enhancement: AVRdude ~7.2~ 8.0 out.
11-
* Bugfix: Make serialupdi work with EA, EB **CRITICAL**
11+
* ~Bugfix: Make serialupdi work with EA, EB **CRITICAL**~ Donq
1212
* Enhancement: Implement sleep library
1313
* Re-add SPI attach and detach.
1414
* Ensure libraries in sync with megaTinyCore.
@@ -32,6 +32,8 @@ These items are in addition to what was listed under changes already in release.
3232
* Remove the UPDI as GPIO pin option from non-optiboot parts because an analysis revealed that there was no configuration in which DxCore could be used in it's present form with the UPDI as GPIO option selected could be used with supported hardwae to prodice results other than bricked chips that core and supported hardware is unable to recover. Accordingly, these options should not be left as traps for the unwary.
3333
* Major documentation improvements focusing on main README.md.
3434
* Major documentation improvements focusing on Ref_Analog and Ref_Interrupts, the latter of which was previously the same file from megaTinyCore.
35+
* Correct bug in ADC init code that set Ex-series parts to the wrong ADC clock speed.
36+
*
3537

3638
### 1.5.11 (Emergency fix)
3739
* At some point in the recent past, I must have angered the gods of C, and suddenly millis disabled stopped working - the system would hang (actually, with in-depth investigation, it was shown to be bootlooping - before it called init(), it was calling 0x0000 (a dirty reset) instead of eliding a weakly defined function with nothing in the body except a return, or with an empty body. Why was it doing this? And why only when millis was disabled?). millis disabled is a key piece of core functionality, necessitating an urgent fix. Moving the definitions into main.cpp resolved this issue. (#485)

megaavr/cores/dxcore/UART0.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@
8383
}
8484
#endif
8585

86-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
86+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
87+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
8788
ISR(USART0_RXC_vect) {
8889
HardwareSerial::_rx_complete_irq(Serial);
8990
}

megaavr/cores/dxcore/UART1.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
}
5656
#endif
5757

58-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
58+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
59+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16))
5960
ISR(USART1_RXC_vect) {
6061
HardwareSerial::_rx_complete_irq(Serial1);
6162
}

megaavr/cores/dxcore/UART2.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
}
6060
#endif
6161

62-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
62+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
63+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16))
6364
ISR(USART2_RXC_vect) {
64-
HardwareSerial::_rx_complete_irq(Serial);
65+
HardwareSerial::_rx_complete_irq(Serial2);
6566
}
6667
#else
6768
ISR(USART2_RXC_vect, ISR_NAKED) {

megaavr/cores/dxcore/UART3.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
}
6060
#endif
6161

62-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
62+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
63+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16))
6364
ISR(USART3_RXC_vect) {
64-
HardwareSerial::_rx_complete_irq(Serial);
65+
HardwareSerial::_rx_complete_irq(Serial3);
6566
}
6667
#else
6768
ISR(USART3_RXC_vect, ISR_NAKED) {
@@ -84,7 +85,7 @@
8485
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) && \
8586
(SERIAL_TX_BUFFER_SIZE == 256 || SERIAL_TX_BUFFER_SIZE == 128 || SERIAL_TX_BUFFER_SIZE == 64 || SERIAL_TX_BUFFER_SIZE == 32 || SERIAL_TX_BUFFER_SIZE == 16))
8687
ISR(USART3_DRE_vect) {
87-
HardwareSerial::_tx_data_empty_irq(Serial);
88+
HardwareSerial::_tx_data_empty_irq(Serial3);
8889
}
8990
#else
9091
ISR(USART3_DRE_vect, ISR_NAKED) {

megaavr/cores/dxcore/UART4.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
}
6060
#endif
6161

62-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
62+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
63+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16))
6364
ISR(USART4_RXC_vect) {
64-
HardwareSerial::_rx_complete_irq(Serial);
65+
HardwareSerial::_rx_complete_irq(Serial4);
6566
}
6667
#else
6768
ISR(USART4_RXC_vect, ISR_NAKED) {
@@ -84,7 +85,7 @@
8485
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) && \
8586
(SERIAL_TX_BUFFER_SIZE == 256 || SERIAL_TX_BUFFER_SIZE == 128 || SERIAL_TX_BUFFER_SIZE == 64 || SERIAL_TX_BUFFER_SIZE == 32 || SERIAL_TX_BUFFER_SIZE == 16))
8687
ISR(USART4_DRE_vect) {
87-
HardwareSerial::_tx_data_empty_irq(Serial);
88+
HardwareSerial::_tx_data_empty_irq(Serial4);
8889
}
8990
#else
9091
ISR(USART4_DRE_vect, ISR_NAKED) {

megaavr/cores/dxcore/UART5.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
}
6060
#endif
6161

62-
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && (SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) /* && defined(USART1)*/)
62+
#if !(defined(USE_ASM_RXC) && (USE_ASM_RXC == 1 || USE_ASM_RXC == 2) && \
63+
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16))
6364
ISR(USART5_RXC_vect) {
64-
HardwareSerial::_rx_complete_irq(Serial);
65+
HardwareSerial::_rx_complete_irq(Serial5);
6566
}
6667
#else
6768
ISR(USART5_RXC_vect, ISR_NAKED) {
@@ -84,7 +85,7 @@
8485
(SERIAL_RX_BUFFER_SIZE == 256 || SERIAL_RX_BUFFER_SIZE == 128 || SERIAL_RX_BUFFER_SIZE == 64 || SERIAL_RX_BUFFER_SIZE == 32 || SERIAL_RX_BUFFER_SIZE == 16) && \
8586
(SERIAL_TX_BUFFER_SIZE == 256 || SERIAL_TX_BUFFER_SIZE == 128 || SERIAL_TX_BUFFER_SIZE == 64 || SERIAL_TX_BUFFER_SIZE == 32 || SERIAL_TX_BUFFER_SIZE == 16))
8687
ISR(USART5_DRE_vect) {
87-
HardwareSerial::_tx_data_empty_irq(Serial);
88+
HardwareSerial::_tx_data_empty_irq(Serial5);
8889
}
8990
#else
9091
ISR(USART5_DRE_vect, ISR_NAKED) {

megaavr/cores/dxcore/core_devices.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,15 +1042,15 @@ DB silicon with die rev 0x11 is available.*/
10421042
#define ADC_MAXIMUM_ACCUMULATE (1024) // This allows the 5 extra bits of resolution
10431043
#define ADC_RESULT_SIZE (24)
10441044
#define ADC_SIGNCHOPPING (1) // if defined, sign chopping can be enabled
1045-
#elif defined(ADC0_MUXNEG) /* I don't know what unofficial version to use. It's a *downgrade* of the v2.0 to capabilities below what I dubbed the 1.5 */
1045+
#elif defined(ADC_LOWLAT_bm)
10461046
#define ADC_VERSION (0xFA) // F'n A! The DU had it rough at the hands of the USB natives...
10471047
#define ADC_DIFFERENTIAL (0) // They took his differential mode!
1048-
#define ADC_MAX_OVERSAMPLED_RESOLUTION (13) // He can only remember 64 samples in accumulated mode (memory loss from repeated blows to the head)
1049-
#define ADC_NATIVE_RESOLUTION (10) // and ah.. they took off two bits... *I told him they weren't friendly...
1050-
#define ADC_NATIVE_RESOLUTION_LOW (8)
1051-
#define ADC_MAXIMUM_ACCUMULATE (1024) // This allows the 5 extra bits of resolution
1052-
#define ADC_RESULT_SIZE (24)
1053-
#define ADC_SIGNCHOPPING (1)
1048+
#define ADC_MAX_OVERSAMPLED_RESOLUTION (13) // Memory loss too - He can only remember 64 samples in accumulated mode...
1049+
#define ADC_NATIVE_RESOLUTION (10) // and ah.. they took off two bits
1050+
#define ADC_NATIVE_RESOLUTION_LOW (8) // *I told him they weren't friendly...
1051+
#define ADC_MAXIMUM_ACCUMULATE (64)
1052+
#define ADC_RESULT_SIZE (16)
1053+
#define ADC_SIGNCHOPPING (0)
10541054

10551055
#else // Dx-series ADCs are less fancy.
10561056
#define ADC_DIFFERENTIAL (1) // Crapola differential ADC that is effectively kicking off two ADCs at once

megaavr/cores/dxcore/wiring.c

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,12 +1891,55 @@ void nudge_millis(__attribute__((unused)) uint16_t nudgesize) {
18911891

18921892

18931893

1894-
18951894
#if defined(ADC0)
18961895
void __attribute__((weak)) init_ADC0() {
18971896
ADC_t* pADC;
18981897
_fastPtr_d(pADC, &ADC0);
1899-
#if !defined(ADC0_PGACTRL)
1898+
1899+
#if defined(ADC0_TEMP2) /* New/Good ADC 2.1 */
1900+
// Target = 2MHz, 2-6 MHz is only allowed with Vdd or external as reference.
1901+
#if F_CPU > 32000000 // 36 MHz /20 = 1.80 MHz
1902+
pADC->CTRLB = ADC_PRESC_DIV20_gc; // 33 MHz /20 = 1.67 MHz
1903+
#elif F_CPU > 28000000 // 32 MHz /16 = 2.00 MHz
1904+
pADC->CTRLB = ADC_PRESC_DIV16_gc; // 28 MHz /16 = 1.75 MHz
1905+
#elif F_CPU > 24000000 // 25 MHz /14 = 1.78 MHz
1906+
pADC->CTRLB = ADC_PRESC_DIV14_gc; // 24 MHz /12 = 2.00 MHz
1907+
#elif F_CPU > 20000000
1908+
pADC->CTRLB = ADC_PRESC_DIV10_gc; // 20 MHz / 10 = 2.00 MHz
1909+
#elif F_CPU > 16000000
1910+
pADC->CTRLB = ADC_PRESC_DIV6_gc; // 16 MHz / 8 = 2.00 MHz
1911+
#elif F_CPU > 12000000
1912+
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 12 MHz / 6 = 2.00 MHz
1913+
#elif F_CPU > 6000000 // 10 MHz / 6 = 1.67 MHz
1914+
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 8 MHz / 4 = 2.00 MHz
1915+
#else // 5 MHz / 4 = 1.25 MHz
1916+
pADC->CTRLB = ADC_PRESC_DIV2_gc; // 4 MHz / 2 = 2.00 MHz
1917+
#endif // 1 MHz / 2 = 500 kHz
1918+
pADC->CTRLE = 15; // 15.5 without PGA, 16 with PGA, corresponding to 7.75 or 8 us.
1919+
pADC->CTRLA = ADC_ENABLE_bm | ADC_LOWLAT_bm;
1920+
pADC->PGACTRL = ADC_PGABIASSEL_75PCT_gc; // Default for PGA settings.
1921+
#elif defined(ADC_LOWLAT_bm) /* what version number comes between 1.5 and 2.0, but is after 2.1? */
1922+
#if F_CPU > 32000000
1923+
pADC->CTRLB = ADC_PRESC_DIV20_gc; // 36 MHz /20 = 1.80 MHz
1924+
#elif F_CPU > 28000000 // 33 MHz /20 = 1.67 MHz
1925+
pADC->CTRLB = ADC_PRESC_DIV16_gc; // 32 MHz /16 = 2.00 MHz
1926+
#elif F_CPU > 24000000 // 28 MHz /16 = 1.75 MHz
1927+
pADC->CTRLB = ADC_PRESC_DIV14_gc; // 25 MHz /14 = 1.78 MHz
1928+
#elif F_CPU > 20000000
1929+
pADC->CTRLB = ADC_PRESC_DIV12_gc; // 24 MHz /12 = 2.00 MHz
1930+
#elif F_CPU > 16000000 // 20 MHz / 10 = 2.00 MHz
1931+
pADC->CTRLB = ADC_PRESC_DIV10_gc; // 16 MHz / 8 = 2.00 MHz
1932+
#elif F_CPU > 12000000
1933+
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 12 MHz / 6 = 2.00 MHz
1934+
#elif F_CPU > 6000000 // 10 MHz / 6 = 1.67 MHz
1935+
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 8 MHz / 4 = 2.00 MHz
1936+
#else // 5 MHz / 4 = 1.25 MHz
1937+
pADC->CTRLB = ADC_PRESC_DIV2_gc; // 4 MHz / 2 = 2.00 MHz
1938+
#endif // 1 MHz / 2 = 500 kHz
1939+
pADC->CTRLE = 15; // 15.5 without PGA, 16 with PGA, corresponding to 7.75 or 8 us.
1940+
pADC->CTRLA = ADC_ENABLE_bm | ADC_LOWLAT_bm;
1941+
#else /* AVR DA/DB/DD */
1942+
// Target is again 2 MHz, the maximum the Dx is rated for.
19001943
#if F_CPU >= 48000000
19011944
pADC->CTRLC = ADC_PRESC_DIV48_gc; // 1 @ 48 MHz
19021945
#elif F_CPU > 40000000
@@ -1932,43 +1975,14 @@ void nudge_millis(__attribute__((unused)) uint16_t nudgesize) {
19321975
pADC->COMMAND = 0x01;
19331976
pADC->COMMAND = 0x02;
19341977
#endif
1935-
1936-
#else
1937-
/* On the 2-series maximum with internal reference is 3 MHz, so we will
1938-
* target highest speed that doesn't exceed that and 16 ADC clocks sample
1939-
* duration. */
1940-
#if F_CPU > 32000000 // 36 MHz /14 = 2.57 MHz
1941-
pADC->CTRLB = ADC_PRESC_DIV10_gc; // 33 MHz /14 = 2.35 MHz
1942-
#elif F_CPU >= 30000000 // 32 MHz /12 = 2.67 MHz
1943-
pADC->CTRLB = ADC_PRESC_DIV12_gc; // 30 MHz /12 = 2.50 MHz
1944-
#elif F_CPU >= 24000000 // 25 MHz /10 = 2.50 MHz
1945-
pADC->CTRLB = ADC_PRESC_DIV10_gc; // 24 MHz /10 = 2.40 MHz
1946-
#elif F_CPU >= 20000000
1947-
pADC->CTRLB = ADC_PRESC_DIV8_gc; // 20 MHz / 8 = 2.50 MHz
1948-
#elif F_CPU >= 16000000
1949-
pADC->CTRLB = ADC_PRESC_DIV6_gc; // 16 MHz / 6 = 2.67 MHz
1950-
#elif F_CPU >= 12000000
1951-
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 12 MHz / 4 = 3.00 MHz
1952-
#elif F_CPU >= 6000000 // 10 MHz / 4 = 2.50 MHz
1953-
pADC->CTRLB = ADC_PRESC_DIV4_gc; // 8 MHz / 4 = 2.00 MHz
1954-
#else // 5 MHz / 2 = 2.50 MHz
1955-
pADC->CTRLB = ADC_PRESC_DIV2_gc; // 4 MHz / 2 = 2.00 MHz
1956-
#endif // 1 MHz / 2 = 500 kHz
1957-
pADC->CTRLE = 15; // 15.5 without PGA, 16 with PGA, corresponding to 7.75 or 8 us.
1958-
pADC->CTRLA = ADC_ENABLE_bm | ADC_LOWLAT_bm;
1959-
pADC->PGACTRL = ADC_PGABIASSEL_75PCT_gc;
1960-
/* Note that we don't *enable* it automatically in init().
1961-
* 3/4th bias is good up to 4.5 MHz CLK_ADC, 15 ADC Clocks to sample the PGA
1962-
* up to 5 MHz, so within the regime of speeds that have to be compatible
1963-
* with internal references, we are in the clear there. */
1964-
#endif
1978+
#endif // End EA/DU/Other selection
19651979
analogReference(VDD);
19661980
#if defined(DAC0)
19671981
DACReference(VDD);
19681982
#endif
19691983
}
19701984
#endif
1971-
#if defined(ADC1)
1985+
#if defined(ADC1) /* presently, only relevant for tiny1. */
19721986
void __attribute__((weak)) init_ADC1() {
19731987
ADC_t* pADC;
19741988
_fastPtr_d(pADC, &ADC1);
@@ -1995,7 +2009,7 @@ void nudge_millis(__attribute__((unused)) uint16_t nudgesize) {
19952009
pADC->CTRLC = ADC_PRESC_DIV2_gc;
19962010
#endif
19972011
pADC->SAMPCTRL = 14; // 16 ADC clock sampling time - should be about the same amount of *time* as originally?
1998-
// This is WAY conservative! We could drop it down...
2012+
// This is WAY conservative! You can drop it way down to speed up ADC reads if the source is reasonably low impedance. .
19992013
pADC->CTRLD = ADC_INITDLY_DLY64_gc; // VREF can take 50uS to become ready, and we're running the ADC clock
20002014
// at around 1 MHz, so we want 64 ADC clocks when we start up a new reference so we don't get bad readings at first
20012015
/* Enable ADC */

0 commit comments

Comments
 (0)