Mikrocontroller - Eine Einführung für Anfänger - Das erste Programm zum Einschalten einer LED schreiben und in den Mikrocontroller übertragen
Teilen
Mikrocontroller - Eine Einführung für Anfänger - Schreiben des ersten Programms zum Einschalten einer LED und Übertragen des Programms in den Mikrocontroller
Ich weiß, dass Sie bereit sind, das erste Programm zu schreiben. Sie haben schon viel durchgemacht! Lassen Sie uns das Geschehene rekapitulieren. Sie haben den AVR Atmel Mikrocontroller Ihrer Wahl gekauft. Ich habe den ATMega32 für meine Zwecke gewählt. Sie wurden in das Konzept der Mikrocontroller und deren Funktionsweise eingeführt; und wurden auch mit dem Programmiergerät bekannt gemacht, dem Gerät, das hilft, das Programm in den Mikrocontroller zu übertragen. Sie haben eine praktische Schnittstelle gebaut, die verwendet wird, um die SPI-Pins mit den richtigen Pins des Mikrocontrollers zu verbinden. Sie haben überprüft, dass die Programmierer (USBTinyISP) Treiber korrekt installiert wurden für die 32-Bit- und 64-Bit-Versionen von Windows (XP, 7 und Vista). Sie haben auch die Programmierumgebung „WinAVR“ installiert, damit Sie eine Umgebung haben, in der Sie Ihr Programm schreiben und dann in den Mikrocontroller übertragen können. Und um sicherzustellen, dass alles richtig funktioniert, haben Sie avrdude verwendet, um den Programmierer zu testen, während er an den Computer und den Mikrocontroller angeschlossen war. Erinnern Sie sich, dass dieses Programm das Programmübertragungsdienstprogramm ist, um unser kompiliertes Programm in den Speicher des Mikrocontrollers zu verschieben. Schließlich haben Sie die erste Schaltung gebaut, damit wir etwas haben, für das wir ein Programm schreiben können. Puh... das war eine Menge! Aber da Sie all diese Hürden genommen haben, ist die harte Arbeit vorbei und es ist von hier an ein Kinderspiel. Hoffentlich konnten Sie die vorherigen Schritte ohne Probleme durchlaufen – also lassen Sie uns nun mit unserem ersten Programm beginnen.
Der Einfachheit halber wollen wir die Funktion des Mikrocontrollers in drei Kategorien einteilen: Steuerung, Sensorik und Kommunikation. Wir werden die Details der Entwicklung jeder dieser Funktionen weglassen und uns in diese Details vertiefen, während wir die verschiedenen Programme schreiben. Beachten Sie, dass es viele Möglichkeiten gibt, diese Funktionen zu programmieren. Für das erste Programm werden wir den Mikrocontroller etwas "steuern" lassen. Und wie Sie aus dem vorherigen Beitrag wissen, werden wir zu diesem Zweck eine LED verwenden. Im Grunde werden wir die LED einschalten. Ja, ich weiß... langweilig, oder? Nun, ich muss irgendwo anfangen! Während ich Sie durch die Erfahrung der Programmierung führe, werde ich nach und nach mehr Komplexität hinzufügen, damit Sie diese wichtigen Konzepte leicht verstehen können.
An diesem Punkt fragen Sie sich wahrscheinlich... wie erstellt man ein Programm,
um eine LED zu steuern? Nun, es ist wirklich einfach: Wir werden Pin0 an PORTB einfach
anweisen, 5 Volt auszugeben. Denken Sie daran, dass dies der Pin ist, an den der
Pluspol (Anode) angeschlossen ist. Der erste Schlüssel in diesem Szenario ist „Ausgabe“
und der nächste ist „5 Volt“. Es gibt eine Möglichkeit, einem bestimmten Pin mitzuteilen,
dass er vom MCU als Ausgang gesetzt werden soll. Sobald ein Pin für die Ausgabe
festgelegt wurde, können Sie diesen Pin dann steuern und ihn entweder auf Hoch (5
Volt) oder auf Tief (null Volt) stellen. Und da es für diesen Pin im Ausgabemodus
nur zwei Zustände gibt (5V oder 0V) und nur zwei Zustände für den Modus selbst (Eingabe
oder Ausgabe), müssen Sie den Wert nur auf logisch 1 oder 0 setzen. Beachten Sie,
dass dies für jeden Pin, den wir in unserer Schaltung verwenden möchten, erreicht
werden muss. Bevor wir jedoch eine 1 oder 0 einstecken, sprechen wir über Eingabe
versus Ausgabe. Wenn ein Pin im Eingabemodus ist, wartet er auf eine Spannung. Wenn
der Pin im Ausgabemodus ist, kann er mit 5V geladen oder mit 0V nicht geladen werden.
Das war’s!
Dazu gibt es viele Wege. Das soll Sie nicht verwirren, sondern die Dinge einfacher machen. Ich werde Ihnen eine der vielen Möglichkeiten vorstellen, diese Aufgabe zu erfüllen, und später werde ich beim Schreiben anderer Programme einige andere Methoden erklären. Beachten Sie jedoch, dass diese erste Methode zwar hervorragend geeignet ist, um das Konzept einzuführen, aber in der Praxis wahrscheinlich nicht so gut ist. Daher werden Sie in zukünftigen Programmen andere Methoden sehen, die kontextbezogene Pins (die Pins auf beiden Seiten des interessierenden Pins) unberührt lassen, da sie sehr wohl zuvor im Programm gesetzt worden sein könnten. Da wir jedoch ein einfaches Programm schreiben, werden wir uns zu diesem Zeitpunkt nicht um diese Komplexität kümmern.
Um den Ausgabemodus für einen Pin auszuwählen, verwenden Sie das Datenrichtungsregister (DDR). Oh Mann! Was ist ein Register?!? Lassen Sie sich davon nicht beunruhigen. Ein Register ist einfach ein Speicherort, der den Mikrocontroller auf irgendeine Weise reagieren lässt. Wir verwenden ein Register, um einen Zustand für den Mikrocontroller festzulegen oder den Mikrocontroller etwas tun zu lassen. Es ist wie Reflexe oder Kitzel. Wenn eine Person eine andere Person kitzelt, löst das Lachen aus. Wir können den MCU dazu bringen, etwas zu tun, indem wir einen bestimmten Wert in einem Register setzen. Das ist alles, was Sie im Moment wissen müssen.
Wenn Sie also das DDR-Register verwenden, können Sie den Pin entweder zum Ausgeben von Daten oder zum Akzeptieren von Dateneingaben einstellen. Aber wir haben Eingabe oder Ausgabe gesagt, jetzt sagen Sie auch Daten. Der hier verwendete Begriff "Daten" fügt dieser Idee einfach eine weitere Dimension in Form von "Zeit" hinzu. Wenn Sie einen Pin auf 5 Volt, dann auf Null Volt und dann wieder auf 5 Volt stellen... senden Sie tatsächlich Einsen und Nullen. Für den Pin ist dies nichts anderes als ein hoher (5 Volt) Zustand und dann ein niedriger (Null Volt) Zustand: Der MCU sieht diese Hoch-/Niedrig-Logik. Und Sie können Daten auch auf die gleiche Weise empfangen.
Es gibt verschiedene Möglichkeiten, Pin0 für Port B als Ausgang zu konfigurieren. Eine Möglichkeit besteht darin, Folgendes zu schreiben:
Lassen Sie es mich erklären. "DDRB" bezieht sich auf das Data Direction Register für Port B; "0b" signalisiert dem Compiler, dass das Folgende die binäre Darstellung einer Zahl ist; und die "1" am Ende kennzeichnet die Pin 0 Position (den ersten Pin in Port B). Denken Sie daran, dass Port B 8 Pins hat; Pin 0 bis 7. Es gibt auch 8 Ziffern in unserer Codezeile. Jede Ziffer repräsentiert also einen Pin am Port, und wir können die einzelnen Ziffern verwenden, um sich speziell auf einen der Pins in Port B zu beziehen. Die '1' am Ende unserer Codeanweisung bezieht sich also auf den ersten Pin in Port B, der in diesem Fall Pin 0 ist. (Denken Sie daran, dass C und C++ nullbasierte Sprachen sind, daher bezieht sich der erste Index einer Datenstruktur auf das nullte Element; der zweite Index auf das erste Element usw.) Wir müssen an diesem Punkt nicht komplizierter werden, da dies in zukünftigen Tutorials viel detaillierter behandelt wird. Wenn Sie jedoch mehr über das Binärsystem wissen möchten, schauen Sie hier nach.
Jetzt müssen wir 5 V an den Pin anlegen. Dies funktioniert genau wie die DDR-Codeanweisung,
die wir oben verwendet haben. Wir werden eine Binärzahl verwenden, um mit dieser
Anweisung 5 V an diesen Pin (Pin 0) anzulegen:
Der einzige Unterschied zwischen dieser und der vorherigen Anweisung ist, dass wir jetzt das PORT-Register verwenden. Dieses Register kennt die Pins dieses spezifischen Ports und ermöglicht uns den Zugriff, um den tatsächlichen Datenwert (logisch 0 oder 1) für diese Pins anzugeben.
Nun müssen wir etwas über die Gesamtstruktur unseres Programms sprechen. Alle Programme brauchen einen festgelegten Startpunkt für die Ausführung. Es ist wie jemandem eine Reihe von Anweisungen zum Backen eines Kuchens zu geben, ohne ihm zu sagen, mit welchem Schritt er beginnen soll. Die Funktion "main" ist der Ort, an dem alle C/C++-Programme die Ausführung beginnen. Wir werden also eine main-Funktion erstellen.
{
}
Damit das Programm die Informationen des DDR- und PORT-Registers und deren Funktionsweise im Mikrocontroller verstehen kann, muss eine Include-Anweisung hinzugefügt werden, die alle Informationen über die AVR-Mikrocontroller enthält. Diese Include-Anweisung wird wahrscheinlich in allen Ihren Programmen enthalten sein.
int main(void)
{
}
Wenn der Kompilierungsprozess beginnt, sucht der Präprozessor des Compilers im "avr"-Verzeichnis nach der Datei "io.h". Die Erweiterung ".h" zeigt hier an, dass es sich um eine Header-Datei handelt, und (wie der Name schon sagt) der Code in dieser Datei wird am Anfang (Kopf) der von Ihnen erstellten Quelldatei eingefügt. Jetzt können wir die DDR- und PORT-Anweisungen in unseren Code einfügen, da die Einbindung der io.h-Header-Datei den Compiler darüber informiert hat.
int main(void)
{
Jetzt ist die Richtung von Pin0 auf Ausgang eingestellt, mit einem Wert von 5V. Aber wir sind noch nicht fertig. Wir müssen den Mikrocontroller unbegrenzt laufen lassen, also brauchen wir eine Routine dafür. Das nennt man eine Endlosschleife (oder unendliche Schleife). Die Endlosschleife stellt sicher, dass der Mikrocontroller seine Operationen nicht stoppt. Ich werde dies im Detail erklären, wenn wir innerhalb dieser Schleife etwas zu tun haben. Es gibt mehrere Arten von Schleifen, die wir zu diesem Zweck verwenden können, aber für diese Demonstration werde ich die While-Schleife verwenden. Es bedeutet im Englischen dasselbe wie im Code: Zum Beispiel, "solange" ich die Hand oben habe, solltest du weiter klatschen.
int main(void)
{
PORTB = 0b00000001; //Setze Pin0 auf 5 Volt
while(1)
{
Beachten Sie, dass wir eine '1' als Argument für die while-Schleife verwenden, da alles außer '0' logisch wahr ist. Daher wird die Bedingung der while-Schleife niemals etwas anderes als logisch wahr sein, und das Programm wird unbegrenzt weiter ausgeführt (d.h. ich halte meine Hand oben).
Das ist also das Ergebnis
unserer Arbeit. Es war bisher ein langer Weg, aber ich verspreche, von hier an wird
alles lohnend und weit weniger zeitaufwendig sein. Im nächsten Video und in der
nächsten Anleitung werden wir die LED blinken lassen. Wir werden untersuchen, wie
man eine Verzögerung erzeugt, damit die LED nicht so schnell blinkt, dass es so
aussieht, als würde sie nicht blinken.