Gehören Sie auch zu den Menschen (gemäß Statistik meist Männer), die ein neu gekauftes, technisches Gerät voller Zuversicht einschalten und erst nach den ersten Problemen die Anleitung lesen? Aus der Formulierung der Frage können Sie entnehmen, dass ich in jedem Fall zu dieser Gruppe gehöre. Im heutigen Blog berichte ich von meiner steilen Lernkurve, allerdings nicht in Bezug auf ein neues Gerät, sondern ein altbekanntes: den Mikrocontroller ATMEGA 328P.
Ich bin immer noch begeistert von der genialen Idee, die in der norditalienischen Kneipe Arduino gewachsen ist, ein Board zu kreieren, bei dem der Mikrocontroller alles beigestellt bekommt, was ein Nicht-Programmierer/-elektroniker benötigt, um Projekte damit zu realisieren. Zielgruppe seinerzeit die Kunststudenten, die interaktive Installationen machen wollten. Herausgekommen ist das Arduino Uno Board, das quelloffen inzwischen millionenfach geklont wurde, sowie die Arduino IDE (Integrated Development Environment), die meistgenutzte Entwicklungsumgebung nicht nur für AVR-Mikrocontroller.
Neben einer stabilen Spannungsversorgung mit 3,3 und 5V bietet das Board eine USB-COM-Schnittstelle für die Verbindung zu einem beliebigen Computer, auf dem die IDE installiert ist. Also Programmieren und Zugang zu den programmierbaren Ein- und Ausgängen leichtgemacht.
Aber das hat selbstverständlich seinen Preis, sowohl pekuniär als auch beim Platzbedarf. Deshalb wollte ich den umgekehrten Weg gehen. Programmieren mit dem Board, dann aber den eigentlichen Mikrocontroller aus dem Stecksockel herausnehmen und allein betreiben. Das geht natürlich nur mit der DIP-Version ATMEGA328P U, die SMD-Version ist fest eingelötet.
Mikrocontroller mit ATmega328 in der SMD-Version
Für die ersten Versuche genügt der Sketch „Blink“, der die interne LED (LED_BUILTIN), aber auch eine externe LED am digitalen Pin 13 im Sekundentakt blinken lässt.
Gesagt - getan, MC aus dem Sockel entfernt und in ein Breadboard gesteckt, LED und Vorwiderstand an Pin 13 angeschlossen, Spannungsversorgung angeschlossen. Und siehe da: nichts blinkt.
Pin 13 musste ich ein wenig suchen, aber schließlich habe ich ihn über den Umweg Pin 13 = SCK der SPI-Schnittstelle gefunden. Gelernt habe ich dabei auch, dass es insgesamt drei Ports für die Ein- und Ausgänge gibt, benannt allerdings Port B, C und D.
Pinbelegung des ATmega328P in der 28-DIP-Version
Das ist der Zeitpunkt, an dem mir mein Rechtslehrer wieder einfällt. Zitat: „Der Blick ins Gesetzbuch erhellt schlagartig die Rechtslage“. Also Internet-Recherche und Download des Datenblattes zum MC, sind ja nur 294 Seiten. Ich finde den Hinweis auf einen externen Oszillator mit 16Mhz, der wie folgt angeschlossen werden soll:
Zugleich durchschaue ich jetzt die Bezeichnungen für die drei Ports und die Ein- und Ausgänge beim MC-Board. Port B: PB0 bis PB5 sind die digitalen Pins 8 bis 13 einschl. der Zweitbelegung als SPI-Schnittstelle. An PB6 und PB7 wird der Oszillator angeschlossen. Port C: PC0 bis PC5 sind die analogen Eingänge A0 bis A5 einschl. der I2C-Schnittstelle bzw. die digitalen Ein-/Ausgänge 14 bis 19; PC6 ist der RESET-Eingang. Der Querstrich bedeutet, dass RESET bei Anlegen von GND ausgelöst wird. Und Port D: Hier entspricht die Nummerierung der Zahl des digitalen Ein- bzw.- Ausgangspins.
Der Oszillator ist schnell auf das Breadboard gesteckt. Die beiden Kondensatoren sollen gemäß Datenblatt zwischen 12 und 22 pF (pico Farad) haben, in jedem Fall gleich sein. Leider hatte ich vergessen, diese Kondensatoren gleich mit zu bestellen. Ich hatte als kleinste Kondensatoren in meiner Sammlung 30 pF. Blink hat damit perfekt funktioniert. Dann habe ich versuchsweise die Kondensatoren weggelassen. Blink hat weiterhin perfekt funktioniert. Daraus kann man jedoch nur schließen, dass man bei stabiler Spannungsversorgung und günstigen Bedingungen auf die Kondensatoren verzichten kann.
Wer einen Reset-Button möchte, sollte den RESET-Anschluss an Pin#1 mit einem Pull-up-Widerstand (10kOhm) an VCC legen, um dann mit GND einen Reset durchzuführen. Auch diesen Widerstand habe ich weggelassen und alles hat funktioniert. Resetten kann man schließlich auch durch Trennen der Spannungsversorgung, wenn nötig. Dennoch empfehle ich, diesen Widerstand zu verwenden, um ein eindeutiges Potenzial zu erzeugen.
Weitere Versuch habe ich bei der Spannung unternommen. Das leere Uno-Board hatte bislang stabile 5V geliefert, warum nicht die 3,3V-Buchse ausprobieren? Gesagt, getan, aber nichts blinkt mehr. Also 3,3 V reichen für den Betrieb meiner DIP-Variante des ATMEGA328P nicht aus, obwohl das Handbuch 1,8 bis 5,5V angibt. Das gilt dann wohl für andere Varianten. Letzter Versuch mit voll aufgeladenem LiPo-Akku (4,1V) - das reicht aus.
Zwischenfazit: Mit einer stabilen Spannungsversorgung und einem externen 16 MHz-Oszillator und zwei Kondensatoren kann man den ATMEGA328P-PU (28DIP) auch ohne das Board betreiben.
Das hat mich ermutigt, fünf ATMEGA328P mit Stecksockeln für weitere Versuche zu bestellen. Da diese in Deutschland entweder absurd teuer oder aber nicht lieferbar waren, habe ich die mehrwöchige Wartezeit bei einer Bestellung aus China in Kauf genommen. Das Projekt musste so lange ruhen.
Dann kamen die Mikrocontroller und sahen exakt so aus wie der von meinem ATMEGA328-Board. In meinem (fast) grenzenlosen Optimismus habe ich also den ersten MC auf das Board gesteckt, denn die Anschaffung eines Programmers und die Schwierigkeiten damit wollte ich mir nicht antun.
Wieder sollte „Blink“ herhalten, das Kompilieren des Sketches ging entsprechend schnell, aber als beim Hochladen nur die RX-LED auf dem Board gelegentlich kurz aufleuchtete und sich der Prozess in die Länge zog, ahnte ich schon, dass der Versuch mit einer Fehlermeldung enden wird. Nach zehn Versuchen kamen dann die gleichlautenden Fehlermeldungen:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x07
Leider bekam ich bei den anderen vier MCs die gleiche Fehlermeldung, der Fehler lag also offensichtlich beim Bediener, bei mir. Also wieder Internet-Recherche und Datenblatt. Ich fand den Hinweis, dass man mit dem Beispiel-Sketch 11.ArduinoISP einen fehlenden Bootloader auf den MC brennen kann. Die Anleitung sowie die Schaltung dazu stehen als Kommentar zu Beginn des Sketches; besser geht’s nicht.
Schaltbild: Der rechte Mikrocontroller ist mit dem PC verbunden und hat den Sketch ArduinoISP hochgeladen, beim linken ist der neue ATMEGA328P eingesteckt.
Bildschirmfoto Arduino IDE: Menüpunkt Datei / Beispiele / 11.ArduinoISP
Bildschirmfoto Arduino IDE: Menüpunkt Werkzeuge/Programmer bzw. Bootloader brennen
im Hintergrund Kommentar des Sketches ArduinoISP
Man benötigt also einen zweiten Uno (oder alternativ einen Nano), auf dem der Sketch ArduinoISP geladen wird. Das Brennen erfolgt über die SPI-Schnittstelle (dig. Pins 11 bis 13) sowie Pin 10 an Reset sowie Spannungsversorgung. Alternativ kann man die sechspolige ICSP-Schnittstelle benutzen.
ICSP-Schnittstelle 6-polig
Dann wird unter Werkzeuge zunächst beim Menüpunkt „Programmer“ die Option „Arduino as ISP“ ausgewählt und anschließend darunter der Menüpunkt „Bootloader brennen“ angeklickt. Wer die optionalen LEDs angeschlossen hat, sieht diese blinken. Bei je zwei MCs habe ich mit der IDE 1.8.19 und der IDE 2.0.3 den Bootloader anstandslos installieren können. Der fünfte hat sich nach anfänglicher Fehlermeldung am Ende „ergeben“, ohne dass ich den Grund für die Fehlversuche kenne.
Anschließend habe ich das USB-Kabel an das Board mit dem neu geflashten MC gesteckt, den anderen COM-Port ausgewählt und „Blink“ geladen, diesmal ohne Fehlermeldung.
Was „lernt“ uns das? (Würde Klein Erna, die Hamburger Deern (=kleines Mädchen) aus meiner Jugend, fragen). Es gibt Mikrocontroller vom Typ ATMEGA328P U ohne Bootloader, aber die Autoren der IDE und der Beispiel-Sketche haben Abhilfe bereitgestellt, so dass die MCs auf dem Board mit Hilfe eines zweiten Mikrocontroller-Boards programmierbar sind, um danach unabhängig vom Board, aber mit stabiler Spannungsversorgung und externem Oszillator betrieben werden zu können.
Schließlich habe ich das Ganze mit einer aufwendigen Schaltung ausprobiert. Auch wenn ich im Folgenden nur einen Versuchsaufbau mit Breadboard zeigen werde, so ist es doch ein Beispiel, wie man platzsparend mit dem ATMEGA328 eine voll funktionsfähige Schaltung realisieren kann, in diesem Fall für ein Robot Car mit dem Motor Controller L293D und einer IR-Fernsteuerung.
Zur Erinnerung hier noch einmal die Pinbelegung des L293D:
Aus dem Beispielcode drucken wir hier nur folgenden Schnipsel ab, um die Pinbelegung zu verstehen. Ansonsten verweise ich auf unsere vielen Beiträge zum Thema Robot Car.
// Motor pins
- int m1e = 10;
- int m11 = 9;
- int m12 = 8;
- int m2e = 5;
- int m21 = 7;
- int m22 = 6;
Hier der Link zum Download des Sketches. Wegen der IR-Fernsteuerung muss die Datei PinDefinitionsAndMore.h (aus den Beispielen zur Bibliothek IRremote von Armin Joachimsmeyer) im gleichen Verzeichnis abgespeichert werden.
Für weitere Anwendungsmöglichkeiten empfehle ich unsere eBooks, die vielen Blog-Beiträge sowie das oben erwähnte Datenblatt zum ATMEGA328P.
5 commenti
StachelBanane
Ich hatte das gleiche Problem das bei unter 3,3V die CPU nichts mehr machte. Nach vielen herumsuchen habe ich festgestellt das ich den AVCC nicht mit Pluspol verbunden habe. Nach dem ich den auch verbunden hatte, siehe da ging es bis 2,7V runter. Bei Deiner Schaltung habe ich gesehen fehlt der 2te GND Anschluss, eventuell ist das Dein nicht kleiner als 3,3V Problem. Warum bei mir nicht kleiner als 2,7V geht, hängt mit dem Quarz zusammen, der schwingt unter 2,7V nicht mehr.
Gernot
@ Bernd und Andreas
Sehr schön , gefällt euch doch sicher auch so besser .
Macht weiter so .
Ich freue mich schon auf den nächsten Blog-Beitrag.
Schöne Grüße an Euch und das ganze AZ-Delivery-Team
PS: Ich persönlich stehe mehr auf Quarz-Oszillatoren. Hatte bei kritischeren Schaltungen mit einem normalen Quarz schon so meine Probleme.
Ja gut Quarz-Oszillatoren sind teurer , dafür aber äußerst frequenzstabil.
Wäre vielleicht etwas für den Shop . Ein Set mit Standartwerten , oder einzeln angeboten , mit 4,8,12,16,20, und 24Mhz käme sicher gut an.
Andreas Wolter
@Gernot: wir haben das Schaltbild aktualisiert und ausgetauscht.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Bernd Albrecht
@ Gernot: Danke für das Lob und den Hinweis auf den Fehler im Schaltbild. Das wird ausgetauscht.
Gernot
Hallo !
Sehr schöner Beitrag.
Ich habe das Steckbrett-Schaltbild des Robot-Car’s zwar nur kurz überflogen , aber einen Fehler entdeckt , der angehende Hobbyelektroniker sicher verzweifeln lässt. ;)
Der Festspannungsregeler ist nicht richtig beschaltet , den GND-Pin auf Vcc zu legen wird nicht im Sinne des Erfinders sein.
Bitte überarbeite dahingehend das Steckbrett-Schaltbild nochmal.
Sei bitte auch so nett und füge die Kondensatoren für den Quarz hinzu . Es gibt nämlich viele verschiedene Hersteller und nicht jeder Quarz fängt ohne Kondensatoren zu schwingen an , das kann auch schon bei der selben Charge passieren.
Ich weiß , du hast oben darauf hingewiesen , daß Kondensatoren lt. Datenblatt benötigt werden , aber ein Bild sagt bekanntlich mehr als tausend Worte aus dem Datenblatt. ( lol )
Das könnte vielen Leute Haare kosten.
Danke und schönen Gruß.