- Slightly lower price
- Two more good timers
- Extra UART, SPI, and I2C
- 4 more PWMs
There are some major drawbacks though
- No more full-swing crystal oscillator
- Didn't work with the Arduino IDE when I tried
- Most toolchains don't support it yet out of the box
To program it with avr-gcc and avrdude requires a few extra steps. These steps are written for a Linux development computer and a usbasp programmer.
The first step is to download and install the usual versions of avrdude, avr-gcc, avr-objcopy, avr-binutils, and avr-libc. On Ubuntu, these are all packages that can be installed with apt.
The version of avrdude I have (6.2) didn't know about the 328pb, so I had to modify the avrdude.conf file. On my install of Ubuntu 16.04, this was in /etc/avrdude.conf. At the bottom, I added the lines:
part parent "m328" id = "m328pb"; desc = "ATmega328PB"; signature = 0x1e 0x95 0x16; ocdrev = 1; memory "efuse" size = 1; min_write_delay = 4500; max_write_delay = 4500; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x x x x x i i i i"; ; ;
which I got from here: https://lists.nongnu.org/archive/html/avrdude-dev/2016-06/msg00010.html
This is the same as the normal 328b, but has the correct device signature for the 328pb. As far as I can tell, the device signature is the only difference between the two.Next, we need to download a "pack" from Atmel's that tells gcc about the 328pb. I downloaded the Atmel ATmega Series Device Support Pack from packs.download.atmel.com
I had to copy all the *.h files from within the pack to /usr/lib/avr/include to get the avr io headers to work properly. I also put all the other files from the pack into a folder called `packs` in my project folder. Inside the packs folder should be folder like "gcc, include, templates..."
Now we can program the microcontroller:
First, compile the code with
avr-gcc test.c -DF_CPU=1000000 -mmcu=atmega328pb -c -B packs/gcc/dev/atmega328pb/
then, create an ELF then intel hex file with
avr-gcc -o test.elf test.o -DF_CPU=1000000 -mmcu=atmega328pb -c -B packs/gcc/dev/atmega328pb/
avr-objcopy -O ihex test.elf test.hex
finally, program the microcontroller. This command attempts to set a very low programming clock speed to be safe.
avrdude -c usbasp -p atmega328pb -B 60 -U flash:w:test.hex