- | AVR32DA28 | AVR64DA28 | AVR128DA28 |
---|---|---|---|
Flash Memory | 32768 | 65536 | 131072 |
Flash Memory (With Optiboot) | 32256 | 65024 | 130560 |
SRAM | 4096 | 8192 | 16384 |
EEPROM | 512 | 512 | 512 |
User Row | 32 | 32 | 32 |
Max. Frequency (rated, MHz) | 24 | 24 | 24 |
Clock Sources | INT, EXT | INT, EXT | INT, EXT |
Packages Available | SOIC, SSOP, DIP | SOIC, SSOP, DIP | SOIC, SSOP, DIP |
Total pins on package | 28 | 28 | 28 |
I/O Pins (not reset/UPDI) | 22 | 22 | 22 |
Fully async pins | 6 | 6 | 6 |
UPDI as I/O Pin | No | No | No |
PWM capable I/O pins | 20 | 20 | 20 |
Max simultaneous PWM outputs | 11: 6+2+3 | 11: 6+2+3 | 11: 6+2+3 |
16-bit Type A Timers - pins ea | 1: 18 | 1 18 | 1: 18 |
16-bit Type B Timers, (pins) | 3: 3 | 3: 3 | 3: 3 |
12-bit Type D pins | 4 |
4 |
4 |
USART (pin mappings) | 3: 2/1/1 | 3: 2/1/2 | 3: 2/1/1 |
SPI (pin mappings) | 2: 1/1 | 2: 1/1 | 2: 1/1 |
TWI/I2C (pin mappings) | 1: 2 | 1: 2 | 1: 2 |
12-bit ADC input pins | 10 | 10 | 10 |
Of those, neg. diff. inputs | 8 | 8 | 8 |
10-bit DAC | 1 | 1 | 1 |
Analog Comparator (AC) | 3 | 3 | 3 |
Zero-Cross Detectors (ZCD) | 1 | 1 | 1 |
Custom Logic Blocks (LUTs) | 4 | 4 | 4 |
Event System channels (out pins) | 8: 7 | 8: 7 | 8: 7 |
On-chip opamps (OPAMP) | - | - | - |
MVIO, pins | Yes, 4 | Yes, 4 | Yes, 4 |
Flash Endurance | 1k |
1k |
1k |
LED_BUILTIN (and optiboot led) | PIN_PA7 | PIN_PA7 | PIN_PA7 |
*
As with all Dx-series, the flash didn't live up to expectations at extreme conditions. 1k is the worst case rating though, and under typical conditions, it is believed that the endurance is >= 10k cycles. I do not know how far along Microchip is in developing a solution, but it's being treated as datasheet clarification, so that's not encouraging. I am hoping for additional information on how flash endurance is influenced by various factors.
This is a DA32 - without the last 4 pins of PORTF. This is more of a blow than you would expect, because it costs us the only pins for the TWI1, a USART mapping, and a very good TCA mapping. The DA/DB-series parts kinda fall flat when they get down to 28 pins.
Pins 2 and 6 within each port are "fully async" and can respond to events shorter than 1 clock cycle, and can wake the chip on RISING or FALLING edges, not just LOW_LEVEL and CHANGE. The rest are "partially async" and can only respond to "low level" or "change" if there is no system clock running (all interrupt triggers will work if the I/O clock is running due to an RUNSTBY that requests it or because you are only in idle sleep mode).
All | TX | RX | XDIR | XCK |
---|---|---|---|---|
DEFAULT | PA0 | PA1 | PA2 | PA3 |
ALT1 | PA4 | PA5 | PA6 | PA7 |
NONE | - | - | - | - |
They don't get any mux options.
All | TX | RX | XDIR | XCK |
---|---|---|---|---|
USART1 | PC0 | PC1 | PC2 | PC3 |
USART2 | PF0 | PF1 | - | - |
SPI | Swap name | MOSI | MISO | SCK | SS |
---|---|---|---|---|---|
SPI0 DEFAULT | SPI0_SWAP0 | PA4 | PA5 | PA6 | PA7 |
SPI1 DEFAULT | SPI1_SWAP0 | PC0 | PC1 | PC2 | PC3 |
The SPI library only makes one SPIClass object available (see The SPI.h library documentation for details).
Mapping | swap | Master or Slave | Dual Mode Slave |
---|---|---|---|
DEFAULT | 0 | SDA/PA2 SCL/PA3 | SDA/PC2 SCL/PC3 |
ALT2 | 2 | SDA/PC2 SCL/PC3 | Not avail. |
Note that this means that you want Wire.swap(0, 2, but not 1).
- TCA0 is by default set to PORTD - PORTA is too crowded, PORTC is not complete.
- TCD0 is left at the default pins on PORTA, because they are the only ones that work.
- The 3 type B timers are set for PA2, PA3, and PC0, and this cannot be changed at runtime. Note that the millis timer cannot be used to generate PWM. TCB2 is the default millis timer, though this can be changed from the tools menu.
- This gives 6 + 2 + 3 = 11 PWM channels simultaneously outputting PWM (though only 10 with millis enabled), 50% of the total on the part!
- Our objective with the pin mappings was to first, maximize the number of PWM pins, and otherwise put the timer on the least useful pins, since the pin mappings were designed before we had made TCA PORTMUX aware, and now that it is, it is a single line operation to change it if you want or need a different mapping.
The Type A timers (TCA0 and TCA1) can be mapped to different pins as a group only, and analogWrite() is PORTMUX-aware - you can set TCA0 to output on any port's pin 0-5, and TCA1 to PORTB. Using this feature is easy - but not quite as trivial as other parts, since there are two bitfields. You simply write to the portmux register PORTMUX.TCAROUTEA =S (TCA0 pinset)
and then analogWrite() normally. TCA0 pinset is the port number (0-5 for ports A-F).
TCA0 | WO0 | WO1 | WO2 | WO3 | WO4 | WO5 |
---|---|---|---|---|---|---|
PORTA | PA0 | PA1 | PA2 | PA3 | PA4 | PA5 |
PORTC | PC0 | PC1 | PC2 | PC3 | - | - |
PORTD | PD0 | PD1 | PD2 | PD3 | PD4 | PD5 |
PORTF | PF0 | PF1 | - | - | - | - |
It is strongly recommended to not have any PWM output enabled involving either the timer being moved nor the pins it is being moved to when setting PORTMUX.TCAROUTEA
. In the latter case, you will not be able to turn off the existing PWM through the API functions.
PORTMUX.TCAROUTEA = PORTMUX_TCA0_PORTA_gc // PWM on PORTA
// Note since there is only one TCA, you can use simple assignment to write values to PORTMUX.TCAROUTEA to.
Note also that this core default differs from the hardware default - The hardware defaults to PORTA. This reduces the number of available independent simultaneous PWM channels by 2, as you would lose the two TCBs, which can only be on PA2 and PA3.
TCBn | Default | Alt | Notes |
---|---|---|---|
TCB0 | PA2 | - | . |
TCB1 | PA3 | - | . |
TCB2 | PC0 | - | Used for millis by default. |
There are no type B timer remapping options.
The type B timers are much better utility timers than PWM timers. TCB2 is the default millis timer and cannot be used for PWM in that mode.
TCD0 | WOA | WOB | WOC | WOD |
---|---|---|---|---|
DEFAULT | PA4 | PA5 | PA6 | PA7 |
- | - |
The Type D timer, TCD0, has 2 output channels (WOA and WOB) and 4 output pins (WOA, WOB, WOC, and WOD). The hardware permits WOC and WOD to each output either WOA or WOB, but this added too much complexity to analogWrite; WOA and WOC output WOA, and WOD and WOB output WOB. Calling analogWrite() on either pin will enable it, calling digitalWrite() on that pin will turn the PWM off. Calling analogWrite() on WOC while already outputting on the WOA pin will result in both pins outputting the new duty cycle. Call digital write on first pin if this is not what you want.
The datasheet describes TCD0 output on PA4-7, PB4-7, PF0-3, and PG4-7. What the datasheet giveth, the errata taketh away: the alternate pin options are hopelessly broken currently, only PA4-7 work.
Following precedent set by MegaCoreX, we declare that pin 7 - PIN_PA7
shall be the pin that the core "expects" to be connected to an LED. LED_BUILTIN is defined as that pin, and the bootloader will set that pin as output and try to blink the LED. Note that if the bootloader is not used, and your sketch does not reference LED_BUILTIN
this pin is not otherwise treated any differently. This can be overridden if a custom board definition is created by passing -DLED_BUILTIN = (some other pin)
in the build.extra_flags
field.
Reset (PF6) can be set to work as an input (but never an output). The UPDI pin cannot be configured as an I/O pin.
Only pins on PORTD can be used as the negative side of a differential analog reading (analogReadDiff()
, see Analog Reference). Pins on PORTF can be used as positive or single ended ADC inputs only. On parts with more pins, PORTE can also be used for negative inputs. The Dx-ADC is better than a no-frills classic
ADC - for one thing it gained two bits - but the differential mode is a little disappointing: It cannot be used if a voltage exceeds VRef: you get junk results even though the difference doesn't exceed VREF. This of course kills one of the popular uses of ADC differential mode = high side current sensing, where you'relooking at a voltage very close to Vdd, maybe you've turned up the gain and you'd use the lowest ref you had? Not if you're on a Dx-series you're not. No opamps here either to condition signals.
When all else fails, read the real documentation. They keep moving the .pdf files around, so now I just link to the prduct page, from whence the datasheet, errata, and "technical briefs".
Datasheets and errata change. You can sign up to get emails about such changes through the Microchip PCN system; if you don't, be sure to always use the latest version of the datasheet and especially the errata
At a minimum, everyone using a modern AVR should plan on having a PDF viewer open with the datasheet, and a text editor with a good search function and the ioavr______.h file open so that when you're trying to use a constant, but the compiler says it isn't declared/defined, you can search the io header for a key phrase in the constant and figure out how it was spelled/formatted or copy/paste it to your sketch. (see the IO headers for more information and links to them. I also keep the AVR instruction set manual open in the PDF viewer as well as the silicon errata and datasheet clarification. Datasheet clarifications are a bigger deal than an erratum, usually. An erratum says "Okay, this doesn't work, but it will some day, maybe" while a datasheet clarification says "This would be an errata, but we're not even going to pretend that we'll fix it some day". But watch out - datasheet clarifications vanish from the list once the datasheet has been updated!
The "silicon errata and datasheet clarification" is an extremely important document, particularly for parts like the DA with lots of errata. This document details lists and gives a terse description of ways in which they know that the hardware they are shipping does not behave as the datasheet describes. Both phrases are euphemisms. "Silicon Errata" are bugs in the hardware, which the manufacturer admits and agrees are incorrect behavior, and comes with a rarely fulfulled promise of a silicon revision to correct them. A "workaround" which may or may not be useful may by listed, or they may say "None". The workaround line may or may not be an accurate mirror on reality. For example, a "This feature does not work" erratum might have "Workaround: Do not use this feature" (not much of a workaround). But - for once - this goes both ways. An erratum listed as having no workaround occasionally in fact has a workaround. On he DA and DB, whichever pin the ADC is pointed at has it's digital input buffer disabled. All you need to to to work around that is set the ADC mux to point to something that's not a pin except when using it (that's what we do). I suspect a tunnel vision effect is in evidence here - in that example, I suspect that the problem was noticed in the context of trying to read the digital value of the pin while analog measurement was ongoing, so engineering was not thinking "Why the hell would anyone do that?!" but "Gee, yeah, there's no way you could do that", and nobody realized that there's a far more common case: the ADC is enabled, but not in use, and you may be doing other things with the pin.
That's the silicon errata part. Now the "datasheet clarification"? They are also usually silicon bugs (though a few are literal clarifications, or "clarifications" as in "we updated that, but forgot to tell documentation") - the Dx-series TCA Edge bit seems to have been such a case. The key difference between a silicon bug treated as an erratum and one treated with a datasheet clarifications is that an erratum indicates that the intended fix involves changing the die, while Datasheet Clarification involves changing the datasheet to say that the current behavior is correct. Datasheet clarifications sometimes downgrade specs significantly (like flash endurance under pessimal conditions, for example). And Datasheet Clarifications disappear from the errata when incorporated into the datasheet, so making certain to have matching versions of the datasheet and errata is essential.
The "Technical Briefs" are somewhat inconsistent in their value, but some are quite good.