Synopsis: [Zylonen]
Durch eine LED-Spende an die Schule motiviert, entwickelte ich eine kostengünstige Platine für meine Schüler zum Üben.
Die Platine
- ATtiny2313 (A)
- 3 Taster gegen GND an PD4..6
- Matrix- Anordnung von 16 LED
- Zeit-Multiplex Ausgabe möglich
- Zufall
- Sound an PB4 ausgeben OC1B Ausgang
- Quarz, Keramikschwinger möglich
Berechnung der Widerstände
Farbe | U bei 1 mA | U bei 20 mA | LED Vorwiderstand | I gemessen |
---|---|---|---|---|
Rot | 1,7 V | 2,0 V | (5V-1,8V)/10mA =320Ω => 330Ω | 9,3mA |
Grün | 2,9-3,0 V | 3,5-3,9 V ! | (5V-3,2V)/10mA =180Ω | 9,1mA |
Blau | 2,8 V | 3,3-3,8 V ! | (5V-3,2V)/10mA =180Ω | 9,7mA |
Laut [Datenblatt ATtiny2313] liefert ein Portpin maximal 40 mA, der maximale Strom in VCC und aus GND darf 200mA nicht überschreiten. Der maximale Strom in eine LED darf bei kontinuierlichem Betrieb 20mA nicht überschreiten. Die Kathoden von jeweils 4 LED münden in einen Portpin (siehe Schaltplan). Die Schaltung wird mit 5 V betrieben, die Ausgangsspannung eines Portpins sei bei Low 0V und bei High 5V, das ist idealisiert, tatsächlich liegt sie laut Datenblatt bei 20mA Strom bei Low <0,7V und bei High >4,2V.
Eine erste einfache Annahme für die Berechnung ist, dass der maximale Strom an einem Portpin dann auftritt, wenn die Anoden von 4 LED Strom über 4 Widerstände ziehen.
Seien PB7..PB4 Low und PB3 High, es leuchten LED1, LED5, LED9, LED13. PB3 liefert den Strom für die 4 LED. Der Strom durch eine LED darf durch die 40mA Grenze eines Portpins nicht grösser als 10mA sein. Sollten alle LED gleichzeitig leuchten wäre der Strom in und aus dem µC <160mA, was im erlaubten Bereich liegt.
Die Berechnungen in der Tabelle wurden mit Schätzwerten für die Spannung an der LED bei 10mA und mit einem Sollstrom von 10mA durchgeführt. Zur Kontrolle wurden die tatsächlichen Ströme mit den ermittelten Vorwiderständen gemessen.
Messungen des Gesamtstrombedarfs mit blauen LED: Ruhestrom ohne LED 2,68mA; 4LED 1..4 leuchten 11,7mA; 4LED 1,5,9,13 leuchten 24,8mA; alle LED leuchten 38mA. Vcc-UPB0 = 0,5V bei 25mA.
Der Schaltplan
Plan wurde mit [fritzing] erstellt. Projekt laden: [Zylonenauge6.fzz]
Bauanleitung
Ein altes 5V-Netzteil eines Handys und eine Hörmuschel eines ausgedienten Kopfhörers finden eine neue Aufgabe..
[Zylonenauge_Bauanleitung.pdf]
Port- und Verbinder J7 Belegung
PORTB wird für die 16 Leuchdioden und den Lautsprecher verwendet. An PORTD sind die Taster gegen GND angeschlossen.
PORTB | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 |
---|---|---|---|---|---|---|---|---|
Belegung | - Led 15,14,13,12 | - Led 11,10,9,8 | - Led 7,6,5,4 | - Led 3,2,1,0 & Lautsprecher | + Led 15,11,7,3 | + Led 14,10,6,2 | + Led 13,9,5,1 | + Led 12,8,4,0 |
PORTD | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 |
Belegung | NC | Taster S2 | Taster S1 | Taster S0 | J7 1 | J7 2 | J7 5 | J7 6 |
Am Verbinder J7 sind die freien Pins herausgeführt, dort kann z.B. ein Keramikschwinger angeschlossen werden.
Verbinder J7 Pin | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
Belegung | +5V | GND | PD0 (RXD) | PD1 (TXD) | PA1 (XTAL2) | PA0 (XTAL1) | PD2 (INT0) | PD3 (INT1) |
Led-Matrix: Eine Led leuchten lassen
Um mit 8 Port-Pins 16 LED ansteuern zu können sind die LED als Matrix verschaltet. Um beispielsweise Led0 leuchten zu lassen muss PB4 auf 0 und PB0 auf 1 geschaltet werden. An PORTB muss dazu 0b11100001 = 0xe1 ausgegeben werden.
Aufgaben
Ausgabe-Array vervollständigen
Vervolständigen Sie das Array unsigned char ledausgabe[]={0xe1,...} um darüber das für die LED 0..15 passende Muster ausgeben zu können.
Zylonenlauflicht programmieren
Erstellen Sie ein Programm, das einen Leuchtpunkt hin und her laufen lässt. Verwenden Sie dazu _delay_ms(30). Lösung anzeigen..
Leuchtpunkt mit Tasten wandern lassen
Erstellen Sie ein Progamm, das dieses Verhalten zeigt:
- Nach Reset oder Druck auf Taste S1 leuchtet Led7
- Bei Druck auf Taste S0 bewegt sich der Leuchtpunkt um eine Led abwärts, bei Led0 ist Schluss.
- Bei Druck auf Taste S2 bewegt sich der Leuchtpunkt um eine Led aufwärts, bei Led15 ist Schluss.
Zum Entprellen der Tasten können Sie die Funktion keycheck() verwenden.
Reaktionsspiel programmieren
Entwickeln Sie ein Reaktionsspiel für die Zylonenplatine, hier die Vorgabe: [https://www.youtube.com/watch?v=R6G8hLEMesk]
Led-Matrix: Beliebige LED scheinbar gleichzeitig leuchten lassen (Zeit-Multiplex-Verfahren)
Durch die Matrix-Anordnung ist es nicht möglich, beliebige LED zeitgleich leuchten zu lassen. Durch die Trägheit des Auges ergibt sich jedoch die Möglichkeit, nacheinander die LED-Gruppen an PB7..4 ihre Muster ausgeben zu lassen:
- Nur PB4 auf 0 und Muster für LED3..0 anlegen.
- Nur PB5 auf 0 und Muster für LED7..4 anlegen.
- Nur PB6 auf 0 und Muster für LED11..8 anlegen.
- Nur PB7 auf 0 und Muster für LED15..12 anlegen.
- Wieder zu 1.
Es bietet sich an, die Ausgabe über einen Timer gesteuerten Interrupt periodisch ausführern zu lassen, das Muster wird dabei im SRAM gespeichert.
Aufgaben
ISR Aufrufzeit festlegen
Wie oft muss der Timerinterrupt zur Ausgabe aufgerufen werden, damit die Ausgabe flackerfrei erscheint?
Datenstruktur für die SRAM-Speicherung festlegen
Spontan können zwei Datenstrukturen gefunden werden:
- Zwei Byte: Byte1 für LED15..8 und Byte0 für LED7..0
- Vier Byte: Byte3 für LED15..12, Byte2 für LED11..8, Byte1 für LED7..4 und Byte0 für LED3..0
Um zu beurteilen welche Datenstruktur besser ist, gilt es zu bedenken:
- Aufwand die Information ins SRAM zu speichern
- Aufwand die Information in der ISR auszugeben
- Platzbedarf bei der Speicherung
Welche Struktur ist besser, Begründung?
Leuchtbalken mit Tasten einstellen
Erstellen Sie ein Progamm, das dieses Verhalten zeigt:
- Nach Reset oder Druck auf Taste S1 leuchtet Led7
- Bei Druck auf Taste S0 entsteht ein Leuchtbalken um eine Led abwärts, bei Led0 ist Schluss.
- Bei Druck auf Taste S2 entsteht ein Leuchtbalken um eine Led aufwärts, bei Led15 ist Schluss.
Zum Entprellen der Tasten können Sie die Funktion keycheck() verwenden. Gliedern Sie Ihr Programm in folgende Abschnitte:
- Einer ISR für die periodische Ausgabe des Leuchtmusters aus dem SRAM
- Einer Funktion ausgebeBalken(unsigned char n), die das Balkenmuster ins SRAM schreibt
- Einer Funktion main() mit Aufruf der Initalisierung, der Abfage der Tasten und des Aufrufs vonausgebeBalken(unsigned char n)
Für Checker: Unterschiedliche Helligkeit
Vier verschiedene Helligkeiten sollen die LED annehmen können: {Aus,1/3,2/3, An} .Beim Leuchtblaken beginnen die LED beginnen nun erst mit 1/3 zu leuchten, erst wenn sie An sind, wird bei Tastendruck die nächste LED angegangen.
Tipps: Vram-Datenstruktur muss geändert werden. Pulsweitenmodulation. Ein ganzer Zyklus ist nun drei mal länger.
Bonus: Schneefall
Ausblick
Lautsprecher ansprechen, Lichtsensor, Keramikschwinger, Spiele portieren..