Displayansteuerung mit ATmega
Download display.c (4.3 KB)Beschreibung
Mit diesem Code kann ein Batron MDL16265 oder kompatibles LCD-Modul mit einem Atmega-μC (getestet mit Atmega128) angesteuert werden.Erhältlich ist das Display beispielsweise bei Pollin Electronic.
Das LCD hat zwei Zeilen zu 16 Zeichen und verfügt über eine 14-polige Anschlussleiste im 2.54mm Rastermaß.
Zum Betrieb ist das Display wie folgend mit dem Controller zu verbinden:
Display-Pin | 4 (RS) | 5 (R/W) | 6 (E) | 7 (D0) | 8 (D1) | 9 (D2) | 10 (D3) | 11 (D4) | 12 (D5) | 13 (D6) | 14 (D7) |
---|---|---|---|---|---|---|---|---|---|---|---|
Controller-Pin | PD0 | PD2 | PD4 | PB0 | PB1 | PB2 | PB3 | PB4 | PB5 | PB6 | PB7 |
Die Anschlussbelegung kann natürlich auch geändert werden. Dazu sind im Quellcode die Portdefinitionen entsprechend anzupassen.
Hinweise
Die Entwicklungsumgebung war ein Atmel ATmega128 auf einer Ethernut-Platine.Als controllerseitiges Betriebsystem wurde Nut/OS verwendet.
Quellen: www.ethernut.de, www.egnite.de
PWM mit ATmega128 Mikrocontroller
Beschreibung
Dieser Code aktiviert die PWM-Funktion des ATmega.Die Auflösung beträgt 8bit und der Prescaler ist auf den kleinsten Wert eingestellt, um die höchstmöglichste Frequenz zu erreichen.
Im Versuch mit einem ATmega128 bei 14MHz betrug sie ca. 57kHz.
Sind niedrigere Frequenzen erwünscht (z.B. für Servoanwendungen) ist der Prescaler entsprechend zu erhöhen (s. ATmega128 Datenblatt (3MB) → TCCR1B [Bit 3:0]).
Code
Vor dem Aufruf der main()-Funktion sind noch die Prototypdeklarationen und das Array zur Speicherung der PWM-Werte für die drei Kanäle OCR1[A..C] in den Code einzufügen:Multitasking für ATmega-Controller
Beschreibung
Auf der Suche nach einem multitaskingfähigen OS für einen ATmega128 bin ich auf FreeRTOS gestoßen.FreeRTOS ist ein kleiner open-source Echtzeit-Kernel für verschiedene Plattformen.
FreeRTOS Homepage
Das FreeRTOS-Paket beinhaltet zur jeder unterstützten Plattform auch ein umfangreiches Beispielprogramm. Nur leider sind die Beispiele nicht nur umfangreich, sondern für den Einsteiger auch recht unüberschaubar und dadurch nicht sofort verständlich und anwendbar.
Weil man i.d.R. aber primär nur am Multitasking interessiert ist, habe ich ein kleines Beispielprogramm geschrieben welches zeigt, wie man schnell und ohne großen Aufwand mit FreeRTOS in Verbindung mit WinAVR Multitasking realisieren kann.
Voraussetzungen
Einzige Voraussetzung ist eine funktionierende WinAVR-IDE und die Fähigkeit einfache eigene Programme zu schreiben und sie auf den Mega128 zu flashen.WinAVR ist ein Entwicklerumgebung für AVR-Controller, bestehend aus Editor (Programmers Notepad 2), modifiziertem GCC Compiler und Linker. Bevor man also an Multitasking denken sollte, muss zunächst WinAVR auf dem Rechner installiert sein und laufen.
Anleitung
Wenn man soweit ist, kann man FreeRTOS hier downloaden: FreeRTOSv3.2.2. Download (2.3 MB)Die Zipdatei sollte am besten in das WinAVR-Verzeichnis entpackt werden.
Also
X:\WinAVR\FreeRTOS\
Als nächstes erstellt man im
Demo
-Verzeichnis von FreeRTOS ein Verzeichnis
AVR_ATMega128_WinAVR
.
In dieses Verzeichnis wird dieses Beispielprogramm (7 KB) extrahiert.
Das war's auch schon fast. Jetzt die main.c mit WinAVR kompilieren (
make all
) und auf den
Controller laden.
Was macht das Programm?
Das Beispielprogramm mach nichts weiter als zwei LEDs, die an den Pins PB0 und PB2 angeschlossen sind, zum blinken zu bringen.Nicht gerade berauschend, könnte man meinen...
- aber nicht vergessen: hier wird jede LED von einem eigenen Thread gesteuert!
Statt blinkender LEDs andere nebenläufige Funktionen zu realisieren oder weitere Threads/Tasks zu erstellen, sollte mit diesem Beispiel nun kein Problem mehr sein.
Es empfiehlt sich evtl. auch ein Blick auf das folgende Codeschnipsel, wo Multithreading für den Roboter ASURO (ATmega8) ebenfalls mit FreeRTOS und WinAVR implementiert wird.
Links und Downloads
FreeRTOS HomepageWinAVR
FreeRTOSv3.2.2. Download (2.3 MB)
Beispielprogramm - einfaches Multitasking (7 KB)
Multitasking für den ASURO-Roboter
Beschreibung
ASURO ist ein kleiner mobiler Roboter, der zu Ausbildungszwecken am DLR entwickelt wurde.http://www.dlr.de/st_op/aktuelles/pressemitteilungen/2003-006-ASURO
Im Bausatz enthalten sind u.a. ein Linienfolge-Sensor, ein paar Taster und ein IR-Empfänger als Sensoren und ein paar LEDs und zwei Antriebsräder mit Motoren als Aktoren. Das "Gehirn" des ASURO ist ein Atmel ATmega8.
Programmiert wird der Controller in C mit WinAVR. Und als mir im Studium ein solcher ASURO-Bausatz in die Hände fiel, um ihn als Vorführgerät zusammenzubauen und ich gerade zuvor mit FreeRTOS Multitasking für den ATmega128 realisiert hatte (siehe oben), lag es natürlich nahe auch ein Multitasking-Codeschnipsel für den ASURO und dessen ATmega8 zu schreiben, was dann kein Aufwand mehr war.
Voraussetzungen
Benötigt werden ein fertig aufgebauter ASURO, das installierte WinAVR und das Programm zum flashen des Controllers (Flash.exe) von der ASURO-CD.Sinnvoll ist auch sich bereits mit der WinAVR Entwicklungsumgebung und dem Flash-Tool vertraut zu machen und das eine oder andere kleine Programm bereits selbst geschrieben zu haben.
Anleitung
Zunächst muss das FreeRTOS-Paket hier geladen werden: FreeRTOSv3.2.2. Download (2.3 MB)Am besten extrahiert man FreeRTOS in das WinAVR-Verzeichnis.
Also
X:\WinAVR\FreeRTOS\
Als nächstes erstellt man im
Demo
-Verzeichnis von FreeRTOS ein Verzeichnis ASURO
.
Beispielprogramm (157 KB) extrahiert.
Mit dem Flash-Tool lädt man nun die Datei main.hex auf den ASURO-Controller.
Das Flashen über IR kann durchaus ein paar Minuten dauern, da die Datei ca. 18 KB groß ist...
Wenn die Datei korrekt auf den Controller geladen wurde, den ASURO kurz ausschalten und wieder einschalten.
Und los geht's!
Was macht das Beispiel-Programm?
Das Programm startet drei Tasks. Der erste Task macht nichts anderes als die beiden roten LEDs hinten an den Antriebsrädern wechselnd blinken zu lassen. Weiter nichts.Der zweite Task ist schon interessanter: Er ist für die Motorsteuerung zuständig und fragt ständig eine globale Variable is_collison ab. Hat diese Variable einen Wert ungleich 0 wird der Task den ASURO stoppen, etwas zurück fahren lassen, ca. 90° nach links drehen und ihn wieder weiter geradeaus fahren lassen und is_collison wieder auf 0 setzen.
Der dritte Task schließlich überprüft kontinuierlich die sechs Taster an der Front des ASURO und setzt is_collison auf 1 sobald einer der Taster gedrückt ist und schaltet dann die Status-LED von grün auf rot.
Übrigens gibt es zur Funktion und dem Ablauf des Programmes eine ausführliche Dokumentation im Unterverzeichnis /html/, Datei index.html.
Hinweis
Der ASURO hat mechanisch bedingt recht ungenaue Fahreigenschaften.
Lässt man beide Motoren mit gleicher Leistung laufen (z.B.
Bei dem von mir programmierten ASURO beispielsweise musste für einen exakten Geradeauslauf das linke Rad etwa 10% langsamer laufen als das Rechte.
Um den Roboter also z.B. mit 2/3 Leistung vorwärts fahren zu lassen schrieb ich:
Betrag und Richtung dieser Spurlaufdiskrepanz sind aber bei jedem ASURO individuell anders!
Zur Korrekturwertfindung lässt man den Roboter einfach mit gleicher Leistung für beide Räder fahren und verringert bei Rechtskurven den Wert für das linke Rad und bei Linkskurven den des rechten Rades, bis eine akzeptable Geradeausfahrt erreicht ist.
MotorSpeed(255, 255);
), wird der
Roboter eine (mehr oder weniger) langgezogene Kurve fahren.
Bei dem von mir programmierten ASURO beispielsweise musste für einen exakten Geradeauslauf das linke Rad etwa 10% langsamer laufen als das Rechte.
Um den Roboter also z.B. mit 2/3 Leistung vorwärts fahren zu lassen schrieb ich:
MotorSpeed(155, 170);
Betrag und Richtung dieser Spurlaufdiskrepanz sind aber bei jedem ASURO individuell anders!
Zur Korrekturwertfindung lässt man den Roboter einfach mit gleicher Leistung für beide Räder fahren und verringert bei Rechtskurven den Wert für das linke Rad und bei Linkskurven den des rechten Rades, bis eine akzeptable Geradeausfahrt erreicht ist.
Links und Downloads
FreeRTOS Homepage
WinAVR
FreeRTOSv3.2.2. Download (2.3 MB)
Beispielprogramm - Multitasking für ASURO (157 KB)