DSP, Micros & Memory


ATmega328P: Getting started without Arduino

29 November 2024 DSP, Micros & Memory


I’ve been using the Arduino Uno board for quite some time, and I’ve always wondered what it would take to get the ATmega328P (the original chip used on the older Uno boards) working completely on its own. With the Arduino making it so accessible via its bootloader, nice GUI software, and C++ abstraction, you’d wonder why on earth I would want to even attempt this. Sometimes, in order to appreciate what others have done, it’s important to try doing it yourself. This project really demonstrated how much work the Arduino folks put into this and changed the world with that friendly little product.

In this article, we’ll walk through bringing up the chip completely on its own, using only an external power source and an Atmel-ICE programmer.

Environment setup

There are a few ways to configure an ATmega328P. One such way, intentionally not covered as you can tell by the title, is by dropping your ATmega328P chip into an Arduino Uno, programming it, and then moving it over to a breadboard. Based on feedback in forums, some folks want to skip the Arduino process and use a more traditional approach with programmers such as the Atmel-ICE from Microchip. The most straightforward way to start with a Microchip (formerly Atmel) microprocessor is to install Microchip Studio. At the time of writing this article the full Microchip Studio suite is supported only in Windows. Since I like to have all my build environments run in CI (Continuous Integration), I opted for an alternative approach.

The GNU Compiler Collection (GCC) is one of the most popular compilers available for the C language. It compiles certain platforms and architectures, but not for the AVR (ATmega) family of chips. There is, however, a set of compilers for the AVR and other Microchip families hosted on their website. Luckily, these compilers have been packaged into nice Debian packages that can easily be installed in Debian or Ubuntu as follows:

$ apt-get install gcc-avr binutils-avr avr-libc avrdude

With these tools installed, code is now able to be compiled and the ATmega328P can be programmed with only an Atmel-ICE programmer and an external power supply set at 5 V. The AVR version of GCC will be used to compile the code and AVRDUDE will be used to flash the ATmega328P chip.

The project

Table 1 – Connection layout.

For this project, the goal was to demonstrate some basic, but functional, capabilities of the ATmega328P. A simple external LED and some serial commands back and forth were all that were needed to prove that this chip could stand on its own.

An important component to software development is unit testing. Unit testing validates that the functions or pieces of the larger system are working as expected. If someone comes along and modifies a piece of that functionality, the unit test will prevent regressions from happening (that is, you unintentionally broke something else by introducing a new feature).

The pinout used to connect the Atmel-ICE programmer to the ATmega328P chip is shown in Table 1.

Adding a few LEDs, hooking up the serial communication port to a Raspberry Pi, and picking off the Raspberry Pi’s 5 V line, a full assembly ready for testing is available.

Testing, compiling, and more testing

As you develop new features, use the Makefile to run unit tests and compile the code. After validating that your desired code does what it is intended to do (via unit test validation), build the binary, flash it onto the device (also via the Makefile), and run testing using the Raspberry Pi’s serial communication port.

One of the most important pieces is correctly flashing the fuse bits to enable the internal 8 MHz clock. This is added to the flashing command in the Makefile:

avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m

After that, the chip’s serial interface should be able to be used with the assumption that the onboard clock runs at 8 MHz (as defined in the top of main.c). From here, more functionality can be added, such as support for additional serial commands, or interfaces to external components and sensors.

Conclusion

In this article, brief instructions on how to get started with the ATmega328P chip, without any external circuitry, were given as commonly seen with the original Arduino Unos and Microchip evaluation boards. Additionally, there was an important detail, often overlooked, about programming the fuse bits to set the internal clock to 8 MHz. At this point, one should be able to add more functionality with additional tests, and run everything with just an Atmel-ICE programmer and an external 5 V supply. For simplicity, utilising a Raspberry Pi for its power source and serial communication capabilities is one of the easiest ways to control the process end-to-end.

The project’s source code can be found by visiting https://bit.ly/4eVcEes




Share this article:
Share via emailShare via LinkedInPrint this page

Further reading:

MCU for low-power, IoT applications
NuVision Electronics DSP, Micros & Memory
Silicon Labs recently announced the PG26, a general-purpose microcontroller with a dedicated matrix vector processor to enhance AI/ML hardware accelerator speeds.

Read more...
EEPROMs for industrial and military markets
Vepac Electronics DSP, Micros & Memory
Designed to ensure the data retention and the secure and safe boot of digital systems, the memory product line includes small and medium density EEPROMs from 16 kb to 1 Mb.

Read more...
PLCnext – Open, IIoT-ready industrial platform
IOT Electronics DSP, Micros & Memory
PLCnext can be used alongside an existing PLC system, collecting control system data via EtherNet/IP, PROFINET, or MODBUS, and can push this information to a cloud instance.

Read more...
ICs vs modules: Understanding the technical trade-offs for IoT applications
NuVision Electronics Editor's Choice DSP, Micros & Memory
As the IoT continues to transform industries, design decisions around wireless connectivity components become increasingly complex with engineers often facing the dilemma of choosing between ICs and wireless modules for their IoT applications.

Read more...
Hardware quantum resistance to embedded controllers
Avnet Silica DSP, Micros & Memory
To help system architects meet evolving security demands, Microchip Technology has developed its MEC175xB embedded controllers with embedded immutable post-quantum cryptography support.

Read more...
High-performance processor for edge-AI
Altron Arrow DSP, Micros & Memory
The STM32MP23 microprocessor from STMicroelectronics is the latest addition to the STM32MP2 series, designed to meet the demands of industrial, IoT, and edge AI applications.

Read more...
PolarFire SoC FPGAs achieve AEC-Q100 qualification
ASIC Design Services DSP, Micros & Memory
Microchip Technology’s PolarFire SoC FPGAs have earned the Automotive Electronics Council AEC-Q100 qualification.

Read more...
Integrated STM32WBA6 wireless microcontrollers
Altron Arrow DSP, Micros & Memory
Cost-efficient and highly integrated embedded controllers for emerging 2,4 GHz wireless applications in smart home, health, factory, and agriculture.

Read more...
Ultra-low-power MCU with FPU Arm Cortex-M33
Altron Arrow DSP, Micros & Memory
STMicroelectronics has expanded its STM32 ultra-low-power family with the launch of the STM32U3 for cost-sensitive applications in industrial, medical, and consumer electronics devices.

Read more...
Low-jitter oscillators
DSP, Micros & Memory
The JOH21, JOE21 and JOD21 low-jitter oscillators with differential output are designed for applications that require accurate timing and precise synchronisation.

Read more...