BaupfadMittelstufeEin Wochenende

Linienfolger mit 8051-Mikrocontroller bauen

Ein laufender Linienfolger auf nacktem 8051 – und klares Verständnis jeder Schicht, die ein Arduino versteckt hätte, von Reset-Schaltung bis PWM-Signal.

Technisches Schema: Linienfolger mit 8051-Mikrocontroller bauenSENSOR ERROR

Fast jeder Ingenieurstudiengang, der Mikrocontroller lehrt, endet mit derselben Aufgabe: Baue einen Linienfolger auf 8051. Es ist aus einem meist ungesagten Grund eine gute Aufgabe – der Chip gibt dir nichts. Kein analogWrite() für eine Motordrehzahl, kein analogRead() für die Sensoren, keine Bibliothek für das Treiberboard. Jede Schicht, die du sonst aufrufen würdest, baust du.

Das ist der Unterschied zwischen diesem Lernpfad und dem Arduino-Linienfolger. Der Roboter ist derselbe; die Tiefe nicht. Du schreibst den Pulsweitenmodulations-Generator (PWM), den ein Arduino in Silizium hat, lernst, warum ein 8051-Pin eine LED nur verkehrt herum verdrahtet leuchten lässt, und erfährst – bevor du etwas kaufst –, wie viel CPU dich deine Motorsteuerung exakt kostet.

Der 8051 ist ein 8-Bit-Mikrocontroller in Harvard-Architektur im 40-Pin-Gehäuse, meist ein AT89S52 mit 8 KB Flash und 256 Byte RAM. Er hat keine PWM-Peripherie, seine Ports sind quasi-bidirektional (vor dem Lesen eines Eingangs musst du eine 1 schreiben), und seine Pins senken mehr Strom, als sie liefern – die LED kommt also auf die Senkseite, und die Motortreiber-H-Brücke braucht Pull-ups, um verlässlich getrieben zu werden. Diese Details klingen wie Fußnoten, bis der Roboter gar nichts tut, weil EA offen liegt oder die Resetschaltung active-high ist und du sie auf low gelegt hast.

Du startest auf einem Steckboard mit nur dem Chip, einem 11,0592-MHz-Quarz und zwei Lastkondensatoren, einem Reset-Netzwerk und EA auf high – der Minimalschaltung, die wirklich Code ausführt. Die ersten drei Tutorials tragen dich durch Architektur und Speicherkarte, Allzweck-Ein-/Ausgabe (GPIO) und Port-Ansteuerung, dann PWM aus Timer 0 im 8-Bit-Auto-Reload-Modus bauen: etwa 460,8 Hz mit 5-%-Schritten, kostet rund ein Viertel der CPU – ein Preis für fehlende Peripherie.

Von dort konvergiert der Pfad mit dem Arduino-Linienfolger: dasselbe IR-Reflexionsarray (Infrarot), verdichtet zu einem gewichteten Fehler, dieselbe PID-Lenkung (Proportional-Integral-Differential) und derselbe Browser-Simulator, in dem du Verstärkungen findest, die sauber durch Kurven tragen. Der Technikbaum hält Hardware- und Konzeptknoten getrennt – die erste Hälfte braucht also nichts als den Chip und einen ISP-Programmer (In-System-Programmierung) wie einen USBasp, und nur die letzten zwei Bauknoten brauchen Chassis, Motoren und Array.

Arbeite den Technikbaum unten der Reihe nach durch. Die ersten drei Knoten brauchen nichts als den Chip auf einem Steckboard, die Linienfolge-Verstärkungen werden im Browser-Simulator abgestimmt, und nur die letzten zwei Schritte brauchen Chassis und Motoren. Dein Fortschritt wird auf diesem Gerät gespeichert.

Stückliste

Bauteil Menge Ca. Kosten Hinweise
AT89S52, 40-Pin-DIP 1 $2 In-System programmierbar. Ein AT89C51 braucht einen Parallelprogrammer, den du nicht hast
USBasp-ISP-Programmer 1 $3 Der AT89S52 programmiert über SPI – das macht ihn praktikabel
11,0592-MHz-Quarz 1 $0,50 Kein 12 MHz. Siehe unten – das ist keine Vorliebe
33-pF-Keramikkondensatoren 2 $0,20 Quarz-Lastkondensatoren
10-µF-Elko + 10-kΩ-Widerstand je 1 $0,20 Das Reset-Netzwerk. Reset ist hier active HIGH
10-kΩ-Widerstandsnetzwerk 1 $0,50 Port-0-Pull-ups – er ist Open-Drain und treibt ohne sie kein High
40-Pin-ZIF- oder DIP-Fassung 1 $1 Chip niemals direkt einlöten; du wirst ihn entfernen
IR-Reflexionsarray 1 $5–10 Digitaler Ausgang, oder externen ADC dazu – der 8051 hat keinen Analogeingang
L298N 1 $3
TT-Getriebemotor 2 $4
2WD-Chassis 1 $6–10
Akkupack 1 $6
Steckboard und Jumper — $5 Die ersten drei Meilensteine passieren vollständig hier

Gesamt: ca. $35–50.

Zwei Käufe entscheiden, ob dieses Projekt angenehm oder elend wird.

Der Quarz muss 11,0592 MHz haben. Der 8051 leitet seine serielle Baudrate per Timer-1-Überlauf ab, und bei 11,0592 MHz kommt jede Standardrate als ganzer Reload-Wert heraus – 9600 Baud sind exakt TH1 = 0xFD. Ein 12-MHz-Quarz liefert 10417 Baud gegen 9600 als Ziel, 8,5 % Fehler – weit jenseits der ~3 %, die ein UART toleriert. Jedes Zeichen kommt korrupt an. Der Chip arbeitet perfekt bis zu dem Moment, in dem du etwas zum Debuggen ausgeben willst – dem schlechtestmöglichen Zeitpunkt für diese Entdeckung.

Das Sensorarray muss digitale Ausgänge haben, oder du musst einen externen ADC wie einen ADS7828 oder ADC0808 dazunehmen. Der 8051 hat gar keinen Analogeingang. Das ist das Erste, was der Chip wegnimmt, was ein Arduino gratis gibt – und es ist bewusst zu entscheiden: Komparator- Ausgänge sind simpler, kosten dich aber das glatte proportionale Fehlersignal, mit dem PID-Abstimmung gut funktioniert.

Die Minimalschaltung

Vor jedem Sensor oder Motor den nackten Chip auf einem Steckboard zum Codeausführen bringen. Sechs Verbindungen:

Pin Verbinde mit Warum
40 (VCC) +5 V
20 (GND) Masse
31 (EA) +5 V Wählt internen Programmspeicher. Offen oder auf Masse hängend holt der Chip aus nicht vorhandenem externem Speicher und tut gar nichts
18, 19 (XTAL2, XTAL1) Über den Quarz Mit je 33 pF von jedem Bein nach Masse
9 (RST) 10 µF nach +5 V, 10 kΩ nach Masse Reset ist hier active HIGH – anders als bei fast jedem anderen Mikrocontroller

EA offen ist der häufigste Grund, warum ein erstes 8051-Board tot wirkt – und produziert keinen Fehler, kein Licht und keinen Hinweis. Jedes Mal zuerst prüfen.

Eine LED an P1.0 ist das „Hallo Welt“: Kathode an den Pin verdrahten, Anode über 330 Ω Widerstand nach +5 V, und 0 schreiben zum Leuchten. Der Pin senkt etwa 10 mA und liefert rund 60 Mikroampere – andersherum verdrahtet glimmt sie schwach und sieht wie ein Fehler aus.

Baue ihn in Meilensteinen

Die ersten drei brauchen nur den Chip auf einem Steckboard – du kannst also weit in dieses Projekt kommen, bevor du ein Chassis kaufst.

Nr. Meilenstein Der Test Bestanden, wenn
1 Chip läuft LED an P1.0 blinken lassen Sie blinkt. Sonst EA prüfen, vor allem anderen
2 Timing verifiziert Mit gezähltem Delay exakt 1 Hz blinken Stoppuhr über 60 Blinkvorgänge stimmt auf eine Sekunde
3 Seriell geht Zähler mit 9600 Baud ausgeben Sauberer Text – Grütze heißt falscher Quarz
4 GPIO hinein Taster an P1.1 mit Pull-up lesen Liest verlässlich. Daran denken: vor dem Lesen 1 schreiben
5 Timer-Interrupt Pin aus Timer-0-ISR toggeln, per Scope oder Zeit messen Periode ist wie berechnet, und sie ist stabil
6 Software-PWM LED mit 0 %, 25 %, 50 %, 100 % Duty treiben Sichtbar verschiedene Helligkeit, kein Flackern
7 PWM-Kosten gemessen Ersatzpin in der Hauptschleife toggeln und timen Du kannst sagen, welchen CPU-Anteil die ISR verbraucht
8 Motoren getrieben Beide Räder vor und zurück mit befohlenem Duty Beide Richtungen, beide Drehzahlen, aufgebockt
9 Sensoren gelesen Alle Kanäle über Linie und Boden ausgeben Jeder Kanal unterscheidet beide
10 Fehlersignal Roboter von Hand über die Linie bewegen Monotone gewichtete Position, keine Sprünge
11 Folgen Auf Klebebandoval fahren Runden gelingen

Meilenstein 7 ist der, wofür dieses Projekt existiert. analogWrite eines Arduino kostet nichts – das PWM entsteht in Silizium. Hier hast du es aus einem Timer-Interrupt gebaut, und er feuert Zehntausende Male pro Sekunde. Zu messen, welchen Anteil deiner CPU das verbraucht, ist die Lektion: typischerweise ein Viertel des Chips – und das kauft dir eine Hardware-PWM-Peripherie.

Wie gut aussieht

Messung Typisch an diesem Aufbau
Maschinenzyklus bei 11,0592 MHz 1,085 µs – du kannst Befehle zählen und das Timing kennen
Software-PWM-Frequenz ~460 Hz mit 5-%-Schritten, aus Timer 0 im 8-Bit-Auto-Reload
CPU-Verbrauch der PWM-ISR ~25 %
Verbleibende Hauptschleifenrate Noch bequem über 200 Hz für den Regelkreis
RAM-Verbrauch Unter 100 Byte der 256 – die Grenze ist real, aber hier nicht eng
Folgeleistung Vergleichbar mit dem Arduino-Aufbau; der Roboter ist nicht der Punkt

Diese letzte Zeile ist offen auszusprechen. Dieser Roboter wird den Arduino-Linienfolger nicht übertreffen. Es ist derselbe Roboter, auf die harte Art gebaut, und der Ertrag ist Verständnis statt Leistung. Willst du einen besseren Linienfolger, stimme den Arduino ab. Willst du wissen, was analogWrite für dich getan hat, baue diesen.

Fehlersuche

Symptom Wahrscheinliche Ursache Lösung
Chip tut gar nichts EA offen oder auf Masse Pin 31 auf +5 V legen
Immer noch nichts, EA ist high Quarz schwingt nicht an 33-pF-Kondensatoren und Quarzlötstellen prüfen
Setzt ständig zurück RST auf high gehalten Reset ist active HIGH – 10-µF-/10-kΩ-Netzwerk prüfen
Seriell druckt Grütze 12-MHz-Quarz 11,0592 MHz, oder kein serielles Debugging akzeptieren
LED glimmt sehr schwach Auf Liefern verdrahtet Kathode an den Pin; 0 schreiben zum Leuchten
Port 0 liest und schreibt nichts Open-Drain, keine Pull-ups 10 kΩ von jedem Pin nach +5 V
PWM-Periode jittert Timer spät in der ISR nachgeladen Nachladen als erste Anweisung, oder Modus 2 nutzen
Programm kehrt an Zufallsadresse zurück Stack überlappt Registerbank 1 SP = 0x30; an den Anfang von main()
Benimmt sich mit wachsendem Code erratisch RAM alle 256 Byte gesamt – Linker-Map prüfen
Programmer sieht den Chip nicht ISP-Pins belegt oder keine Reset-Kontrolle P1.5–P1.7 und RST beim Programmieren freihalten
Sensoren liefern nichts Brauchbares Analogarray an Chip ohne ADC Array mit Digitalausgang oder externen ADC dazu

Wie es weitergeht

Zweiten Timer hinzufügen und die eigene Schleife messen. Während Timer 0 das PWM fährt, kann Timer 1 die Periode deines Regelkreises zählen – aus „fühlt sich reaktionsschnell an“ wird eine Zahl. Auf einem Chip, auf dem du Maschinenzyklen zählen kannst, ist diese Zahl exakt vorhersagbar – verifiziere deine Vorhersage.

LCD über Port 0 ansteuern, und du triffst das Open-Drain-Problem richtig, plus die Timing- Anforderungen eines Geräts, das wirklich langsamer ist als der Prozessor.

Dann die Arduino-Version bauen – und bemerken, was du nun an jeder Zeile verstehst. Das analogWrite, das du in einer Zeile schreibst, ist die ISR, an der du hier einen Abend saßest; das analogRead ist der ADC, den du extern dazunehmen musstest. Dieser Vergleich ist das echte Lieferergebnis dieses Projekts.

Projekt-Roadmap

Der Baupfad

Folge dem Technikbaum von den Bauteilen bis zum funktionierenden Roboter. Jeder Knoten wird freigeschaltet, sobald seine Voraussetzungen erledigt sind, und dein Fortschritt wird auf diesem Gerät gespeichert.

0 / 17 erledigt

100%
Bau

Roboter verdrahten

60 Min.

Bau

Flashen und fahren

60 Min.

Ziel

8051-Linienfolger fertig

Du hast es gebaut

Bauteile

Tutorials in diesem Pfad

Üben, bevor du verdrahtest

Im Live-Simulator abstimmen

Der Baupfad führt durch ein Browser-Labor. Bring das Verhalten hier in Ordnung und übertrage deine Einstellungen dann auf den echten Roboter.

Häufig gestellte Fragen

Warum einen Linienfolger auf 8051 statt Arduino bauen?

Weil dich der 8051 bauen lässt, was der Arduino versteckt. Es gibt kein analogWrite – also schreibst du den PWM-Generator; kein pinMode – also lernst du, was quasi-bidirektionale Ports wirklich tun. Geht es um einen Roboter, der funktioniert, nimm einen Arduino. Geht es ums Verstehen des Roboters, lehrt der 8051 mehr pro Stunde als jedes Board mit Bibliothek für alles.

Welche Bauteile brauche ich für einen 8051-Linienfolger?

Einen AT89S52 mit Quarz- und Resetschaltung, ein IR-Reflexions-Sensorarray, einen H-Brücken-Treiber wie L298N oder L293D, zwei TT-Getriebemotoren, ein 2WD-Chassis und einen Akkupack, der Logik- und Motorstrom auf getrennten Schienen hält. Dazu brauchst du einen ISP-Programmer – ein USBasp kostet wenig und flasht den AT89S52 über vier Pins.

Wie steuert man am 8051 ohne PWM-Hardware die Motordrehzahl?

Du erzeugst das PWM per Software. Timer 0 läuft im 8-Bit-Auto-Reload-Modus und interruptet alle 100 Maschinenzyklen; der Interrupt zählt Takte und hält den Ausgang für die ersten N jeder Periode high. Bei 11,0592 MHz ergibt das 460,8 Hz mit 5-%-Duty-Schritten und kostet etwa ein Viertel der CPU – der Preis für fehlende PWM-Peripherie.

Kann ich in C schreiben oder muss es Assembler sein?

C ist in Ordnung und was die meisten Kurse heute nutzen. Keil C51 ist Industriestandard, SDCC eine freie Open-Source-Alternative. Assembler lohnt sich auf diesem Chip zum Lesen – der Befehlssatz ist klein und das Timing zählbar –, doch einen ganzen Roboter darin schreiben musst du nicht.

Warum tut mein 8051-Roboter nach dem Flashen gar nichts?

Prüfe zuerst, ob EA (Pin 31) auf +5 V liegt. Offen oder auf Masse hängend versucht der Chip, sein Programm aus nicht vorhandenem externem Speicher zu holen, und läuft nichts – ohne jeden Fehler. Danach die Resetschaltung prüfen – Reset ist am 8051 active-high – und die zwei Lastkondensatoren des Quarzes.

Muss ich Bauteile kaufen, bevor ich mit diesem Projekt beginne?

Nein. Linienfolglogik und Verstärkungsabstimmung laufen im Browser-Simulator, und die drei 8051-Tutorials brauchen nur den Chip auf einem Steckboard. Chassis und Motoren kaufen, wenn du bereit bist, den echten Roboter zu verdrahten.