Skip to content

Commit 145d80e

Browse files
committed
fix bug in compiler causing test failures, fix EB, DU support
1 parent 7bee763 commit 145d80e

2 files changed

Lines changed: 78 additions & 7 deletions

File tree

megaavr/libraries/Comparator/src/Comparator.cpp

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,62 @@ AltOUT | PIN_PC6* | PIN_PC6* | PIN_PC6* | n/a | PIN_PC6* | PIN_PC6* |
6161
#if defined(AC0_AC_vect)
6262
AnalogComparator Comparator0(0, AC0, PORTDPIN2, /* No in_p1 or in_p2 */ PORTD.PIN6CTRL, (IS_MVIO_ENABLED() ? AC_NULL_REG : PORTC.PIN3CTRL), PORTD.PIN3CTRL, PORTD.PIN7CTRL, (IS_MVIO_ENABLED() ? AC_NULL_REG : PORTC.PIN2CTRL));
6363
#endif
64+
#elif defined(ANALOG_COMP_PINS_DD)
65+
/* DD:1 AC: P0, P3, P4, N0, N1 N2*/
66+
/* IS_MVIO_ENABLED() may *or may not* be a compile time known constant!
67+
* This depends on the tools menu option selected for MVIO, and whether we can assume that the code is running on a properly configured part.
68+
* That is a safe assumption when we build for direct upload, since users will upload the code via UPDI and we can set the fuse then.
69+
* When using a bootloader, we have no such guarantee - we can't set the fuses when we upload, so unless the user tells us that they
70+
* really are sure it's configured right, we will test whether MVIO is enabled.
71+
* In any event, PD2 is only present on parts with the nearly complete PORTD. */
72+
#if _AVR_PINCOUNT > 28
73+
#define PORTDPIN0 PORTD.PIN0CTRL
74+
#define PORTDPIN2 PORTD.PIN2CTRL
75+
#define PORTDPIN3 PORTD.PIN3CTRL
76+
#else
77+
#define PORTDPIN0 AC_NULL_REG
78+
#define PORTDPIN2 AC_NULL_REG
79+
#define PORTDPIN3 AC_NULL_REG
80+
#endif
81+
#if defined(AC0_AC_vect)
82+
AnalogComparator Comparator0(0, AC0, PORTDPIN2, /* No PORTE, so none of these*/ PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* No INP5, nor INP6 on DUs */ PORTDPIN3, PORTDPIN0, PORTD.PIN7CTRL);
83+
#endif
6484
#elif defined(ANALOG_COMP_PINS_EA)
6585
/* EA:2 ACs: P0, P1, P2, P3, P4, N0, N1, N2, N3 */
86+
6687
#if defined(AC0_AC_vect)
6788
#if defined(PORTE)
68-
AnalogComparator Comparator0(0, AC0, PORTD.PIN2CTRL, PORTE.PIN0CTRL, PORTE.PIN2CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* EA-series has no MVIO */ PORTD.PIN3CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
89+
AnalogComparator Comparator0(0, AC0, PORTD.PIN2CTRL, PORTE.PIN0CTRL, PORTE.PIN2CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* No INP5, nor INP6 on EAs, */ PORTD.PIN3CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
6990
#else
70-
AnalogComparator Comparator0(0, AC0, PORTD.PIN2CTRL, AC_NULL_REG, AC_NULL_REG, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* EA-series has no MVIO */ PORTD.PIN3CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
91+
AnalogComparator Comparator0(0, AC0, PORTD.PIN2CTRL, AC_NULL_REG, AC_NULL_REG, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* No INP5, nor INP6 on EAs, */ PORTD.PIN3CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
7192
#endif
7293
#endif
7394
#if defined(AC1_AC_vect)
74-
AnalogComparator Comparator1(1, AC1, PORTD.PIN2CTRL, PORTD.PIN3CTRL, PORTD.PIN4CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* EA-series has no MVIO */ PORTD.PIN5CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
95+
AnalogComparator Comparator1(1, AC1, PORTD.PIN2CTRL, PORTD.PIN3CTRL, PORTD.PIN4CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL,/* No INP5, nor INP6 on EAs, */ PORTD.PIN5CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
7596
#endif
7697
#elif defined(ANALOG_COMP_PINS_EB)
7798
/* EB: 2 ACs: P0, P1, P2, P3, P4, P5, P6, N0, N1, N2, N3 */
78-
AnalogComparator Comparator0(0, AC0, PORTD.PIN2CTRL, AC_NULL_REG, AC_NULL_REG, PORTD.PIN6CTRL, PORTC.PIN3CTRL, PORTD.PIN4CTRL, PORTD.PIN5CTRL, PORTD.PIN3CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
79-
AnalogComparator Comparator1(1, AC1, PORTD.PIN2CTRL, PORTD.PIN3CTRL, PORTD.PIN4CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL, PORTA.PIN6CTRL, PORTA.PIN7CTRL, PORTD.PIN5CTRL, PORTD.PIN0CTRL, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
99+
#if _AVR_PINCOUNT <20
100+
#define PORTDPIN0 AC_NULL_REG
101+
#define PORTDPIN2 AC_NULL_REG
102+
#define PORTDPIN3 AC_NULL_REG /* 20 and 14 pin parts don't have the lower half of PORTD */
103+
#define PORTAPIN6 AC_NULL_REG
104+
#define PORTAPIN7 AC_NULL_REG /* 14 pin parts don't have pins A2~A7 */
105+
#elif _AVR_PINCOUNT <28
106+
#define PORTDPIN0 AC_NULL_REG
107+
#define PORTDPIN2 AC_NULL_REG
108+
#define PORTDPIN3 AC_NULL_REG /* 20 and 14 pin parts don't have the lower half of PORTD */
109+
#define PORTAPIN6 PORTA.PIN6CTRL
110+
#define PORTAPIN7 PORTA.PIN7CTRL
111+
#else
112+
#define PORTDPIN0 PORTD.PIN0CTRL
113+
#define PORTDPIN2 PORTD.PIN2CTRL
114+
#define PORTDPIN3 PORTD.PIN3CTRL
115+
#define PORTAPIN6 PORTA.PIN6CTRL
116+
#define PORTAPIN7 PORTA.PIN7CTRL /* 14 pin parts don't have pins A2~A7 */
117+
#endif
118+
AnalogComparator Comparator0(0, AC0, PORTDPIN2, AC_NULL_REG, AC_NULL_REG, PORTD.PIN6CTRL, PORTC.PIN3CTRL, PORTD.PIN4CTRL, PORTD.PIN5CTRL, PORTDPIN3, PORTDPIN0, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
119+
AnalogComparator Comparator1(1, AC1, PORTDPIN2, PORTDPIN3, PORTD.PIN4CTRL, PORTD.PIN6CTRL, PORTC.PIN3CTRL, PORTAPIN6, PORTAPIN7, PORTD.PIN5CTRL, PORTDPIN0, PORTD.PIN7CTRL, PORTC.PIN2CTRL);
80120
#elif defined(ANALOG_COMP_PINS_MEGA)
81121
/* mega0:1 AC P0, P1, P2, P3, N0, N1, N2*/
82122
#if defined(AC0_AC_vect)
@@ -179,6 +219,25 @@ AnalogComparator::AnalogComparator(
179219
IN0_N(in0_n),
180220
IN2_N(in2_n),
181221
IN3_N(in3_n) { }
222+
#elif defined(ANALOG_COMP_PINS_DD) /*6 inputs: P0, P3, P4, N0, N2, N3 */
223+
AnalogComparator::AnalogComparator(
224+
const uint8_t comp_number,
225+
AC_t& ac,
226+
register8_t& in0_p,
227+
register8_t& in3_p,
228+
register8_t& in4_p,
229+
register8_t& in0_n,
230+
register8_t& in1_n,
231+
register8_t& in2_n
232+
)
233+
: comparator_number(comp_number),
234+
AC(ac),
235+
IN0_P(in0_p),
236+
IN3_P(in3_p),
237+
IN4_P(in4_p),
238+
IN0_N(in0_n),
239+
IN1_N(in1_n)
240+
IN2_N(in2_n), { }
182241
#elif defined(ANALOG_COMP_PINS_EA) /*9 inputs P0, P1, P2, P3, P4, N0, N1, N2, N3 */
183242
AnalogComparator::AnalogComparator(
184243
const uint8_t comp_number,

megaavr/libraries/Comparator/src/Comparator.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
#if defined(DB_28_PINS) || defined(DB_32_PINS)
1616
#define ANALOG_COMP_NO_N1
1717
#endif
18-
#elif defined(__AVR_DD__) || defined(__AVR_DU__)
18+
#elif defined(__AVR_DD__)
1919
/* DD:1 AC: P0, P3, P4, N0, N2, N3 */
2020
#define ANALOG_COMP_PINS_DD
2121
#define AC_NULL_REG _SFR_MEM8(0x04B0)
2222
#define ANALOG_COMP_NO_N1
23-
#elif defined(__AVR_EA__)
23+
#elif defined(__AVR_DU__)
24+
/* DD:1 AC: P0, P3, P4, N0, N1, N2, */
25+
#define ANALOG_COMP_PINS_DU
26+
#define AC_NULL_REG _SFR_MEM8(0x04B0)=
2427
/* EA:2 ACs: P0, P1, P2, P3, P4, N0, N1, N2, N3 */
2528
#define ANALOG_COMP_PINS_EA
2629
#if !defined(PORTE)
@@ -246,6 +249,15 @@ class AnalogComparator {
246249
register8_t& in0_n,
247250
register8_t& in2_n,
248251
register8_t& in3_n);
252+
#elif defined(ANALOG_COMP_PINS_DU) /*Exactly like the DU, except there's no PC2 on any of them hence no INN3 but the 28/32 pin versions have PD0 unlike the DD's so they have that input. */
253+
AnalogComparator(const uint8_t comparator_number,
254+
AC_t& ac,
255+
register8_t& in0_p,
256+
register8_t& in3_p,
257+
register8_t& in4_p,
258+
register8_t& in0_n,
259+
register8_t& in1_n,
260+
register8_t& in2_n);
249261
#elif defined(ANALOG_COMP_PINS_EA) /*9 inputs - with 48 pins EA gets all inputs for at least one comparator. P0, P1, P2, P3, P4, N0, N1, N2, N3 */
250262
AnalogComparator(const uint8_t comparator_number,
251263
AC_t& ac,

0 commit comments

Comments
 (0)