Mikrocontroller sind Bestandteil der meisten meiner Projekte. Sie sind billig, robust und aufgrund der zahlreichen Schnittstellen flexibel einsetzbar. Roboter werden häufig mit mehreren Mikrocontrollern realisiert, welche untereinander über Bussysteme kommunizieren.
Um Erfahrung in der Programmierung von Mikrocontrollern zu sammeln, habe ich mir zunächst eine einfache Testschaltung gebaut. Die Schaltung wurde auf ein Testboard gebaut, das Stück für Stück erweitert wurde. Ich verwende Bausteine der Atmel-Controllerfamilie, weil der Hersteller eine gute Dokumentation und kostenlose Software bietet. Ein weiterer Grund ist die Community und die große Anzahl von Beispielschaltungen und -programmen im Internet. Diese Seite dient als Sammlung der Programme, die ich bisher auf den Atmel-Controllern entwickelt habe.
Die Schaltung wird über einen 6-poligen ISP-Anschluß programmiert. Dazu benutze ich den ISP-Programmer von AVR, den es bei Reichelt gibt. Es können 3 Modellbau-Servos angeschlossen werden. Mit dem PC wird über den MAX232 kommuniziert. Ausserdem enthält die Schaltung zwei Taster, eine Low-Current-LED und einen Operationsverstärker, der zur Aufbereitung des PPM-Signals eines Modellbau-Empfängers dient.
Die folgenden Programme wurden unter „AVR Studio 4“ für den ATMega8 entwickelt. Sie bauen zum Teil auf dem AVR-Tutorial von Andreas Schwarz auf. Die Schaltung wurde auf ein Testboard gebaut, das Stück für Stück erweitert wurde. Zur korrekten Darstellung im Browser wurde in AVR Studio eine Tabweite von 8 Zeichen eingestellt.
AtMega als Schalter
Dieses Programm nutzt die volle Leistungsfähigkeit der ATMega aus :-). Es fragt ab, ob der Taster S1 an Pin 7 gedrückt ist und steuert entsprechend die Leuchtdiode an.
Download: | begin2.asm | begin2.hex |
Textausgabe über UART
Der Text „Test“ wird wiederholt über die serielle Schnittstelle ausgegeben.
Download: | uart1.asm | uart1.hex |
LED per UART schalten
Eine „1“ an den Controller gesendet, schaltet die LED ein. Eine „0“ schaltet sie aus.
Download: | uart2.asm | uart2.hex |
Perfektes Timing
Dieses Programm diente der Vorbereitung auf die Servo-Ansteuerung. Es lässt die LED im Sekundentakt blinken. über die Taster ist die Länge der Leuchtphasen veränderbar. Taster S1 verlängert die Leuchtphase und S2 verkürzt sie. Die geschieht allerdings mit Überlauf, d.h., wird die maximale Leuchtdauer überschritten, geht es mit dunkler LED weiter.
Download: | servo2.asm | servo2.hex |
Servo mit Tasten steuern
Hier nun die erste echte Servoansteuerung. Ein Servo an Port C1 wird über die Taster nach links bzw. rechts bewegt. Nach dem Reset startet das Programm in der Servomittelstellung. Diese wurde mit einer Pulsweite von 1.5 ms festgelegt. Die Minimalstellung liegt bei 0.7 ms, Maximum bei 2.3 ms. Diese Werte werden von realen Fernsteuerungen meines Wissens nicht erreicht. Es kann vorkommen, dass die Servos in den Extremstellungen brummen. In diesem Fall sollten die Grenzen im Quellcode enger gesetzt werden.
Download: | servo3.asm | servo3.hex |
Servo per UART steuern
Derselbe Servo an Port C1 kann nun vom PC aus gesteuert werden. Dazu muss ein fünf Zeichen langer String an den Controller gesendet werden. Der String enthält 4 Ziffern, welche die Pulsweite des Servosignals angeben, gefolgt von einem ‚*‘ als Abschlußzeichen. Möchte man den Servo also mit 0.9 ms ansteuern, so muss der String „0900*“ gesendet werden.
Download: | servo5.asm | servo5.hex |
Mehrere Servos per UART steuern
Zum Abschluß nun das Beispiel für mehrere Servos. Auch hier wird wieder die Pulsweite des Servosignals in Microsekunden über die serielle Schnittstelle übermittelt. Zusätzlich enthält der Befehlsstring aber noch die Servonummer. Das Format ist „x:nnnn*“, wobei x die Servonummer von 1-5 ist und nnnn die Pulsweite.
Download: | servo7.asm | servo7.hex |
Verarbeiten des PPM-Signals
Einige Empfänger für Modellfernsteuerungen liefern neben den eigentlichen Servosignalen auch noch das ursprünglich übertragene, sogenannte PPM-Signal. Dieses enthält die Pulsweiten der einzelnen Servos in ihrer Reihenfolge, codiert durch den zeitlichen Abstand der Pulse. Das Beispiel wurde für den Empfänger C19 von Graupner JR entwickelt. Dieser liefert das PPM-Signal mit einer Spannung von 0.9V. Der Operationsverstärker LM 324 verstärkt es so, dass der AtMega es über den Timer-Interrupt verarbeiten kann. Anstelle des LM 324 kann wahrscheinlich auch ein anderer OPV verwendet werden. Im Empfänger selbst wird ein LM 339 kompatibler OPV eingesetzt.
Das Programm erfasst zunächst nur das Timing des PPM-Signals und gibt die Pulsweiten der einzelnen Servos über die serielle Verbindung an den PC aus. Die Servos selbst werden noch nicht angesteuert. Hier werde ich demnächst weiter entwickeln. Wenn mehrere kurze Pulse empfangen werden, kann es vorkommen, dass ein gemessener Wert nicht übertragen wird. Dies liegt jedoch am Timing des Programms und der relativ langsamen seriellen Verbindung. Die Messung an sich erfolgt korrekt.
Download: | rcrx2.asm | rcrx2.hex |