Der ATmega328 ist ein von Atmel entwickelter 8Bit-Mikrocontroller, der über die Arduino-Plattformen vor allem im Hobby-Bereich weit verbreitet ist. Die Taktfrequenz darf bis zu 20MHz betragen. Als Speicher stehen 32kB Flash, 1kB EEPROM und 2kB RAM zur Verfügung. Die Gehäusevariante TQFP-32 bietet 23 programmierbare Ein-/Ausgänge und 3 zusätzliche analoge Eingänge. Der ATmega328 enthält zwei 8Bit- und einen 16Bit-Zähler, außerdem 6 PWM-Kanäle, einen 10Bit-ADC mit 8 Kanälen, einen anlogen Komparator, eine USART-, eine SPI- und eine I2C-Schnittstelle.
Der ATmega328P ist eine Weiterentwicklung des ursprünglichen ATmega328. Das P steht für Picopower. Die Stromaufnahme konnte zur P-Variante etwas reduziert werden. Den ATmega328P hat man wiederum zum ATmega328PB weiterentwickelt.
Das Die des ATmega328P ist 2,97mm x 2,95mm groß. Um den Umfang befinden sich 32 Bondpads, die auch alle kontaktiert wurden. Zwei massive Rahmen verteilen die Versorgungsspannung. Im unteren Bereich des Dies befindet sich eine chaotisch erscheinende Verdrahtung, die typisch ist für Logikstrukturen. Im oberen Bereich befinden sich unter einer sehr dichten Metallfläche die Speicherbereiche.
Dieses Bild ist auch in einer höheren Auflösung verfügbar: 39MB
In der oberen rechten Ecke ist das Atmel-Logo und die Zeichenfolge AT 35473 abgebildet. In der unteren rechten Ecke befindet sich der Jahrgang 2008.
In der oberen und der unteren linken Ecke sind die Maskenrevisionen dargestellt. Es handelt sich offenbar nur um die Masken zur Strukturierung der Metalllagen und ihrer Kontakte.
Entfernt man die Metalllagen, so wird deutlicher, wo welche Funktionsblöcke integriert wurden. Die Steuerungslogik befindet sich wie zu erwarten war im unteren Bereich des Dies. Sehr viel Fläche nehmen die verschiedenen Speichertypen ein.
Dieses Bild ist auch in einer höheren Auflösung verfügbar: 99MB
Den größten Flächenbedarf hat der 32kB große Flash-Speicher (grün). Der Aufbau der Speicherzellen ist der gleiche wie beim ATtiny10 und beim ATtiny841. Im ATmega328P hat man den Flash-Speicher aber in zwei Bereiche aufgeteilt. Im unteren Bereich kann während eines Schreibvorgangs nicht gelesen werden ("No Read-While-Write"). Dort wird üblicherweise ein Bootloader abgelegt. Der obere Speicherbereich erlaubt es dagegen Daten auszulesen, während an einer anderen Stelle Daten geschrieben werden ("Read-While-Write"). So kann zum Beispiel ein Programm weiterlaufen, während noch Variablen abgespeichert werden.
Der Flash-Speicher besitzt insgesamt 258 sogenannte Pages. Der Programmspeicher ist 256 Pages groß. Zwei Pages werden wahrscheinlich für Fuses, Chip-ID und ähnliche Dinge genutzt. Jede Page besteht aus 64 16Bit-Wörter. Rechts des Flash-Speichers ist der 1kB große EEPROM integriert (türkis). Darin befinden sich 256 Pages, die jeweils 4 Bytes enthalten.
Um die 2kB SRAM abzubilden, hat man die 512B-Strukturen des ATtiny841 viermal integriert.
Im linken Bereich befinden sich zwei Logikblöcke, in denen erstaunlich viel Fläche ungenutzt blieb. Im ATtiny10 und im ATtiny841 ist ein annähernd quadratischer Schaltungsteil integriert. Auf Grund des Aufbaus kann man davon ausgehen, dass sich darin die Konfigurationsregister für Funktionen wie Analog-Digital-Wandler, Komparatoren, Zähler befinden. Der ATmega328P besitzt ebenfalls solche Register. Auf dem Die fehlt aber der von ATtiny10 und ATtiny841 bekannte Block. Vielleicht erfolgt die Konfiguration in den beiden hier zu sehenden Logikblöcken. Die Nähe zu den analogen Schaltungsteilen wäre auf jeden Fall hilfreich. Die leeren Flächen würden zu den großen ungenutzten Bereichen im Adressraum der Konfigurationsregister passen.