Inhaltsverzeichnis:

AVR-Assembler-Tutorial 9: 7 Schritte
AVR-Assembler-Tutorial 9: 7 Schritte

Video: AVR-Assembler-Tutorial 9: 7 Schritte

Video: AVR-Assembler-Tutorial 9: 7 Schritte
Video: AVR Assembly Tutorial: Part 1 (Basic Commands) 2024, Juli
Anonim
AVR-Assembler-Tutorial 9
AVR-Assembler-Tutorial 9

Willkommen bei Lernprogramm 9.

Heute zeigen wir, wie Sie mit unserem ATmega328P- und AVR-Assemblersprachencode sowohl eine 7-Segment-Anzeige als auch eine 4-stellige Anzeige steuern. Dabei müssen wir Umwege bei der Verwendung des Stapels machen, um die Anzahl der zu bindenden Register zu reduzieren. Wir werden ein paar Kondensatoren (Tiefpassfilter) hinzufügen, um zu versuchen, das Rauschen auf unserer Tastatur zu reduzieren. Wir werden einen Spannungsverstärker aus ein paar Transistoren erstellen, damit unser INT0-Unterbrechungsschalter für die niedrigeren Spannungstasten in der unteren Reihe der Tastatur besser funktioniert. Und wir werden ein bisschen mit dem Kopf gegen die Wand schlagen und versuchen, die richtigen Widerstände zu bekommen, damit das Ding richtig funktioniert.

Wir werden unsere Tastatur aus Tutorial 7 verwenden

Um dieses Tutorial zu machen, benötigen Sie zusätzlich zu den Standardmaterialien:

  1. Eine 7-Segment-Anzeige

    www.sparkfun.com/products/8546

  2. Ein 4-stelliges Display

    www.sparkfun.com/products/11407

  3. Ein Druckknopf

    www.sparkfun.com/products/97

  4. Die Datenblätter für das Display, die von den jeweiligen oben verlinkten Seiten heruntergeladen werden können.
  5. Ein 68 pf Keramikkondensator, ein paar 104 Kondensatoren, ein paar Widerstände, zwei 2N3904 NPN-Transistoren.

Hier ist ein Link zur vollständigen Sammlung meiner AVR-Assembler-Tutorials:

Schritt 1: Verkabelung des 7-Segment-Displays

Verkabelung des 7-Segment-Displays
Verkabelung des 7-Segment-Displays
Verkabelung des 7-Segment-Displays
Verkabelung des 7-Segment-Displays
Verkabelung des 7-Segment-Displays
Verkabelung des 7-Segment-Displays

Wir werden den gleichen Code verwenden, den wir in Tutorial 7 für die Tastatur verwendet haben, um die 7-Segment-Anzeige zu steuern. Sie müssen also eine Kopie davon machen und wir werden sie ändern.

Wir werden die Segmente wie folgt auf die Pins unseres Mikrocontrollers abbilden:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

wobei die Buchstaben der Segmente im Bild zusammen mit der Pinbelegung entsprechend den üblichen 5V und jedem der LED-Segmente einschließlich des Dezimalpunkts (dp) unten rechts im Display angezeigt werden. Der Grund dafür ist, dass wir die gesamte Zahl in ein einzelnes Register eingeben und dieses Register an die Ports B und D ausgeben können, um die Segmente aufzuleuchten. Wie Sie sehen, sind die Bits fortlaufend von 0 bis 7 nummeriert und werden so den richtigen Pins zugeordnet, ohne dass einzelne Bits gesetzt und gelöscht werden müssen.

Wie Sie an dem Code sehen können, den wir im nächsten Schritt angehängt haben, haben wir unsere Anzeigeroutine in ein Makro verschoben und die SDA- und SCL-Pins für die zukünftige Verwendung im nächsten Tutorial freigegeben.

Ich sollte hinzufügen, dass Sie einen Widerstand zwischen der gemeinsamen Anode des Displays und der 5-V-Schiene legen müssen. Ich habe mich wie üblich für einen 330 Ohm Widerstand entschieden, aber wenn Sie möchten, können Sie den minimalen Widerstand berechnen, der benötigt wird, um die maximale Helligkeit aus dem Display herauszuholen, ohne es zu braten. So geht's:

Schauen Sie sich zuerst das Datenblatt an und beachten Sie, dass es auf der ersten Seite verschiedene Eigenschaften des Displays angibt. Die wichtigen Größen sind der „Durchlassstrom“(I_f = 20mA) und die „Durchlassspannung“(U_f = 2,2V). Diese sagen Ihnen, dass der Spannungsabfall über dem Display sein soll, wenn der Strom gleich dem Durchlassstrom ist. Dies ist der maximale Strom, den das Display ohne Braten aufnimmt. Es ist folglich auch die maximale Helligkeit, die man aus den Segmenten herausholen kann.

Verwenden wir also das Ohmsche Gesetz und die Kirchoffsche Schleifenregel, um herauszufinden, welchen minimalen Widerstand wir mit dem Display in Reihe schalten müssen, um die maximale Helligkeit zu erreichen. Kirchoffs Regel besagt, dass die Summe der Spannungsänderungen um eine geschlossene Schleife in einem Stromkreis gleich Null ist und das Ohmsche Gesetz besagt, dass der Spannungsabfall über einem Widerstand des Widerstands R ist: V = I R wobei I der durch den Widerstand fließende Strom ist.

Bei einer Quellenspannung von V und um unsere Schaltung herum haben wir also:

V - V_f - I R = 0

was bedeutet (V - V_f)/I = R. Der Widerstand, der benötigt wird, um die maximale Helligkeit zu erreichen (und wahrscheinlich die Segmente zu braten), wäre:

R = (V - V_f)/I_f = (5,0 V - 2,2 V)/0,02 A = 140 Ohm

Wer wollte, konnte also bedenkenlos 150 Ohm verwenden. Ich denke jedoch, 140 Ohm machen es für meinen Geschmack zu hell und daher verwende ich 330 Ohm (was sozusagen mein persönlicher Goldlöckchen-Widerstand für LEDs ist).

Schritt 2: Montagecode und Video

Den Montagecode und ein Video, das die Bedienung der Tastatur mit dem Display zeigt, habe ich beigefügt. Wie Sie sehen, haben wir die Wahlwiederholungstaste einfach auf „r“, die Flash-Taste auf „F“, das Sternchen auf „A“und die Raute auf „H“abgebildet. Diese können verschiedenen Operationen wie Backspace, Enter und was auch immer zugeordnet werden, wenn Sie weiterhin die Tastatur zum Eingeben von Zahlen auf LCD-Displays oder 4-stelligen Displays verwenden möchten. Ich werde den Code dieses Mal nicht Zeile für Zeile durchgehen, da er dem, was wir bereits in früheren Tutorials gemacht haben, sehr ähnlich ist. Die Unterschiede sind hauptsächlich nur die gleichen Dinge, die wir bereits kennen, wie Interrupts und Lookup-Tabellen. Sie sollten einfach den Code durchgehen und sich die neuen Dinge ansehen, die wir hinzugefügt haben und die Dinge, die wir geändert haben, und von dort aus herausfinden. Wir werden im nächsten Tutorial auf die zeilenweise Analyse zurückkommen, wenn wir neue Aspekte der Assemblersprachencodierung auf AVR-Mikrocontrollern vorstellen.

Betrachten wir nun eine 4-stellige Anzeige.

Schritt 3: Verdrahten des 4-stelligen Displays

Verdrahtung des 4-stelligen Displays
Verdrahtung des 4-stelligen Displays
Verdrahtung des 4-stelligen Displays
Verdrahtung des 4-stelligen Displays

Laut Datenblatt hat die 4-stellige Anzeige einen Durchlassstrom von 60 mA und eine Durchlassspannung von 2,2 Volt. Nach der gleichen Berechnung wie zuvor könnte ich also einen 47-Ohm-Widerstand verwenden, wenn ich wollte. Stattdessen werde ich einen … hrm … verwenden … lass mich sehen … wie wäre es mit 330 Ohm.

Die 4-stellige Anzeige ist so verdrahtet, dass es 4 Anoden gibt, eine für jede der Ziffern, und die anderen Pins steuern, welches Segment in jedem aufleuchtet. Sie können 4 Ziffern gleichzeitig anzeigen, da sie gemultiplext sind. Mit anderen Worten, genau wie bei den Würfeln, schalten wir einfach den Strom durch jede der Anoden und sie blinken sie nacheinander auf. Es wird dies so schnell tun, dass unsere Augen das Blinzeln nicht sehen und es sieht so aus, als wären alle vier Ziffern eingeschaltet. Um sicher zu gehen, werden wir es jedoch codieren, indem wir alle vier Ziffern einstellen und dann die Anoden schalten, anstatt einzustellen, zu bewegen, einzustellen, zu bewegen usw. Auf diese Weise können wir ein genaues Timing zwischen dem Aufleuchten jeder Ziffer erhalten.

Lassen Sie uns zunächst testen, ob die Segmente alle funktionieren.

Platzieren Sie Ihren 330-Ohm-Widerstand zwischen der positiven Schiene Ihres Steckbretts und der ersten Anode auf dem Display. Das Datenblatt sagt uns, dass die Pins von 1 bis 16 gegen den Uhrzeigersinn beginnend links unten nummeriert sind (wenn Sie normalerweise auf das Display schauen.. mit den Dezimalpunkten unten) und es besagt, dass die Anoden Pinnummern 6. sind, 8, 9 und 12.

Also verbinden wir Pin 6 mit 5V und nehmen dann eine negative Leitung von Ihrer GND-Schiene und stecken sie in alle anderen Pins und sehen, dass alle Segmente an der entsprechenden Ziffer leuchten (was eigentlich die zweite Ziffer von ist) das Recht). Stellen Sie sicher, dass alle 7 Segmente und der Dezimalpunkt aufleuchten.

Stecken Sie nun Ihren GND-Draht in einen der Stifte, um eines der Segmente zu beleuchten, und bewegen Sie diesmal den Widerstand zu den anderen 3 Anoden und sehen Sie, dass das gleiche Segment in jeder der anderen Ziffern aufleuchtet.

Irgendwas Ungewöhnliches?

Es stellt sich heraus, dass die Pinbelegung im Datenblatt falsch ist. Dies liegt daran, dass es sich um das Datenblatt und die Pinbelegung für ein 12-poliges, 4-stelliges Display handelt. D.h. eine ohne Doppelpunkt oder oberen Dezimalpunkt. Das Display, das ich bei der Bestellung erhalten habe, ist ein 16-poliges, 4-stelliges Display. Tatsächlich befinden sich bei mir die Segmentanoden an den Pins 1, 2, 6 und 8. Die Dickdarmanode ist Pin 4 (Kathodenpin 12) und die obere dp-Anode ist Pin 10 (Kathode ist Pin 9)

Übung 1: Verwenden Sie Ihren Widerstand und das Erdungskabel, um herauszufinden, welcher Pin welchem Segment und Dezimalpunkt auf dem Display entspricht, damit wir beim Codieren die richtigen Segmente aufleuchten lassen.

Die Art und Weise, wie wir die Segmentkarte codieren möchten, ist genau wie bei der einstelligen 7-Segment-Anzeige oben – wir müssen nichts am Code ändern, das einzige, was wir ändern, ist die Verbindung der Drähte auf der Tafel. Stecken Sie einfach den richtigen Port-Pin des Mikrocontrollers auf den entsprechenden Pin des 4-stelligen Displays, so dass z.

Der einzige Unterschied ist, dass wir jetzt 4 zusätzliche Pins für die Anoden benötigen, da wir nicht mehr einfach auf die 5V-Schiene gehen können. Wir brauchen den Mikrocontroller, um zu entscheiden, welche Ziffer den Saft bekommt.

Wir werden also PC1, PC2, PC3 und PD4 verwenden, um die Anoden der 4 Ziffern zu steuern.

Sie können genauso gut weitermachen und die Drähte anschließen. (vergessen Sie nicht die 330 Ohm Widerstände an den Anodendrähten!)

Schritt 4: Codierung der 4-stelligen Anzeige

Codierung des 4-stelligen Displays
Codierung des 4-stelligen Displays

Lassen Sie uns darüber nachdenken, wie wir diese Anzeige codieren wollen.

Wir möchten, dass der Benutzer die Tasten der Tastatur drückt und die Zahlen beim Drücken der einzelnen Tasten nacheinander auf dem Display erscheinen. Wenn ich also eine 1 gefolgt von einer 2 drücke, wird auf dem Display 12 angezeigt. Ich möchte diesen Wert 12 auch für den internen Gebrauch speichern, aber dazu kommen wir etwas später. Im Moment möchte ich nur ein neues Makro schreiben, das Ihre Tastendrücke aufnimmt und anzeigt. Da wir jedoch nur 4 Ziffern haben, möchte ich sicherstellen, dass Sie nur vier Zahlen eingeben können.

Ein weiteres Problem besteht darin, dass die vierstellige Multiplex-Anzeige so funktioniert, dass die Anoden durchlaufen werden, sodass jede Ziffer nur für den Bruchteil einer Sekunde eingeschaltet ist, bevor die nächste und dann die nächste und schließlich wieder die erste angezeigt wird usw. Also wir brauche eine Möglichkeit, dies zu codieren.

Wir möchten auch, dass der "Cursor" beim Eingeben der nächsten Ziffer um ein Leerzeichen nach rechts bewegt wird. Wenn ich zum Beispiel 1234 eingeben möchte, bewegt sich der Cursor nach der Eingabe der 1 so weit, dass die nächste Ziffer, die ich tippe, auf der nächsten 7-Segment-Anzeige erscheint und so weiter. Während dies geschieht, möchte ich immer noch sehen können, was ich eingegeben habe, also muss es immer noch die Ziffern durchlaufen und anzeigen.

Klingt nach einer großen Aufgabe?

Die Dinge sind tatsächlich noch schlimmer. Wir brauchen 4 allgemeinere Register, die wir verwenden können, um die aktuellen Werte der 4 Ziffern, die wir anzeigen möchten, zu speichern (wenn wir sie durchlaufen wollen, müssen wir sie irgendwo gespeichert halten) und das Problem dabei ist, dass wir wie verrückt Allzweckregister aufgebraucht haben und wenn wir nicht aufpassen, werden wir keine mehr haben. Daher ist es wahrscheinlich eine gute Idee, dieses Problem eher früher als später anzugehen und Ihnen zu zeigen, wie Sie mithilfe des Stapels Register freigeben können.

Beginnen wir also damit, die Dinge ein wenig zu vereinfachen, den Stack zu verwenden und einige Register freizugeben, und dann werden wir versuchen, die Aufgabe des Lesens und Anzeigens unserer Zahlen auf dem 4-stelligen Display zu erfüllen.

Schritt 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

Es stehen uns nur wenige „General Purpose Register“zur Verfügung, und wenn sie einmal verwendet werden, gibt es keine mehr. Daher ist es eine gute Programmierpraxis, sie nur für ein paar Variablen zu verwenden, die als temporärer Speicher verwendet werden, die Sie zum Lesen und Schreiben von Ports und SRAM benötigen, oder für Variablen, die Sie überall in Unterroutinen benötigen, und so können Sie benenne sie. Was ich getan habe, nachdem wir jetzt initialisiert haben und lernen, den Stack zu verwenden, ist, den Code durchzugehen und die benannten Allzweckregister zu finden, die nur innerhalb einer einzelnen Subroutine oder eines einzelnen Interrupts und nirgendwo sonst im Code verwendet werden, und ersetzen sie mit einem unserer temporären Register und einem Push-and-Pop auf den Stack. Wenn Sie sich Code ansehen, der für kleinere Mikrocontroller geschrieben wurde, oder wenn Sie in die Zeit zurückgehen, als alle Chips noch kleiner waren, werden Sie nur ein paar Allzweckregister sehen, die für alles verwendet werden mussten, also konnten Sie es nicht Speichern Sie einfach einen Wert darin und lassen Sie ihn in Ruhe, da Sie dieses Register sicher für andere Dinge benötigen. Sie werden also überall im Code Pushin' und Poppin' sehen. Vielleicht hätte ich unsere temporären Mehrzweckregister AX und BX als respektvolles Lob an diese vergangenen Tage nennen sollen.

Ein Beispiel soll dies verdeutlichen.

Beachten Sie, dass wir in unserem vollständigen Interrupt ADC_int für die Analog-Digital-Wandlung ein Allzweckregister verwenden, das wir buttonH genannt haben, das wir verwendet haben, um den Wert von ADCH zu laden und ihn mit unserer Nachschlagetabelle der Analog-zu-Tastendruck-Konvertierungen zu vergleichen. Wir verwenden dieses buttonH-Register nur innerhalb der ADC_int-Subroutine und nirgendwo anders. Stattdessen verwenden wir unsere Variable temp2, die wir als temporäre Variable verwenden, die wir in einer beliebigen Unterroutine verwenden können und deren Wert nichts außerhalb dieser Unterroutine beeinflusst (dh der Wert, den wir in ADC_int angeben, wird nirgendwo verwendet anders).

Ein weiteres Beispiel ist in unserem Verzögerungsmakro. Wir haben ein Register mit dem Namen "Millisekunden", das unsere Verzögerungszeit in Millisekunden enthält. In diesem Fall befindet es sich in einem Makro, und wir erinnern uns daran, dass die Funktionsweise eines Makros darin besteht, dass der Assembler den gesamten Makrocode an der Stelle des Programms ablegt, an der es aufgerufen wird. In diesem Fall möchten wir die Variable "Millisekunden" loswerden und durch eine unserer temporären Variablen ersetzen. In diesem Fall werde ich es etwas anders machen, um Ihnen zu zeigen, wie wir den Wert der Variablen selbst dann verwenden können, wenn er an anderer Stelle benötigt wird, indem wir den Stack verwenden. Anstelle von Millisekunden verwenden wir also "temp" und damit wir nicht andere Dinge vermasseln, die auch den Wert von temp verwenden, starten wir einfach das "delay"-Makro, indem wir temp auf den Stack "schieben", dann verwenden wir es anstelle von Millisekunden, und am Ende des Makros "knallen" wir seinen vorherigen Wert vom Stapel zurück.

Das Nettoergebnis ist, dass wir temp und temp2 für die vorübergehende Verwendung "ausgeliehen" und sie dann auf ihre vorherigen Werte zurückgesetzt haben, wenn wir fertig sind.

Hier ist die ADC_int-Interrupt-Routine nach dieser Änderung:

ADC_int:

Drucktemperatur; temp speichern, da wir ihn hier ändern push temp2; temp2 speichern lds temp2, ADCH; Lade Tastendruck ldi ZH, high(2*Zahlen) ldi ZL, low(2*Zahlen) cpi temp2, 0 breq return; wenn Rauschen Trigger nicht ändern 7segnumber setkey: lpm temp, Z+; aus Tabelle laden und inkrementieren clc cp temp2, temp; vergleiche Tastendruck mit der Tabelle brlo PC+4; wenn ADCH niedriger ist, versuchen Sie es erneut lpm 7segnumber, Z; andernfalls Schlüsselwerttabelle laden inc digit; inkrementiere die Ziffernnummer rjmp return; und Rückkehr adiw ZH:ZL, 1; inkrementieren Z rjmp setkey; und zurück zum Anfang return: pop temp2; temp2 wiederherstellen pop temp; temp wiederherstellen

Beachten Sie, dass der Stack so funktioniert, dass der erste Einschaltvorgang der letzte Ausschaltpunkt ist. Wie ein Stapel Papiere. Sie sehen, dass wir in unseren ersten beiden Zeilen den Wert von temp auf den Stack legen, dann temp2 auf den Stack legen, sie dann in der Subroutine für andere Dinge verwenden und sie schließlich wieder auf ihre vorherigen Werte zurücksetzen um Zuerst wird temp2 ausgeschaltet (da es der letzte war, der auf ihn gedrückt wurde, befindet er sich ganz oben auf dem Stapel und wird der erste sein, den wir wieder entfernen) und dann den Druck von temp.

Von nun an werden wir immer diese Methode verwenden. Das einzige Mal, dass wir ein Register für etwas anderes als eine temporäre Variable festlegen, ist, wenn wir es überall brauchen. Zum Beispiel verwenden wir das Register "overflows" an verschiedenen Stellen im Programm und möchten ihm daher einen Namen geben. Natürlich könnten wir es immer noch so verwenden, wie wir es mit temp und temp2 gemacht haben, da wir seinen Wert wiederherstellen würden, nachdem wir fertig sind. Aber das würde die Dinge zu sehr spaghettieren. Sie sind aus einem bestimmten Grund benannt und wir haben temp und temp2 bereits für diesen Job bestimmt.

Schritt 6: Tiefpassfilter und Spannungsverstärker

Tiefpassfilter und Spannungsverstärker
Tiefpassfilter und Spannungsverstärker
Tiefpassfilter und Spannungsverstärker
Tiefpassfilter und Spannungsverstärker

Um das Rauschen ein wenig zu bereinigen und unsere Tastatur besser zu machen, möchten wir ein paar Tiefpassfilter hinzufügen. Diese filtern das hochfrequente Rauschen heraus und lassen das niederfrequente Signal durch. Im Wesentlichen besteht die Möglichkeit, dies zu tun, einfach einen 68 pf-Kondensator zwischen unserem analogen Eingang und Masse und auch einen 0,1 Mikrofarad (d. h. 104) Kondensator zwischen unserem PD4 (INT0) Interrupt und Masse hinzuzufügen. Wenn Sie mit diesen herumspielen, während Sie Tasten auf der Tastatur drücken, können Sie sehen, was sie tun.

Als nächstes wollen wir einen Spannungsverstärker machen. Es stellt sich heraus, dass die untere Tastenreihe auf der Tastatur (sowie die Wahlwiederholungstaste) eine zu niedrige Spannung ausgibt, um den INT0-Interrupt auszulösen. Der analoge Port ist empfindlich genug, um die niedrigen Spannungen von diesen Tasten zu lesen, aber unser Interrupt-Pin erhält keine ausreichend ansteigende Flanke, um zu unterbrechen, wenn wir diese Tasten drücken. Daher möchten wir sicherstellen, dass eine schöne steigende Flanke der Spannung auf PD4 trifft, aber dieselbe niedrige Spannung auf ADC0 trifft. Dies ist eine ziemlich große Aufgabe, da beide Signale von derselben Ausgangsleitung unserer Tastatur kommen. Es gibt eine Reihe ausgeklügelter Möglichkeiten, dies zu tun, aber wir werden unsere Tastatur nach diesem Tutorial nicht mehr verwenden, also lassen Sie uns einfach eine Methode zusammenstellen, die (kaum) funktioniert.

Sie sollten zuerst eine externe Taste anschließen, um den INT0-Interrupt zu ersetzen und die Anzeige zu steuern, indem Sie eine Taste auf dem Tastenfeld gedrückt halten und auf die Taste klicken. Dadurch treten weniger Probleme mit der Tastatur auf und Sie können sicher sein, dass Ihre Spannungen in der Nachschlagetabelle der Tastatur richtig eingestellt sind. Sobald Sie wissen, dass die Tastatur richtig verdrahtet ist, entfernen Sie die Taste und setzen Sie den INT0-Interrupt zurück. Es gibt einige ernsthafte Rausch- und Spannungsprobleme, die die Tastatur auf diese Weise steuern. Es ist daher gut zu wissen, dass alles funktioniert, damit zukünftige Probleme auf die INT0-Taste isoliert werden können.

Wenn Sie Ihre Tastatur und Ihren Spannungsverstärker verdrahten, ist es sehr wahrscheinlich, dass die gleichen Widerstandswerte, die ich verwendet habe, nicht funktionieren. Sie müssen also etwas experimentieren, um Werte zu erhalten, die für Sie funktionieren.

Wenn Sie sich das Diagramm ansehen, das ich diesem Schritt beigefügt habe, sehen Sie, wie der Spannungsverstärker funktionieren wird. Wir verwenden einige Widerstände und zwei Transistoren. Die Funktionsweise von Transistoren (siehe Datenblätter!) Es gibt eine Mindestspannung, die Sie an den Basisstift des Transistors (den mittleren Stift) eingeben müssen, um ihn zu sättigen und Strom zwischen dem Kollektorstift und dem Emitter fließen zu lassen Stift. Bei dem hier verwendeten 2N3904-Transistor beträgt die Spannung 0,65 V. Jetzt nehmen wir diese Spannung von unserem Ausgang von der Tastatur und wollen diesen Ausgang nicht ändern, also werden wir einen großen Widerstand zwischen den Ausgang der Tastatur und die Basis des ersten Transistors setzen (ich habe 1 MOhm verwendet). Ich habe dies im Diagramm als R_1 bezeichnet. Dann wollen wir einen Spannungsteiler so aufbauen, dass die Basis des Transistors schon "fast" auf 0,65 Volt steht und nur noch ein klitzekleines bisschen mehr über die Spitze geschoben und gesättigt wird. Dieses winzige Bit kommt aus der Ausgabe der Tastatur, wenn wir eine Taste drücken. Da die unteren Tasten der Tastatur nur eine winzige Spannung abgeben, müssen wir bereits sehr nahe an der Sättigung sein, damit sie ausreichen. Die Spannungsteilerwiderstände sind im Diagramm mit R_a und R_b bezeichnet. Ich habe R_a = 1Mohm und R_b = 560Kohm verwendet, aber es ist fast sicher, dass Sie mit diesen Zahlen herumspielen müssen, um es für Ihr Setup richtig zu machen. Vielleicht möchten Sie eine Wand in der Nähe haben, gegen die Sie mit dem Kopf schlagen können, und zwei oder drei Gläser Scotch zur Hand (ich würde Laphroaig empfehlen - teuer, aber es lohnt sich, wenn Sie Rauch mögen. Wenn es wirklich verrückt wird, dann holen Sie sich einfach einen Krug von BV und richten Sie sich für die Nacht ein)

Schauen wir uns nun an, wie die Transistoren uns eine schöne steigende Flanke zur INT0-Taste geben und unseren Tastendruck-Interrupt generieren. Schauen wir uns zuerst an, was passiert, wenn ich keine Taste drücke. In diesem Fall ist der erste Transistor (im Diagramm mit T1 bezeichnet) ausgeschaltet. Es fließt also kein Strom zwischen den Kollektor- und Emitterstiften. Somit wird die Basis des anderen Transistors (mit T2 bezeichnet) hochgezogen und somit gesättigt, so dass Strom zwischen seinen Pins fließen kann. Dies bedeutet, dass der Emitter von T2 auf Low gezogen wird, da er mit dem Kollektor verbunden ist, der selbst mit Masse verbunden ist. Daher ist der Ausgang, der zu unserem INT0-Tastendruck-Interrupt-Pin (PD4) geht, niedrig und es wird keine Unterbrechung geben.

Was passiert nun, wenn ich eine Taste drücke? Nun, dann geht die Basis von T1 über 0,65 V (bei den unteren Tasten geht sie nur knapp darüber!) und dann wird Strom fließen lassen, der die Basis von T2 auf niedrige Spannung zieht und dies T2 abschaltet. Aber wir sehen, dass, wenn T2 ausgeschaltet ist, der Ausgang hochgezogen wird und wir daher ein 5-V-Signal an unseren INT0-Pin erhalten und einen Interrupt verursachen.

Beachten Sie, was das Nettoergebnis hier ist. Wenn wir die Taste 1 drücken, erhalten wir 5 V an PD4, ohne den Ausgang signifikant zu ADC0 zu ändern, und noch wichtiger, selbst wenn wir Asterisk, 0, Hash oder Wahlwiederholung drücken, erhalten wir auch ein 5 V-Signal an INT0 und auch eine Unterbrechung verursachen! Dies ist wichtig, denn wenn wir direkt vom Tastaturausgang zum INT0-Pin gehen, erzeugen diese Tasten fast keine Spannung und reichen nicht aus, um diesen Interrupt-Pin auszulösen. Unser Spannungsverstärker hat dieses Problem gelöst.

Schritt 7: 4-stelliger Anzeigecode und Video

Das ist alles für Tutorial 9! Ich habe den Code und ein Video, das die Operation zeigt, angehängt.

Dies wird das letzte Mal sein, dass wir die analoge Tastatur verwenden (Gott sei Dank). Es war schwierig zu bedienen, aber es war auch sehr nützlich, um uns über Analog-Digital-Wandlung, analoge Ports, Interrupts, Multiplexing, Rauschfilter, Spannungsverstärker und viele Aspekte der Baugruppencodierung von Lookup-Tabellen bis hin zu Timern/Zählern zu informieren, etc. Deshalb haben wir uns entschieden, es zu verwenden. (Außerdem macht es Spaß, Sachen aufzuräumen).

Jetzt schauen wir uns noch einmal die Kommunikation an und lassen unsere 7-Segment- und unsere 4-stelligen Anzeigen unsere Würfelwürfe von unserem Würfelroller auslesen, genauso wie wir es mit unserem Registeranalysator gemacht haben. Dieses Mal werden wir die Zweidraht-Schnittstelle anstelle unserer zusammengehackten Morsecode-Methode verwenden.

Sobald die Kommunikation funktioniert und die Rollen auf den Displays angezeigt werden, können wir endlich das erste Stück unseres Endprodukts herstellen. Sie werden feststellen, dass unser Code ohne all das analoge Port-Zeug erheblich kürzer und wahrscheinlich leichter zu lesen ist.

Für diejenigen unter Ihnen, die ehrgeizig sind. Hier ist ein "Projekt", das Sie ausprobieren könnten, für das Sie zu diesem Zeitpunkt sicherlich das Wissen haben, wenn Sie alle diese Tutorials bis zu diesem Punkt durchlaufen haben:

Projekt: Machen Sie einen Taschenrechner! Verwenden Sie unser 4-stelliges Display und unsere Tastatur und fügen Sie einen externen Tastendruck hinzu, der wie eine "Eingabetaste" funktioniert. Ordnen Sie das Sternchen "times" zu, den Hash "teilen" Sie die Wahlwiederholung auf "Plus" und den Flash auf "Minus" und schreiben Sie eine Rechnerroutine, die sich wie einer dieser alten HP "Reverse Polish"-Rechner verhält, die alle Ingenieure hatten Zurück in den Tag. D.h. Sie funktionieren so, dass Sie eine Nummer eingeben und "Enter" drücken. Dies schiebt diese Zahl auf den Stapel, dann geben Sie eine zweite Zahl ein und drücken "Enter", was die zweite Zahl auf den Stapel schiebt. Schließlich drücken Sie eine der Operationen wie X, /, + oder - und sie wendet diese Operation auf die oberen beiden Zahlen auf dem Stapel an, zeigt das Ergebnis an und legt das Ergebnis auf den Stapel, damit Sie es erneut verwenden können, wenn Sie mögen. Um zum Beispiel 2+3 hinzuzufügen, würden Sie tun: 2, "enter", 3, "enter", "+" und das Display würde dann 5 anzeigen haben den größten Teil des Hintergrundcodes bereits geschrieben. Fügen Sie einfach die Eingabetaste und die Unterprogramme hinzu, die für den Taschenrechner benötigt werden. Es ist etwas komplizierter, als Sie vielleicht zunächst denken, aber es macht Spaß und ist machbar.

Bis zum nächsten Mal!

Empfohlen: