Grundlagen des Mikrocontrollers untersucht

Grundlagen des Mikrocontrollers untersucht

Eines ist großartig an Mikrocontroller-ICs. Diese sind fast in allen Teilen der Welt und im elektronischen Handel erhältlich.

Einführung

Grundsätzlich werden Mikrocontroller-Geräte häufig in Anwendungen eingesetzt, bei denen die Umgebung bewertet wird, und in ähnlichen elektronischen Geräten.



Sie finden diese Geräte zur Anzeige eines bestimmten Parameters, in Motorsteuerungsanwendungen, LED-Beleuchtung, Sensoren verschiedener Typen wie Neigungssensor, Beschleunigungsmesser, Geschwindigkeitsmesser, Datenlogger, Temperaturregler, Tastaturen usw.



Das primäre Verständnis für Mikrocontroller könnte durch Bezugnahme auf den AVR Amega32-Mikrocontroller gewonnen werden, der so weit fortgeschritten ist, dass er manchmal als Computer innerhalb eines Chips bezeichnet wird.

Dieses Gerät ist damit beauftragt, eine Reihe von Befehlen auszuführen, um ein Programm zu bilden.



Die Sprache des Programms, das Sie hier sehen würden, ist C ++. Sie werden diese Sprache im Kurs hier ausführlicher lernen.

Wenn es um MCUs geht, haben Sie die Möglichkeit, alle Pinbelegungen zu steuern und zu konfigurieren.

Wenn Sie ein bisschen müde werden, entspannen Sie sich einfach, weil es überhaupt nichts Komplexes ist. Sie werden alle Aspekte stetig, aber fest durchgehen, während wir weitermachen.



In einem MCU-Chip können alle Pins außer Vdd und Vss, die die Power-Pins des Chips sind, mit exklusiven Bezeichnungen versehen werden.

Pinbelegung Details

Wenn Sie den Chip von oben betrachten, finden Sie eine kleine dreieckige Kerbe, die den Startpunkt angibt, an dem die Pinbelegung beginnt. Es wird gezählt, dass der Pin Nr. 1 des Chips direkt unter dieser Kerbe beginnt.

Ausgehend von diesem Stift befinden sich auf dieser Seite (links) 20 Stifte bis zum Boden und auf der anderen Seite (rechts) weitere 20 Stifte, die sich auf der rechten Seite von unten nach oben fortsetzen.

Die ersten 8 Pins ab der Kerbe sind die PBO-7, die die Indexpins des IC bilden, da alle Programme hier mit dem Index Null beginnen.

Die obige Reihe von Pinbelegungen wird als PORT B ​​bezeichnet, während andere identische Sätze von Ports A bis D zugewiesen sind.

Diese Ports könnten zugewiesen werden, um eingespeiste Daten mit der Bezeichnung INPUT zu akzeptieren und zu erkennen und um Daten in einer bestimmten Form mit der Bezeichnung OUTPUT zu übertragen.

Zwei der Pins, die in die allgemeine Kategorie fallen, sind die (+) / (-) Pins, die auch als Vdd und GND bezeichnet werden.

Ein Stift von PORT D (PDO-6) befindet sich auf der linken Seite des Chips im unteren Bereich.

PD7, Pin Nr. 7 von PORT D, kann allein und nach Beginn der Pinbelegungsreihe auf der rechten Seite verfolgt werden.

Wenn Sie nun von der rechten Seite des Chips, an der PORT D endet, weitergehen, beginnt PORT C in der Reihenfolge mit der Zählung nach oben.

Diese tragen zu den vielen interessanten Pins der MCU bei, von analog zu digital.

Diese Pins dienen als Erfassungseingänge zum Erfassen der vielen Parameter über extern konfigurierte analoge Schaltungsstufen.

Die obigen Stifte bilden den PORT A.

Die Analog-Digital-Wandlung über die obigen Pins könnte mit Hilfe eines Beispiels verstanden werden, bei dem ein analoger Temperaturpegel, der unter Verwendung eines gewöhnlichen Sensors wie eines Thermisters erfasst wird, an einen der PORT A-Pins angelegt wird, der von der MCU leicht akzeptiert und konvertiert wird um eine digitale Anzeige von Null bis 255 Grad F zu erzeugen (eine 8-Bit-Zahl, die zum Erreichen einer 10-Bit-Ausgabe aufgerüstet werden könnte).

Ein weiteres Merkmal, das in MCUs zusätzlich beobachtet werden kann, ist der verfügbare Programmierraum oder der Speicher, der den Platz für die für den Mikrocontroller angegebenen Variablen und Programme bestimmt.

Darüber hinaus verfügen die MCUs über eine eingebaute Uhr zum Zählen der relevanten Parameter.

Die Taktfunktionen ermöglichen es der MCU, sich für viele verschiedene Zählvorgänge zu bewerben, die abhängig von der Spezifikation des jeweiligen Geräts im Bereich von Mikrosekunden schnell und in jedem gewünschten Ausmaß auch langsamer sein können.

Inzwischen haben Sie vielleicht das Mikrocontrollerkonzept bis zu einem gewissen Grad und in Bezug auf seine Anschlüsse und Pins verstanden.

So erstellen Sie einen SPI-Connector vom Programmierer zum Mikrocontroller

Jetzt ist es an der Zeit, etwas tiefer in das Thema einzusteigen und die Welt der Programmierung zu untersuchen.

Bevor wir uns jedoch einem Programmladevorgang in den Chip widmen, müssen wir einen geeigneten Weg finden, um den SPI-Anschluss (Serial Peripheral Interface) in die MCU zu integrieren.

Aber auch danach können wir den SPI nicht einfach in die MCU-Pinbelegung schieben, oder? Wir können auch nicht zulassen, dass die verlängerten Drähte vom SPI direkt in das Brotbrett eingeführt werden. Dies kann auch zu falschen Kabeleinstellungen führen, die mit den falschen Stiften verbunden sind und schlechte Verbindungen herstellen.

Um die Dinge absolut einwandfrei zu machen, führen wir die Verfahren über ein winziges Veroboard durch, bei dem wir die erforderlichen Metallverbindungsstifte erhalten, die auch als 'Header' bezeichnet werden. Diese Header-Pins können jetzt für die Verbindung mit dem SPI-Anschluss verwendet werden. Die Verbindungen von diesem Header können zu anderen parallelen Header-Pins abgeschlossen werden, die für die Steckbrettverbindungen verwendet werden können.

Somit bildet die obige Anordnung jetzt eine bequeme und zuverlässige Zwischenverbindungsplattform für das SPI mit der MCU.

Bis jetzt sieht alles gut und perfekt aus. Machen wir also weiter mit dem Programmierer, der zwischen Ihrem PC und der MCU benötigt wird.

Es könnte eine Vielzahl von Unternehmen geben, die diese Programmiergeräte herstellen und verkaufen. Daher sollte die Beschaffung dieser Geräte für Sie kein Problem sein, z. B. Adafruit Industries, USBtinyISP oder Sparkfun usw.

Einige davon könnten völlig anders aussehen als die herkömmlichen Typen, haben jedoch im Grunde alles identisch und folgen den Standardprogrammierregeln und können als Schnittstelle zwischen Ihrem PC und dem AVR-Mikrocontroller verwendet werden.

Wenn Sie jedoch eine andere MCU und keine AVR Atmega32 verwenden, müssen Sie möglicherweise nach einem entsprechend kompatiblen Programmierer für diesen bestimmten MCU-Chip suchen.

Es kann beobachtet werden, dass einige dieser Programmierer identische Treiber verwenden. Dies muss erledigt werden, und wir werden in den folgenden Kapiteln mehr darüber erfahren.

Das Verbinden Ihres PCs mit dem Mikrocontroller-Chip ist wirklich einfach, und Sie würden sich freuen zu wissen, wie einfach das Verfahren dafür erforderlich ist. Drücken wir also sofort den Knopf

Es ist nicht schwierig, die oben erläuterte SPI-Schnittstellenkarte herzustellen. Es geht darum, Ihren Lötkolben durch alle Verbindungen über die beiden gezeigten Stiftreihen auf einer kleinen Universalplatine zu bringen.

Die obige Abbildung zeigt die Verbindungsdetails, denen Sie beim Verbinden der Drähte zwischen den Headern folgen müssten.

Um die Sache noch einfacher zu machen, gehen wir die folgenden Verbindungsdetails durch, indem wir uns auf das obige Bild beziehen:

Der SPI-Pin von oben links geht an „Master IN, Slave OUT“ (MISO).

Der SPI-Pin von Mitte links ist mit dem Clock-Pin (SCK) verbunden.

Der SPI-Pin unten links verbindet sich mit dem Reset. (In den folgenden Tutorials erfahren Sie mehr über diesen Pin.)

Der für rechts unten relevante SPI wird mit dem GND-Pin der MCU verbunden. GND bezieht sich auf den Pin, der die Nullversorgungsleitung oder die negative (relative) Schiene der Versorgung bildet.

Der SPI, der vom mittleren rechten Header endet, ist mit dem MOSI-Pin (Master Out, Slave IN) der MCU verbunden.

Der SPI, der aus dem oberen rechten Header kommt, ist mit dem (+) der MCU verbunden, bei dem es sich ganz offensichtlich um den Vdd oder den positiven Versorgungsstift der MCU handelt.

Das ist es.

Schließen Sie die beiden Anschlüsse wie beschrieben an, und Ihre SPI-Schnittstellenkarte ist für die erforderlichen Aktionen bereit.

Für weitere Hilfe können Sie die oben gezeigte Abbildung konsultieren. Ihre endgültige Schnittstellenkarte sollte so aussehen, nachdem alle Kabelverbindungen mit Hilfe der obigen Diskussion ordnungsgemäß hergestellt wurden.

Ich hoffe, Sie haben die SPI-Schnittstelle möglicherweise bereits wie im vorherigen Lernprogramm erläutert erstellt. Jetzt müssen Sie sicherstellen, dass unser Computer den Programmierer akzeptiert, den wir zwischen dem PC und der MCU integrieren müssen.

Erstellen eines einfachen Programmiercodes für eine MCU

Wir verwenden eine von Sparkfun erhältliche USBTinyISP-Einheit, um den Computer mit dem Mikrocontroller zu verbinden.

Wir wissen, dass für jedes Computer-Betriebssystem wie Windows Treiber erforderlich sind, ohne die es nutzlos wäre, etwas auf den Computer zu laden. Daher benötigt unser Programmierer Treiber, um auf Ihren Computer geladen zu werden.

Lassen Sie uns einen Blick auf die Verfahren werfen, die für die Installation der Treiber in Ihrem Computer-Betriebssystem erforderlich sind. Hier sehen wir das Beispiel eines Windows 7-Betriebssystems mit 32-Bit- oder 64-Bit-Spezifikationen.

Öffnen Sie sparkfun.com und klicken Sie auf 'Pocket AVR Programmer Page'. Der Link kann leicht innerhalb der Seite visualisiert werden.

Suchen Sie als Nächstes unter Dokumente nach dem Windows-Treiber und klicken Sie einfach darauf.

Dadurch erhalten Sie die Datei bagetprog-driver.zip auf Ihrem Computer.

Gehen Sie zu Ihrem Computer, suchen Sie den Download-Speicherort und entpacken Sie die heruntergeladene Datei einfach in einen Ordner.

Wenn es sich bei Ihrem Computer um ein 64-Bit-Betriebssystem handelt, müssen Sie einige weitere Schritte ausführen, wie unter angegeben. Bei einem 32-Bit-Betriebssystem können Sie die Installation direkt von der entpackten Datei aus starten.

Für 64-Bit folgen Sie diesen, für 32-Bit einfach ignorieren:

Google 'libusb sourceforge' und klicken Sie auf diesen Link neueste Version.

Sie würden auf ein paar zusätzliche Dateien stoßen, aber Sie wären interessiert, die Startnummer zu finden, nämlich: libusb-win32-bin - #. #. #. #. Zip

Suchen Sie nun diesen Download-Speicherort auf Ihrem Computer, entpacken Sie ihn und speichern Sie ihn in einem der Ordner.

Navigieren Sie in diesen Ordner über den Ordner bin und fahren Sie mit dem Ordner amd64 fort.

Hier werden einige Ordner angezeigt: ghcalled libusb0.dll und libusb0.sys.

Sie möchten diese umbenennen in: libusb0_x64.dll und libusb0_x64.sys.

Jetzt müssen Sie die oben genannten Dateien in den Pocketprog-Treiberordner kopieren und einfach die Dateien in der vorhandenen Version überschreiben.

Um die oben genannten Treiber zu installieren, würde Sie die folgende Methode interessieren, die in ihrem Typ eher unkonventionell ist:

Es handelt sich um einen Modus zum Hinzufügen älterer Hardware.

Klicken Sie auf 'Startmenü'

Klicken Sie dann mit der rechten Maustaste auf 'Computer'.

Klicken Sie auf 'Verwalten' und schließlich auf 'Geräte-Manager'.

Wählen Sie als Nächstes im Menü 'Legacy-Hardware hinzufügen'.

Drücken Sie weiter auf 'Weiter', bis der Assistent eingefügt wird

Klicken Sie gemäß den Anweisungen auf 'Installieren Sie die Hardware, die Sie aus einer erweiterten Liste auswählen müssen'. Dadurch wird das Optionsfeldsymbol in dieser bestimmten Auswahl angezeigt. Es handelt sich tatsächlich um eine Windows-Steuertaste, die jetzt wie ein kleiner Kreis mit einer rundlich blauen Ablage im Inneren erscheint.

Klicken Sie jetzt einfach auf 'Weiter'.

Daraufhin wird das Menü 'Alle Geräte anzeigen' angezeigt, auf das Sie klicken müssen.

Klicken Sie anschließend auf das Symbol 'Festplatte haben'.

Gehen Sie mit Hilfe des Symbols „Durchsuchen“ zum Speicherort des Pocketprog-Treiberordners. Wenn Sie die Auswahl korrekt getroffen hätten, würden Sie die in diesem bestimmten Ordner abgelegte Datei pillprog.inf visualisieren.

Doppelklicken Sie auf diese Datei, und Sie werden mit Sicherheit feststellen, dass der Treiber auf Ihrem PC installiert wird.

Ende der Durchsage!! Fahren wir mit unserem nächsten Tutorial auf der nächsten Seite fort.

Inzwischen haben Sie möglicherweise die erforderliche Software installiert und die SPI-Schnittstelle erstellt.

So übertragen Sie ein Programm in einen Mikrocontroller-Chip

Im nächsten Schritt werden einige Komponenten wie ein Steckbrett, eine LED und ein berechneter Widerstand für die beabsichtigte Anwendung benötigt.

In diesem Abschnitt lernen wir die Testmethode des Programmierers kennen und bestätigen die Installation der entsprechenden Treiber und der Software.

Um zu überprüfen, ob die Treiber und die Software korrekt installiert wurden, implementieren wir ein einfaches Programm namens avrdude.

Der AVRdude ist ein Programm, das der neuesten WinAVR-Installation zugeordnet ist, ohne die die tatsächliche Übertragung der Datei in die MCU nicht möglich ist.

Dieses Programm ist ein .hex-Dateiformat, das für die MCU für die erforderlichen Ausführungen im Wesentlichen verständlich wird.

Falls die Überprüfung nicht erfolgreich ist, kann der Programmierer die Datei nicht übertragen.

Lassen Sie uns anhand der folgenden Anweisungen schnell sehen, wie wir das Testverfahren implementieren können:

Öffnen Sie die Eingabeaufforderung DOS (Disk Operating System), indem Sie auf 'Startmenü' klicken und cmd.exe in das angegebene Suchfeld eingeben.

Jetzt kann die Ausführung der AVRdude durch einfaches Eingeben von avrdude –c usbtiny –p m32 über die DOS-Eingabeaufforderung erfolgen. Sobald dies implementiert ist, erkennt das DOS sofort, ob die Verbindung erfolgreich war.

Im obigen Befehl ist '-c' ein Benachrichtigungsflag, das die Programmierparameterspezifikation 'usbtiny' enthält, während das '-p' -Tag das Mikrocontroller-Gerät identifiziert ('m32 zeigt Atmega32 an').

Wenn Sie eine andere MCU verwendet haben, müssen Sie die relevanten Präfixe für die Implementierung angeben.

Sobald der oben beschriebene Vorgang abgeschlossen ist, können Sie über die DOS-Eingabeaufforderung 'exit' eingeben. Dadurch werden Sie aus dem Fenster verschoben.

Wenn Sie sich ernsthaft über die tatsächlichen Programmierdetails wundern, müssten wir zunächst die externe analoge LED-Schaltung löten und konstruieren, über die das Programm implementiert werden könnte, denn es sei denn, es gibt ein System, das die Antwort von der MCU bestätigt, die Programmierung und der Betrieb des Mikrocontrollers wäre ziemlich bedeutungslos.

Die Herstellung der LED-Platine ist sehr einfach. Es geht darum, die beiden Kabel der LED über ein Stück Veroboard zu löten und den Widerstand mit einem der Kabel der LED zu verbinden. Die Rolle dieser LED besteht nur darin, den Strom für die LED so zu begrenzen, dass sie aufgrund der Überspannung und des Stroms vom MCU-Ausgang nicht abbrennt.

Der Wert des Widerstands kann unter Verwendung der folgenden einfachen Formel berechnet werden:

R = (Ub - LEDfwd) / I.

Wo Ub die Versorgungsspannung ist, ist LEDfwd die optimale Betriebsspannung der verwendeten LED und I die optimalen Verstärker.

Angenommen, wir verwenden eine ROTE LED mit einer LED-Durchlassspannung = 2,5 V und einem Strom I = 20 mA. Die obige Gleichung kann wie folgt gelöst werden:

Da die Spannung von der MCU 5 V betragen würde, kann sie ausgedrückt werden als:

R = (5 - 2,5) /. 02 = 125 Ohm, ¼ Watt, der nächste Wert ist 120 Ohm.

Jetzt haben wir die LED, einen 120-Ohm-Widerstand und ein Veroboard. Verbinden Sie einfach die oben genannten Komponenten wie im Diagramm angegeben mit dem Mikrocontroller.

Sobald dies erledigt ist, könnte die MCU für die beabsichtigte Reaktion auf die oben angegebene LED programmiert werden.

Als nächstes die Programmierung der MCU.

Damit der Mikrocontroller einige sinnvolle Implementierungen durchführen kann, müssen unbedingt entsprechende Anweisungen in die MCU geschrieben werden.

So installieren Sie eine Programmierumgebung und untersuchen WinAVR

Zu diesem Zweck könnten wir wahrscheinlich unseren eigenen „Texteditor“ in unserem PC verwenden, obwohl wir vielleicht die Verwendung einer professionelleren „Programmierumgebung“ anstelle eines gewöhnlichen Texteditors begrüßen würden, einfach, weil dieser Ansatz es Ihnen ermöglichen würde, einige davon zu genießen Eingebaute interessante Funktionen in diesem 'Programmierumgebungs' -Paket.

Es würde das Erstellen und Bearbeiten von Programmen in verschiedenen Sprachen unterstützen und diese auch in einen lieferbaren Modus kompilieren, der von einem Mikrocontroller-Chip leicht verstanden und akzeptiert wird.

Letztendlich würde dies von WinAVR unterstützt und auf den betreffenden MCU-Chip übertragen.

WinAVR könnte auch so ausgestattet sein, dass es viele andere Vorgänge ausführt, z. B. die Fehlerbehebung bei Programmen und die Warnung vor möglicher Syntax sowie das Kompilieren von Fehlern und Irrtümern. Wir werden diese in unseren späteren Tutorials besprechen.

Sie würden den Installationskurs von WinAVR extrem schnell und bissig machen. Lassen Sie uns mit den folgenden Punkten auf die Details eingehen:

Sie müssen die neuesten Versionen aus dem Ordner 'WinAVR Source Forge-Dateien' herunterladen. Auf der offiziellen Website finden Sie einige nützliche Informationen zu diesem Download.

Sie werden über eine Sicherheitsabfrage hinweg aufgefordert, zu antworten, ob der Download stattfinden soll. Dies wird abgefragt. Die herunterzuladende Datei ist eine ausführbare Datei.

Laden Sie die Datei herunter und starten Sie den Ausführungsvorgang, indem Sie darauf klicken. Lassen Sie die Installation beginnen.

Der Prozess führt Sie mit einigen beantwortbaren Fragen, damit Sie die Installation nach Ihren Wünschen optimieren können. Sie möchten viele davon in ihren Standardformularen ignorieren. Es liegt ganz bei Ihnen, diejenigen auszuwählen, die Ihrer Meinung nach für die Aktionen am besten geeignet sind.

Bis jetzt würden Sie alles ganz normal und locker finden und ein paar Optionen finden, wenn das Startmenü auf Sie geworfen wird. Keine Sorge, nur einige von ihnen würden tatsächlich nur eines der Tem mit dem Namen 'Programmier-Notizblock' verwenden.

Wenn Sie auf dieses Symbol klicken, wird die Benutzeroberfläche gestartet, sodass Sie möglicherweise das Schreiben der Programme anwenden können (z. B. Erstellen und Bearbeiten). Sie werden auch Zeuge des Programms, das aus Menübefehlen besteht, mit denen Sie die Codes kompilieren und in den Mikrocontroller einbetten können.

Die grundlegende Aufgabe des obigen Programmier-Notizblocks besteht darin, einen von Menschen lesbaren Code, den Sie schreiben würden, in eine Reihe von Anweisungen umzuwandeln, die nur für die MCU verständlich sind.

Das nächste Tutorial behandelt das Testen des oben genannten Programmiergeräts, damit wir sicher sein können, dass es mit Windows kompatibel ist und ob es mit Ihrem Mikrocontroller-IC perfekt „die Hand schüttelt“.

So programmieren Sie eine MCU zum Einschalten einer LED

Sobald dies bestätigt ist, erstellen wir einen kleinen 'Nichtstun' -Code, um sicherzustellen, dass bei der Codeübertragung keine Fehler auftreten.

Natürlich sind wir jetzt bereit, unser erstes Programm in der MCU zu implementieren, aber vorher wäre es interessant, schnell zusammenzufassen, was wir im Verlauf unserer vorherigen Tutorials getan haben:

Wir haben den AVR Atmel-Mikrocontroller gemäß unserer erforderlichen Spezifikation beschafft. Hier haben wir den ATMega32 für die Abbildungen verwendet. Als nächstes haben wir die Grundlagen des Mikrocontrollers und die Programmiereinheit kennengelernt, die für die Übertragung eines Programms in den MCU-Chip verantwortlich ist.

Darüber hinaus haben wir den SP-Schnittstellenanschluss entwickelt, der für die Programmierung Ihres Computers mit dem Mikrocontroller unerlässlich ist.

Danach haben wir bestätigt, ob die Treiber sowohl für ein 32-Bit- als auch für ein 64-Bit-Betriebssystem korrekt auf dem Computer installiert wurden.

Als nächstes installierten wir die Programmierumgebung Win AVR, um das einfache Schreiben und Übertragen der Codes in den Mikrocontroller zu erleichtern, gefolgt von der Implementierung des Avrdude zur Überprüfung des Programmiergeräts mit Ihrem PC und dem miteinander verbundenen Mikrocontroller.

Schließlich haben wir im vorherigen Kapitel den Aufbau der LED / Widerstandsschaltung abgeschlossen und sie mit den entsprechenden MCU-Ausgängen verbunden.

Das ist in der Tat eine Menge Arbeit, aber es ist Zeit, sich sofort mit echten Programmierarbeiten zu beschäftigen!

Zunächst möchten wir den Mikrocontroller in drei Kategorien einteilen, was unser Verständnis erheblich vereinfacht:

Kontrolle, Erkennung und Kommunikation

Es wäre interessant zu wissen, dass die oben genannten Funktionen auf viele verschiedene Arten programmiert werden können.

In unserem ersten Programm würden wir versuchen, dem Mikrocontroller zu befehlen, einen externen Parameter zu „steuern“. Ja, Sie haben Recht, es wäre die LED, die wir kürzlich gebaut haben.

Um genau zu sein, werden wir die MCU anweisen, die angeschlossene LED einzuschalten. Ja, ich weiß, dass dies ziemlich primitiv aussieht, aber die Startphase muss immer einfach sein.

Es ist eigentlich ziemlich einfach, die MCU so zu steuern, dass die MCU die LED steuert:

Dazu weisen wir Pin # 0 an PORT B ​​an, die erforderlichen 5 V für die LED zu erzeugen.

Wir erinnern uns an das vorherige Tutorial, dass wir die Anode der LED mit dem oben genannten Pin der MCU verbunden haben.

An diesen Pin der MCU müssen zwei wesentliche Dinge gerichtet werden: 1) Ausgang und 2) 5 Volt

Wir werden lernen, wie wir den bestimmten Pin anweisen können, der Ausgang der MCU zu werden.

Sobald der Ausgang des Chips eingestellt ist, können wir ihn anweisen, je nach Wunsch für eine Anwendung entweder 'hoch' (5 V) oder 'niedrig' (0 V) zu sein.

Da bei jeder Logikschaltung wie einer MCU die Pins einem Ausgang oder einem Eingang verdorren könnten und so konfiguriert sein könnten, dass sie entweder ein logisches Hoch oder ein logisches Niedrig erzeugen, müssen die Pins nur entweder einem logischen Hoch oder einem logischen Niedrig zugewiesen werden Es gibt keine anderen Zwischen- oder undefinierten Zustände als diese paar Zustände für Mikrocontroller oder für einen digitalen IC. Gleiches gilt auch für jeden Pin der MCU.

Bei den Zuordnungen der Eingangs- und Ausgangspins wären die Eingänge so positioniert, dass sie Signale von externen analogen Stufen aufnehmen, während die Ausgänge dafür verantwortlich wären, diese in die angegebenen logischen Zustände oder eine Frequenz zu interpretieren.

Obwohl die obigen Aufgaben auf viele verschiedene Arten ausgeführt werden könnten, würden wir der Einfachheit halber eine davon diskutieren. Es muss jedoch beachtet werden, dass die derzeit vorgestellte Version zwar einfach und interessant aussieht, jedoch nicht so praktikabel und nicht für alle MCU-Anwendungen empfohlen wird, aus dem gleichen Grund, aus dem Sie später im Kurs mit gängigeren Programmiermethoden vertraut gemacht werden . Mit diesen Programmen können nur die gewünschten Pins gemäß den Spezifikationen zugewiesen werden, ohne dass dies Auswirkungen auf die anderen angrenzenden Pins hat, die möglicherweise bereits für andere Funktionen zugewiesen wurden.

Im Moment kümmern wir uns jedoch nicht so sehr um die anderen Pins und verwenden nur die relevanten Pins von Interesse, um Komplikationen in gewissem Umfang zu vermeiden.

Um einen Pin als Ausgang zuzuweisen, müssen wir das Data Direction Register (DDR) verwenden. Wenn Sie sich fragen, was Register hier bedeutet, ist es einfach ein Leerzeichen in der MCU, das es dem Mikrocontroller ermöglicht, auf eine bestimmte Weise zu reagieren.

Mit der DDR können wir den Pin so einstellen, dass er entweder Daten sendet, die einer „Ausgabe“ ähneln, oder Daten akzeptiert, die in Form einer „Eingabe“ vorliegen.

Wie auch immer Sie in Bezug auf das Wort verwirrt sein mögen, was bedeutet dies? Daten fügen den Pins eine dritte Dimension hinzu, die so zugewiesen werden kann, dass sie kontinuierlich bei logisch Null (0 V) oder logisch hoch (5 V) liegen. Was ist jedoch mit den Signalen, die sich schnell ändern können, z. B. einer Impulsfrequenz? Eine Frequenz würde von hohen und niedrigen Logiken (5 V und 0 V) ​​begleitet sein, die mit bestimmten Intervallen oder Perioden schwingen. Dadurch wird sie zeitorientiert und kann zeitlich angepasst werden. Deshalb identifizieren wir sie als „Daten“, was einen Parameter bedeutet, der angibt eine Funktion relativ zu einer anderen Funktion (logische Zustände und Zeit).

Eine Methode zum Zuweisen von Pin0 als Ausgang besteht darin, den folgenden Code zu schreiben:

DDRB = 0b00000001

Im obigen Programm bedeutet DDRB, dass das Datenrichtungsregister für PORT B ​​0b den Compiler bezüglich des folgenden binären Ausdrucks einer Zahl anweist, während die „1“ am Ende des Ausdrucks die Position des Pin0 angibt, dh seine Position im Formular des ersten Stifts von PORT B.

Wenn Sie sich erinnern, haben wir erfahren, dass PORT B ​​ihm 8 Pins zuordnet (von 0 bis Pin7), und wenn Sie feststellen, dass der obige Code auch 8 Ziffern enthält, bedeutet dies, dass jede Ziffer diese 8 Pins von PORT B ​​kennzeichnet.

Das nächste Verfahren wäre nun, diesem Pin (Pin0) 5 V zuzuweisen. Wiederum ist das Funktionsprinzip mit DDR identisch, wie oben durch den folgenden Binärcode ausgedrückt:

PORTB = 0b00000001

Wie zu sehen ist, besteht der einzige Unterschied zwischen dem obigen und dem früheren Code darin, dass wir in diesem Code das PORT-Register verwendet haben. Dieses Register behandelt speziell die Pinbelegung des bestimmten Ports, für den es in der MCU positioniert wurde. Auf diese Weise können wir die realen Datenlogiken (0 oder 1) für diese Pinbelegung zuweisen.

Jetzt könnten wir interessiert sein, einige über die ungefähren Details unseres Programms zu diskutieren. Da wir wissen, dass alle Programme einen bestimmten Platz benötigen, um die Ausführung zu starten, kann dies mit einem Koch verglichen werden, der alle Zutaten für ein bestimmtes Rezept kennt, aber nicht angewiesen ist, wo er anfangen soll.

Die Hauptfunktion ist hier der Ort, an dem jedes der C / C ++ - Programme die Ausführung initiiert. Daher kann die Hauptleitung wie folgt erstellt werden:

int main (nichtig)
{
}}

Damit das Programm jedoch die DDR- und PORT-Registerdetails und ihre Funktion innerhalb des MCU-Chips interpretieren kann, muss eine zusätzliche Anweisung enthalten sein, die aus allen Daten bezüglich der AVR-MCU bestehen kann. Vielleicht möchten wir diese Aufnahme in alle unsere Programme aufnehmen.

#einschließen
int main (nichtig)
{
}}

Sobald die Kompilierung gestartet wird, konzentriert sich der Vorprozessorabschnitt des Compilers auf das AVR-Verzeichnis, um die Datei „io.h“ zu identifizieren. Die Erweiterung '.h' gibt hier an, dass es sich um eine Header-Datei handelt und dass dieser Code in der Datei am Anfang (Kopf) der zu erstellenden Quelldatei eingefügt wird, daher der Name 'Header'.

Hier können wir die DDR- und PORT-Anweisungen in unseren Code einführen, da das Hinzufügen der Header-Datei io.h den Compiler in diese Richtung geleitet hätte.

#einschließen

int main (nichtig)

{

DDRB = 0b00000001 // Datenrichtungsregister setzt Pin0 auf Ausgang und die verbleibenden Pins als Eingang

PORTB = 0b00000001 // Pin0 auf 5 Volt setzen

}}

Das Obige legt die Ausrichtung des Pins 0 als Ausgang mit einer Größe von 5 V fest. Es gibt jedoch noch ein Problem, das für diesen Pin nicht bestimmt ist: Dieser Pin muss noch angewiesen werden, auf unbestimmte Zeit eingeschaltet zu werden, solange die MCU mit Strom versorgt wird. Diese unendliche Rückkopplungsschleife würde sicherstellen, dass dieser Pin von der MCU nicht ausgeschaltet wird, sondern unbegrenzt mit dem 5-V-Ausgang fortfährt.

Obwohl es viele verschiedene Methoden zum Anwenden eines Schleifenbefehls für einen Pin gibt, würden wir hier versuchen, die 'while' -Schleife zu verwenden. Wie der Name schon sagt, teilt die 'while' -Schleife dem Mikrocontroller mit, dass 'while' die Stromversorgung verfügbar ist und Sie mit den zugewiesenen 5 V für die zugewiesene Pinbelegung aktiviert bleiben müssen.

#einschließen

int main (nichtig)

{

DDRB = 0b00000001 // Datenrichtungsregister setzt Pin0 auf Ausgang und die verbleibenden Pins als Eingang

PORTB = 0b00000001 // Pin0 auf 5 Volt setzen

während (1)

{

// Code wäre hier drin, wenn er immer und immer wieder ausgeführt werden müsste ... endlos

}}

}}

Vielleicht möchten Sie beachten, dass wir hier '1' in Form eines Arguments für die 'while' -Schleife verwendet haben, da alles außer '0' als logisches 'wahr' betrachtet werden kann.

Dies impliziert, dass die Betrachtung der 'while' -Schleife niemals für etwas anderes als ein logisches 'wahr' verantwortlich sein würde, was bedeutet, dass der bestimmte Pin mit dem angegebenen Zustand auf unbestimmte Zeit einrasten würde.

Es kann beobachtet werden, dass die LED dauerhaft über den zugewiesenen Pin leuchtet, solange die MCU über Vdd und Vss mit Strom versorgt wird.

Das ist es, jetzt haben wir das Ergebnis, das wir uns gewünscht haben und können es endlich nach so viel harter Arbeit sehen, aber dennoch ist es so befriedigend, das süße Ergebnis unserer harten Arbeit zu sehen.

In den nächsten Tutorials erfahren Sie, wie Sie der obigen LED eine Zeitdimension hinzufügen, damit sie mit einer bestimmten festgelegten Geschwindigkeit blinkt.

In der obigen Implementierung blinkt die LED tatsächlich, aber die Schleifenrate ist so schnell, dass es fast so ist, als würde die LED-Beleuchtung permanent eingeschaltet.

Wir werden sehen, wie diese Schleife wie gewünscht mit einer Verzögerung hinzugefügt werden kann, damit die LED mit dieser verzögerten Rate blinkt.

So blinken Sie eine LED mit einem AVR-Mikrocontroller

In der letzten Diskussion haben wir gelernt, wie man eine LED über einen Mikrocontroller einschaltet. Es war hervorragend, nicht wahr? Kann nicht so sehr sein!

Hier erfahren Sie, wie Sie die oben genannte LED-Beleuchtung aufpeppen, indem Sie eine bidirektionale Funktionalität zuweisen. Das heißt, wir werden versuchen, sie mit einer bestimmten Frequenz oder Rate blinken oder blinken zu lassen. Wir werden auch sehen, wie diese Rate je nach Wunsch des Benutzers erhöht oder verringert werden kann.

Schauen wir uns das an:

#einschließen

#einschließen

int main (nichtig)

{

DDRB | = 1<< PINB0

während (1)

{

PORTB ^ = 1<< PINB0

Verzögerung (100)

}}

}}

Wenn Sie sich mit den seltsamen Symbolen (&, ^, | usw.), die im obigen Ausdruck verwendet werden, verblüfft fühlen (& ist nicht vorhanden, könnte aber in anderen ähnlichen Codes verwendet werden), finden Sie hier die zugehörigen Informationen, die Sie interessieren würden ::

Es enthält viele logische Standardalgorithmen wie AND, OR, NOT und XOR, die normalerweise mit dem obigen Code verwendet werden.

Diese logischen Funktionen vergleichen speziell die beiden Bits '1' und '0' gemäß ihren zugewiesenen Wahrheitstabellen.

Wir werden uns ein Bild machen, indem wir die folgende Bitanordnung analysieren:

01001011 &
10001101
gleich
00001001

Im obigen Code bezieht sich & auf AND, wie es in der C-Programmierung verwendet wird.

Wenn Sie die Zeilen vertikal lesen, bedeutet dies, dass 0 und 1 gleich 0, 1 und 0 gleich 0, 0 und 0 gleich 0, 1 und 1 gleich 1 sind. Das Lesen ist so einfach. Diese entsprechen der Wahrheitstabelle eines UND-Operators.

Wenn wir die folgende Tabelle bewerten, zeigt sie das Symbol '|' bezeichnet die Verwendung der 'ODER' -Funktionalität, das '|' befindet sich links neben 'Rücktaste' auf Ihrer Computertastatur:

01001011 |
10001101
gleich
11001111

Identisch zeigt diese Wahrheitstabelle einer ODER-Logikfunktionalität an, dass die Bits 0 oder 1 gleich 1, 1 oder 0 auch gleich 1, 0 oder 0 gleich 0 sind, während 1 oder 1 gleich 1 ist.

Die folgende Bitkombination gilt für den mit ^ bezeichneten XOR-Logikoperator und kann genau wie bei den UND- ODER-OR-Wahrheitstabellen untersucht werden:

01001011 ^
10001101
gleich
11000110

Fahren wir nun mit dem ersten Programm fort und erfahren, was die folgende Zeile bedeutet:

#einschließen

In unseren vorherigen Tutorials wissen wir, wie der Ausdruck funktioniert, daher werden wir ihn nicht wiederholen. Es scheint sich jedoch um ein neues 'Include' zu handeln, das durch #include ausgedrückt wird und untersucht werden muss.

In diesem 'Include' ermöglicht uns die delay.h einige einfache Implementierungsmethoden.

Wie der Name schon sagt, können wir mit delay.h eine Verzögerung im jeweiligen Programm auslösen.

Der nächste Ausdruck int main (void) könnte in der laufenden Diskussion weggelassen werden, da wir dies bereits in unseren früheren Beiträgen behandelt haben.

Als nächstes kommt der geänderte DDRB.

Das Folgende zeigt die frühere Form, die keine bessere Möglichkeit zum Zuweisen der Pins darstellt, da alle Pins von 0 bis 7 umgeschaltet wurden, um die Eingänge zu bilden. Aber stellen Sie sich vor, wie wäre die Situation, wenn wir ein längeres Programm erstellen möchten, das diese Pins für andere Funktionen benötigt? Zum Beispiel könnte Pin2 zum Anwenden einer Fernumschaltung einer Appliance benötigt werden. In diesem Fall würden wir es nicht begrüßen, wenn Sie das Gleiche als Eingabe nur durch Ausprobieren zuweisen würden. Dies kann zu einer falschen Reaktion des Fernsenders auf den Geräteempfänger führen.

DDRB = 0b00000001

Wir wollen eher nur ein Bit beeinflussen, hat Pin0-Bit und einen Blick auf die 'ODER' -Funktionalität werfen, die durch eine binäre Maskierung ausgeführt werden könnte.

DDRB = DDRB | 0b00000001

Hier ist es mit einer 'ODER' -Maske verhüllt: 0b00000001, obwohl es durchaus eine authentische Binärzahl zu sein scheint, falls der frühere DDRB zum Beispiel: 0b01001010, dann könnte das Anwenden eines ODER auf diese durch Maskierung ergeben: 0b01001010 | 0b00000001 = 0b01001011.

Der resultierende Unterschied, wie beobachtet werden konnte, ist nur mit dem Pin0, dessen Bits sich geändert haben!

Wenn Sie die obige Anweisung noch weiter über C ++ komprimieren, erhalten Sie:

DDRB | = 0b00000001

Wir stellen jedoch fest, dass das gegebene Programm noch mehr enthält. Obwohl es rechtmäßig und offensichtlich aussieht, sollten wir einige der Aussagen aus der io.h-Header-Datei nutzen, insbesondere wenn sie grundsätzlich für unsere Bequemlichkeit erstellt wurde.

Wenn also „DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Wir beginnen also mit einer 0b00000000 und setzen eine „1“, um 0b0000001 zu erzeugen. Dann übertragen wir sie auf die linken 0-Positionen, was eine genau identische 0b00000001 wie oben ergibt.

Wenn es nun PINB4 wäre, könnte die Aussage als 1 ausgedrückt werden<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Beachten Sie, dass wir einen Nullindex verwenden, was bedeutet, dass nach der „1“ vier Nullen stehen.

Fahren Sie nun mit der 'while' -Schleife fort, die wir zuvor über die 'Endlosschleife' notiert hatten. Aber vielleicht möchten wir jetzt, dass der Mikrocontroller einige der gewünschten Ausführungen implementiert. Dies ist möglicherweise nur innerhalb der angegebenen Schleife möglich. In dieser Schleife wird die jeweilige Sequenz immer wieder wiederholt.

Wenn die Ausführung vor der Schleife platziert würde, hätte sie nur einmal implementiert.

Damit die LED jedoch unbegrenzt blinkt, muss der PINB0 innerhalb der Schleife abwechselnd ein- und ausgeschaltet werden. Hier finden wir auch die Verzögerungen, ohne die das Blinken der LED unmöglich wäre. Dies würde jedoch dazu führen, dass die LED mit einer sehr schnellen Geschwindigkeit blinkt, die mit bloßem Auge schwer zu erkennen ist. Sie müsste etwas langsamer werden, um mit unseren Augen identifizierbar zu werden.

Wir kennen die Einrichtungsprozedur eines bestimmten Bits in der Binärzahl, sind uns jedoch nicht sicher, wie ein bestimmtes Bit '0' angewendet werden soll, falls es noch eine '1' ist.

Das folgende Programm kann dabei gesehen werden, aber wir werden auch feststellen, dass es im Programm möglicherweise nicht sichtbar ist.

Die ersten beiden Anweisungen ändern das Bit auf '1' (5 V, LED leuchtet), dann wird eine Pause für 100 ms eingeleitet.

Die nächsten paar Zeilen verwandeln das PINB0-Bit in '0' (Nullspannung, LED ausgeschaltet), aber leider kann der AND-Vergleich keine '0' aus dem Bit ausführen, aber wenn wir NICHT '~' verwenden. Für die Binärmaske könnten alle Nullen in Einsen umgeschaltet werden und umgekehrt.

Dadurch können wir nur das PINB0-Bit beeinflussen und auf „0“ stellen. Die Klammer wurde eingefügt, um die Maskierungsausführung so zu enthalten, dass die NOT-Operation für die gesamten Masken und nicht einfach über der „1“ vor der Linksverschiebung angewendet werden kann.<<”.

PORTB | = 1<< PINB0
Verzögerung (100)
PORTB & = ~ (1<< PINB0)
Verzögerung (100)

Um die EIN-AUS-Verzögerungen oder die Perioden gleicher Dauer zu erzeugen, können wir die vorherigen vier Zeilen auf zwei verkürzen und die XOR-Funktionalität zu unserem Vorteil anwenden. Es muss beachtet werden, dass eine XOR-Ausführung einen zugewiesenen Pin einer 1 zuweist, falls diese 0 ist und umgekehrt. Diese Ausführung würde nur den PINB0 beeinflussen. Wenn der Befehl angewendet wird, wird das Bit möglicherweise einfach in das Gegenteil der vorhandenen Logik umgewandelt.

PORTB ^ = 1<< PINB0
Verzögerung (100)

GETAN! Ihre LED würde jetzt gemäß der eingestellten Rate blinken ... Einfach, nicht wahr?




Zurück: Fernbedienungsschaltung für mehrere Geräte Weiter: Wechselstromphase, Neutralleiter, Erdschlussanzeigekreis