Inhaltsverzeichnis:
- Lieferungen
- Schritt 1: Zirkulation
- Schritt 2: Timing-Diagramm
- Schritt 3: Programmierung. Makros und Definitionen
- Schritt 4: Programmierung. Hauptschleife
- Schritt 5: Programmierung. Zusatzfunktionen
- Schritt 6: Programmierung. Protothread-Routinen
- Schritt 7: Interna
Video: Attiny85 gleichzeitige Programmierung oder Kürbis mit mehrfarbigen Augen - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:15
Von jumbleviewJumbleview.infoFolgen Sie mehr vom Autor:
Über: Ich arbeite als Software-Ingenieur in einem Unternehmen der Bay Area (Kalifornien). Wann immer ich Zeit habe, programmiere ich gerne Mikrocontroller, baue mechanisches Spielzeug und mache einige Heimwerkerprojekte. Mehr über jumbleview »
Dieses Projekt zeigt, wie man zwei 10-mm-Dreifarben-LEDs mit gemeinsamer Anode (mehrfarbige Augen von Pumpkin Halloween Glitter) mit dem Attiny85-Chip steuert. Ziel des Projekts ist es, den Leser in die Kunst der parallelen Programmierung und in die Verwendung der Adam Dunkels Protothreads-Bibliothek einzuführen. Dieses Projekt setzt voraus, dass der Leser mit AVR 8-Bit-Controllern vertraut ist, C-Programme schreiben kann und Erfahrung mit Atmel Studio hat.
Projektcode auf GitHub veröffentlicht:
Lieferungen
Vor der Programmierung muss noch die Schaltung aufgebaut werden. Hier sind Komponenten:
- Attiny85-Controller (jeder elektronische Anbieter).
- Zwei dreifarbige 10mm LEDs mit gemeinsamer Anode. Adafruit-LEDs
- Widerstände 100 Ohm, 120 Ohm, 150 Ohm 0,125 oder 0,250 Wt (jeder Elektronikanbieter).
- Sechspoliger Header für AVR ISP-Schnittstelle. Kann aus diesem Adafruit-Header hergestellt werden
- Etwas Brotbrett oder gedrucktes Vorlagenbrett. Ich habe dieses hier verwendet
- AVR ISP MKII-Schnittstelle und Atmel Studio 6.1 (spätere Version sollte auch funktionieren).
Schritt 1: Zirkulation
Das Design verwendet fünf Chip-Pins:
- Zwei Pins zur Ansteuerung von Anoden: jede LED-Anode ist mit dem dedizierten Pin verbunden.
- Drei Pins (durch Widerstände) an LED-Kathoden (die gleiche Farbkathode jeder LED an demselben Pin befestigt)
Man würde fragen: Warum nicht alle sechs In / Out-Pins des Chips verwenden, damit LED-Anoden direkt an +5 V angeschlossen werden und jede Kathode einen eigenen Pin hat? Das macht die Programmierung einfach. Leider gibt es das Problem: Pin PB5 (RESET) ist ein schwacher Pin, der nur ~2 mA Strom liefern kann, während ~20 mA benötigt werden.
Natürlich kann man für diesen schwachen Pin Transistorverstärker bauen, aber ich selbst ziehe es vor, wenn möglich, das Problem durch den Code zu lösen.
Schritt 2: Timing-Diagramm
Das Timing-Diagramm hilft uns zu verstehen, was wir programmieren müssen.
Die oberen beiden Reihen des Diagramms zeigen die Spannungsänderung an den LED-Anoden. Die Spannung an Pins, die mit LED-Anoden verbunden sind, schwingt mit einer Frequenz von ~ 250 Hz. Diese Spannungsschwingung für die linke LED ist der Schwingung der rechten LED entgegengesetzt. Wenn die Spannung an der Anode hoch ist, kann die entsprechende LED hell sein. Wenn sie niedrig ist, ist die entsprechende LED dunkel. Das bedeutet, dass jede LED während eines Intervalls von 2 Millisekunden hell sein kann und während weiterer 2 Millisekunden dunkel ist. Da das menschliche Auge eine gewisse Trägheit hat, ist das Blinken mit 250 Hz für den Betrachter nicht wahrnehmbar. Die unteren drei Reihen im Diagramm zeigen die Spannungsänderung an den Pins, die mit den Kathoden der LEDs verbunden sind. Schauen wir uns die erste Diagrammspalte an. Es zeigt den Fall, dass die linke LED rot und die rechte LED grün leuchtet. Hier bleibt die ROTE Kathode niedrig, während die linke Anode hoch ist, die GRÜNE Kathode bleibt niedrig, während die rechte Anode hoch ist, und die BLAUE Kathode bleibt die ganze Zeit niedrig. Andere Spalten im Diagramm zeigen Kombinationen von Kathoden- und Anodenspannung für verschiedene Farben.
Wie wir sehen können, gibt es eine Abhängigkeit vom Zustand der Pins. Ohne einen Rahmen wäre es nicht leicht zu lösen. Und hier kommt die Protothread-Bibliothek zum Einsatz.
Schritt 3: Programmierung. Makros und Definitionen
Beispiel in Programmierschritten stellen leicht vereinfachte Version dar. Das Programm wird gekürzt und einige symbolische Definitionen durch explizite Konstanten ersetzt.
Lassen Sie uns von vorne beginnen. Das Programm enthält Dateien, die mit Atmel Studio geliefert werden, sowie den Header der Protothread-Bibliothek. Als nächstes gibt es zwei Makros zum Manipulieren der Pin-Ebenen und einige Definitionen, um Pin-Signalen logische Namen zu geben. Bisher nichts besonderes.
Schritt 4: Programmierung. Hauptschleife
Schauen wir uns dann das Ende an, um zu sehen, was die Hauptprozedur enthält.
Die Funktion main bleibt nach einer Initialisierung in der Endlosschleife. In dieser Schleife macht es die nächsten Schritte:
- Ruft die Protothread-Routine für die linke LED auf. Es ändert die Spannung einiger Pins.
- Machen Sie zwei Millisekunden Verzögerung. Die Pinspannung ändert sich nicht.
- Ruft Protothread für die rechte LED auf. Es ändert einige Pin-Spannung.
- Machen Sie 2 MS Verzögerung. Die Pinspannung ändert sich nicht.
Schritt 5: Programmierung. Zusatzfunktionen
Bevor wir mit der Diskussion von Protothreads beginnen, müssen wir uns einige Hilfsfunktionen ansehen. Zunächst gibt es Funktionen zum Einstellen einer bestimmten Farbe. Sie sind unkompliziert. Es gibt so viele solcher Funktionen wie die Anzahl der unterstützten Farben (sieben) und eine weitere Funktion, um die LED dunkel zu setzen (NoColor).
Und es gibt noch eine weitere Funktion, die direkt von der Protothread-Routine aufgerufen wird. Sein Name ist DoAndCountdown().
Technisch gesehen ist die Nutzung einer solchen Funktion nicht zwingend erforderlich, aber ich fand es praktisch. Es hat drei Argumente:
- Zeiger auf Funktionseinstellung LED-Farbe (wie RedColor oder GreenColor oder etc.)
- Anfangswert des Rückwärtszählers: Anzahl, wie oft diese Funktion in einer bestimmten Protothread-Phase aufgerufen werden muss.
- Zeiger auf Rückwärtszähler. Es wird angenommen, dass bei einer Änderung der Farbe dieser Rückwärtszähler 0 ist, so dass beim ersten Iterationscode diesem Zähler der Anfangswert zugewiesen wird. Nach jeder Iteration wird der Zähler dekrementiert.
Die Funktion DoAndCountdown() gibt den Wert des Rückwärtszählers zurück.
Schritt 6: Programmierung. Protothread-Routinen
Und hier ist der Framework-Kern: Protothread-Routine. Der Einfachheit halber ist das Beispiel nur auf drei Schritte beschränkt: für den Farbwechsel auf ROT, auf GRÜN und auf BLAU.
Die Funktion wird mit zwei Argumenten aufgerufen:
- Zeiger auf die Protothread-Struktur. Diese Struktur wurde von main initialisiert, bevor die Hauptschleife gestartet wurde.
- Zeiger auf Rückwärtszähler. Es wurde von main auf 0 gesetzt, bevor die Hauptschleife gestartet wurde.
Funktion setzt Spannungen, um die linke LED aktiv zu machen und startet dann das Protothread-Segment. Dieses Segment liegt zwischen den Makros PT_BEGIN und PT_END. Darin befindet sich Code, der in unserem Fall nur die Makros PT_WAIT_UNTIL wiederholt. Dieses Makro führt als nächstes aus:
- Aufruf der Funktion DoAndCountdown. Dadurch wird die Spannung an den LED-Kathoden eingestellt, um eine bestimmte Farbe zu emittieren.
- Das zurückgegebene Ergebnis wird mit 0 verglichen. Wenn die Bedingung 'false' ist, kehrt die Protothread-Funktion sofort zurück und übergibt die Kontrolle an die Hauptschleife.
- Wenn protothread das nächste Mal aufgerufen wird, führt es erneut Code vor PT_BEGIN aus und springt dann direkt in die PT_WAIT_UNTIL-Makros, von denen es das letzte Mal zurückgegeben wurde.
- Solche Aktionen werden wiederholt, bis das Ergebnis von DoAndCountdown 0 ist. In diesem Fall gibt es keine Rückgabe, das Programm bleibt im Protothread und führt die nächste Zeile des Codes aus. In unserem Fall ist es das nächste PT_WAIT_UNTIL, aber im Allgemeinen könnte es fast jeder C-Code sein.
- Bei der ersten Ausführung des zweiten PT_WAIT_UNTIL Rückwärtszählers ist 0, also setzt die Prozedur DoAndCountdown() ihn auf den Anfangswert. Zweite Makros werden wieder 250 Mal ausgeführt, bis der Rückwärtszähler 0 erreicht.
- Der Status von struct pt wird zurückgesetzt, sobald die Steuerung PT_END-Makros erreicht. Wenn die Protothread-Funktion das nächste Mal aufgerufen wird, wenn das Protothread-Segment das nächste Mal startet, führen Sie die Codezeile direkt nach PT_BEGIN aus.
Es gibt eine ähnliche Protothread-Routine für die rechte LED. In unserem Beispiel erzwingt es nur eine andere Farbreihenfolge, aber wenn wir es ganz anders machen dürfen: Es gibt keine enge Kopplung zwischen linker und rechter LED-Routine.
Schritt 7: Interna
Das gesamte Programm umfasst weniger als 200 Codezeilen (mit Kommentaren und Leerzeilen) und benötigt weniger als 20 % des Codespeichers von Attiny85. Bei Bedarf ist es möglich, hier mehrere weitere Protothread-Routinen zu verwenden und ihnen eine viel kompliziertere Logik zuzuweisen.
Die Protothreads-Bibliothek ist die einfachste Form der gleichzeitigen Programmierung von Computern. Concurrent Programming ist ein Ansatz, der es erlaubt, Programme in logische Teile zu unterteilen: manchmal werden sie Coroutinen, manchmal Threads, manchmal Tasks genannt. Das Prinzip ist, dass jede dieser Aufgaben die gleiche Prozessorleistung teilen kann, während der Code mehr oder weniger linear und unabhängig von anderen Teilen bleibt. Aufgaben aus logischer Sicht können gleichzeitig ausgeführt werden.
Für fortgeschrittene Systeme werden solche Aufgaben entweder durch den Betriebssystemkern oder durch die Sprachlaufzeit, die vom Compiler in eine ausführbare Datei eingebettet ist, ausgeführt. Aber im Fall von Protothreads steuert der Anwendungsprogrammierer es manuell, indem er die Protothreads-Makrobibliothek in Taskroutinen verwendet und solche Routinen aufruft (normalerweise außerhalb der Hauptschleife).
Du möchtest wahrscheinlich wissen, wie Protothread eigentlich funktioniert? Wo ist die Magie versteckt? Protothreads beruhen auf einer speziellen C-Spracheigenschaft: der Tatsache, dass die C-Switch-Case-Anweisung in if oder einen anderen Block (wie while oder for) eingebettet werden kann. Details finden Sie auf der Website von Adam Dunkels
Elektronik-Interna dieses Projekts sind sehr einfach. Das obige Foto gibt Ihnen einen Anhaltspunkt. Ich bin sicher, Sie können es besser machen.
Empfohlen:
12-Volt-Batterie-Hack! Sie werden Ihren Augen nicht trauen!!!!! (aktualisiert): 7 Schritte
12-Volt-Batterie-Hack! Sie werden Ihren Augen nicht trauen!!!!! (aktualisiert): Inspiriert von der Anleitung von Kipkay dachte ich, ich würde einige meiner eigenen Batterien einer anderen Marke abholen … Und, Junge, war ich überrascht
Arduino-Programmierung über das Handy -- Arduinodroid -- Arduino-Ide für Android -- Blinzeln: 4 Schritte
Arduino-Programmierung über das Handy || Arduinodroid || Arduino-Ide für Android || Blink: Bitte abonnieren Sie meinen Youtube-Kanal für weitere Videos…… Arduino ist ein Board, das direkt über USB programmiert werden kann. Es ist sehr einfach und günstig für College- und Schulprojekte oder sogar für Produktprototypen. Viele Produkte bauen zunächst darauf für i
So richten Sie die Programmierung in C/C++ ein.: 5 Schritte
So richten Sie die Programmierung in C/C++ ein.: C und C++ sind beliebte Programmiersprachen, die einen schnellen Zugriff auf die Erstellung von Formeln und die Lösung komplexer Probleme mit minimalem Ressourcenaufwand ermöglichen. Das Problem besteht darin, einen Weg zu finden, das Programm zu kompilieren und ausführbar zu machen. Eine Ihrer Optionen könnte sein
Programmierung des Open DSKY: 5 Schritte (mit Bildern)
Programmierung des Open DSKY: Willkommen zu unseren laufenden Instructables zur Programmierung Ihres Open DSKY. Stellen Sie sicher, dass Sie wiederkommen, da dieses Instructable weiter wachsen wird, da wir ständig neues Programmiermaterial produzieren und veröffentlichen. Also folgen Sie ihm, mögen Sie es und bevorzugen Sie es. Diese Videoserie
So kommunizieren Sie mit einem Alien-Artefakt oder . . .: 4 Schritte (mit Bildern)
Wie man mit einem außerirdischen Artefakt kommuniziert oder…: *** Enge Begegnungen der seltsam-minzigen Art. *** Dieses Instructable zeigt Ihnen, wie Sie eine Altoids-Version des Mutterschiffs "Close Encounters" bauen und damit interagieren. Dies kann ein wichtiges Training für den Tag sein, an dem das Bright White Be