ATmega328P Grundlagen: Einstieg ohne Arduino

Ari Mahpour
|  Erstellt: Mai 29, 2024
ATmega328P Essentials: Einstieg ohne Arduino

Ich verwende das Arduino Uno Board schon seit einiger Zeit, unter anderem als Beispiele für viele meiner Artikel. Ich habe mich immer gefragt, was nötig wäre, um den ATmega328P (den ursprünglichen Chip auf den älteren Uno Boards) komplett eigenständig zum Laufen zu bringen. Mit dem Arduino, der es durch seinen Bootloader, die nette GUI-Software und die C++-Abstraktion so zugänglich macht, fragt man sich, warum ich überhaupt versuchen sollte, dies zu tun. Manchmal ist es wichtig, selbst zu versuchen, etwas zu tun, um zu schätzen, was andere geleistet haben. Dieses Projekt hat wirklich gezeigt, wie viel Arbeit die Leute von Arduino in dieses Produkt gesteckt haben und wie sie die Welt mit diesem freundlichen kleinen Produkt verändert haben.

In diesem Artikel werden wir durch den Prozess führen, den Chip komplett eigenständig mit nur einer externen Stromquelle und einem Atmel-ICE Programmiergerät in Betrieb zu nehmen. Wir demonstrieren, wie man mit dem Chip über die integrierte serielle Schnittstelle kommuniziert und auch ein oder zwei LEDs blinken lässt.

Einrichtung der Umgebung

Es gibt einige Möglichkeiten, einen ATmega328P zu konfigurieren. Eine solche Möglichkeit, die, wie Sie dem Titel entnehmen können, absichtlich nicht behandelt wird, besteht darin, Ihren ATmega328P-Chip in ein Arduino Uno einzusetzen, ihn zu programmieren und dann auf ein Steckbrett zu übertragen. Basierend auf Rückmeldungen in Foren möchten einige Leute den Arduino-Prozess überspringen und einen traditionelleren Ansatz mit Programmiergeräten wie dem Atmel-ICE von Microchip verwenden. Der einfachste Weg, mit einem Mikroprozessor von Microchip (ehemals Atmel) zu beginnen, ist die Installation von Microchip Studio. Zum Zeitpunkt der Erstellung dieses Artikels wird die vollständige Microchip Studio Suite nur unter Windows unterstützt. Da ich es vorziehe, alle meine Build-Umgebungen in CI (Continuous Integration) laufen zu lassen, habe ich mich für einen alternativen Ansatz entschieden.

Die GNU Compiler Collection (GCC) ist einer der beliebtesten Compiler da draußen für die C-Sprache. Sie kompiliert bestimmte Plattformen und Architekturen, aber nicht für die AVR (ATmega) Familie von Chips. Es gibt jedoch eine Reihe von Compilern für die AVR- und andere Microchip-Familien auf ihrer Website. Glücklicherweise haben einige freundliche Leute diese Compiler sogar in schöne Debian-Pakete verpackt, die leicht in Debian oder Ubuntu installiert werden können, so wie:

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

Mit diesen Tools installiert sind wir jetzt in der Lage, den ATmega328P nur mit einem Atmel-ICE Programmiergerät und einer externen Stromversorgung (eingestellt auf 5V) zu kompilieren und zu programmieren. Wir verwenden die AVR-Version von GCC, um den Code zu kompilieren und AVRDUDE, um den ATmega328P-Chip zu flashen.

Das Projekt

Für dieses Projekt war mein Ziel, einige grundlegende, aber funktionale Fähigkeiten des ATmega328P zu demonstrieren. Eine einfache externe blinkende LED und einige serielle Befehle hin und her waren alles, was ich brauchte, um zu beweisen, dass dieser Chip eigenständig stehen konnte. Im Repository des Projekts habe ich neben dem Quellcode (mit dem Namen „src“) einige Ordner erstellt, die bei der Entwicklung dieses Projekts helfen.

Ein wichtiger Bestandteil der Softwareentwicklung (auch Software, die auf Hardware läuft) ist das Unit Testing. Unit Testing stellt sicher, dass die Funktionen oder Teile des größeren Systems wie erwartet funktionieren. Wenn jemand kommt und ein Stück dieser Funktionalität ändert, wird der Unit Test Regressionen verhindern (d.h., Sie haben unbeabsichtigt etwas anderes kaputt gemacht, indem Sie ein neues Feature eingeführt haben). In diesem Beispiel habe ich einen grundlegenden Unit Test geschrieben, der die Hardware simuliert und das Initialisierungsschema der seriellen Kommunikationsbibliothek (USART) durchläuft.

Zusätzlich zum Unit Testing (befindet sich im Ordner „tests“), gibt es auch einen Ordner namens „hil“, was für Hardware in the Loop steht. Dieser Ordner enthält die Skripte, die notwendig sind, um Tests mit echter Hardware in der Schleife durchzuführen (wie in vielen meiner vorherigen Artikel besprochen). Dies stellt sicher, dass mein Code nicht nur in der virtuellen Welt (mit Mocks) funktioniert, sondern auch in der realen Welt, indem Tests auf echter Hardware durchgeführt werden.

Die Konsultation der README.md wird Ihnen ein Pinout-Diagramm zur Verfügung stellen, um den Atmel-ICE-Programmierer mit dem ATmega328P-Chip zu verbinden:

Atmel ICE Pinbelegung

Abbildung 1: Atmel ICE Pinbelegung

Wenn Sie ein paar LEDs hinzufügen, den seriellen Kommunikationsport an einen Raspberry Pi anschließen und die +5V-Leitung des Raspberry Pi abgreifen, haben Sie nun eine vollständige Montage fertig:

Raspberry Pi Breakout-Board

Abbildung 2: ATmega328P mit einem Breakout-Board zusammen mit dem Raspberry Pi und Atmel-ICE-Programmierer

Testen, Kompilieren und noch mehr Testen

Wenn Sie neue Funktionen entwickeln, verwenden Sie das Makefile, um Unit Tests durchzuführen und den Code zu kompilieren. Nachdem validiert wurde, dass Ihr gewünschter Code tut, was er soll (über Unit Test Validierung), bauen Sie das Binary, flashen es auf das Gerät (auch über das Makefile) und führen Sie Hardware in the Loop (HIL) Tests mit dem seriellen Kommunikationsport des Raspberry Pi durch.

Ein sehr wichtiger Punkt ist das korrekte Flashen der Fuse-Bits, um den internen 8-MHz-Takt zu aktivieren. Dies ist in der README dokumentiert, aber auch im Flash-Befehl im Makefile hinzugefügt:

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

Danach sollten Sie in der Lage sein, die serielle Schnittstelle des Chips zu nutzen unter der Annahme, dass der Onboard-Takt mit 8 MHz läuft (wie im oberen Teil von main.c definiert). Von hier aus sollten Sie in der Lage sein, weitere Funktionalitäten hinzuzufügen, wie Unterstützung für zusätzliche serielle Befehle, Schnittstellen zu externen Komponenten und Sensoren und alles, was Sie sich mit diesem kleinen, spaßigen Mikrocontroller vorstellen können.

Fazit

In diesem Artikel haben Sie gelernt, wie Sie mit dem ATmega328P-Chip ohne externe Schaltkreise beginnen können, wie sie üblicherweise bei den originalen Arduino Unos und Microchip-Evaluierungsboards zu sehen sind. Sie kennen jetzt das Konzept des Unit-Testings, der Binär-Builds, des Flashens des Chips und des Durchführens von Hardware-in-the-Loop-Tests. Zusätzlich gab es ein wichtiges Detail, das oft übersehen wird, über die Programmierung der Fuse-Bits, um den internen Takt auf 8 MHz einzustellen. An diesem Punkt sollten Sie in der Lage sein, weitere Funktionalitäten mit zusätzlichen Unit- und HIL-Tests hinzuzufügen und alles nur mit einem Atmel-ICE-Programmiergerät und einer externen 5V-Versorgung zu betreiben. Für die Einfachheit wäre die Nutzung eines Raspberry Pi als Stromquelle und für die serielle Kommunikationsfähigkeit der einfachste Weg, den Prozess von Anfang bis Ende zu steuern.

Der Quellcode des Projekts kann hier gefunden werden:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

Über den Autor / über die Autorin

Über den Autor / über die Autorin

Ari ist ein PCB-Designer mit umfassender Erfahrung in der Entwicklung, Herstellung, Prüfung und Integration verschiedener Softwaresysteme. Dabei bringt er leidenschaftlich gern Entwickler aus den Bereichen Design, Prüfung und Abnahme zusammen, um gemeinsam an Projekten zu arbeiten und diese voranzutreiben.

Ähnliche Resourcen

Verwandte technische Dokumentation

Zur Startseite
Thank you, you are now subscribed to updates.