Dokumentation. LED Cube 8x8x8. ein Praktikumsprojekt von Claudia Denk Severin Völkl. unter der Leitung von Gerald Schickhuber Prof. Georg Scharfenberg

Ähnliche Dokumente
IR NEC Empfänger mit 4x7 LED Anzeige (ATtiny2313)

myavr Programmierung in C

Vorbereitung. Teil D Analog-Digital-Wandler 1

LED CUBE 4x4x4. von Josua Benz und Patrick Koss. im Fach Computer Technik. betreut von Herr Mezger

D.1 Vorbereitung. Teil D Analog-Digital-Wandler 1

Studiengang Maschinenbau, Schwerpunkt Mechatronik (früher: Automatisierungstechnik) Seite 1 von 8

Mikrocontrollerplatine vorbereiten

Ein- / Ausgabe- Ports

Microcontroller Selbststudium Semesterwoche 9

Temperaturmodul. Software. Bedeutung der Leuchtdioden. Kanal-LEDs. System-LEDs. Start nach Reset

U5-2 Register beim AVR-µC

Lichtwürfel. Ein Projekt in der Vertiefung Prozessdatenverarbeitung. Michael Frey mail at mfrey dot net. July 3, 2008

WS 2017/18 Viel Erfolg!!

Projektlabor. LCD Ansteuerung

Einführung in die Programmierung von Mikrocontrollern mit C/C++

8: IIC-Bussystem / PID

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

WS 2016/17 Viel Erfolg!!

U5 Fortgeschrittene AVR-Programmierung

LED-UHR. Bedienungsanleitung

Nachtaktiver Blinker. Ralf Pongratz. 11. November 2012

Für den CTC-Mode kann demnach TCCR1A komplett auf 0 gesetzt werden, weil WGM11 und WGM10 in diesem Register liegen und beide laut Tabelle 0 sind:

PIC16 Programmierung in HITECH-C

C.1 Serielle Schnittstelle, erstes Testprogramm (a)

Arduino Kurs Bits und Bytes. Stephan Laage-Witt FES Lörrach

Die Temperaturmessung

Blinkende Eule. Schaltungsbeschreibung

4.0 Der Atmel AT89LPx052 Mikrocontroller

Projektarbeit in DVT auf dem Entwicklerboard

Evolution der LED-Ansteuerung. Gerrit Buhe, DL9GFA AATiS-Lehrerfortbildung, HAM-Radio 2014

OCT608 Dynapic und Dynasim- 8-fach-Interface-Print mit parallelem und seriellem Ausgang

Stopp-Uhr. Erstellen Sie ein Programm (in Zweier- bzw. Dreier-Gruppen), welches folgende Bedingungen erfüllt:

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

Laborübung 3. Latches, Flipflops, Counter

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Globale Variablen

Studienschwerpunkt Mechatronik/Vertiefungsrichtung Fahrzeugmechatronik Seite 1 von 8. Sommersemester 2018 Angewandte Elektronik

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

U3-1 Register beim AVR-μC. U3 3. Übung. U3-2 I/O-Ports des AVR-μC. 1 Überblick. 2 Makros für Register-Zugriffe. 1 Überblick

Wiederholung: Zugriff auf AVR-Prozessor-Register

Aufgabe 1: Transistor, Diode (ca. 15 Punkte)

ARDF Maus. Schaltungsbeschreibung

C-DIAS-Serielles-Interface CSI 021

Zeiger vom Typ (void *) sind am besten für Zeigerarithmetik geeignet, da sie kompatibel zu jedem Zeigertyp sind.

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Implementierung von Interruptbehandlungen. Interrupts

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

4 Formelsammlung C/C++

Kurzbeschreibung für den Kombi-BWS mit 80x24 und 64x32 Darstellung

U2 Fortgeschrittene AVR-Programmierung. U2-1 Externe Interrupts des AVR-μC. 1 Flanken-/Pegel-Steuerung. 1 Flanken-/Pegel-Steuerung (2) 2 Maskieren

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Universal-Experimenter IV

Serielle Schnittstelle, erstes Testprogramm (a)

Speicheraufbau des AT89C5131

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Arduino Kurs Timer und Interrupts. Stephan Laage-Witt FES Lörrach

Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt:

STM32 - Schieberegister, SPI - u

Digitalelektronik 1 Digitale Ausgabe. Stefan Rothe

Übungen zu Systemnahe Programmierung in C (SPiC)

PLOG1. 1. Anmerkungen zur Funktion. Praktikumsplatine "programmierbare Logik" Spannungsversorgung:

[CF-2560-DATENBLATT] dpc-haustechnik. Ulrich Piechnick April Technisches Handbuch

MODUL 6 TIMER UND COUNTER

SMP Übung 8 - Lösungsvorschlag

Einführung Arduino - Aufbau

Übungen zu Systemnahe Programmierung in C (SPiC)

TM1638-Anzeige-Taster-Modul

U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung. Synchronisation mit Unterbrechungsbehandlungen

Embedded Systems

M1000 Parallel Ein-/Ausgabe

Parallel Ein-/Ausgabe Box

Eingaben. Themen heute. Taster. Eingaben Zuweisungen Zeitmessung. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Einführung in die Arduino-Programmierung II

LED Skalenbeleuchtung mit einem Arduino

V cc. 1 k. 7 mal 150 Ohm

Übungen zu Systemnahe Programmierung in C (SPiC)

Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen.

AVR Ein/Ausgabe. Inhaltsverzeichnis

M1400 Parallel Ein-/Ausgabe

Modellbau-Ampel für 10 LEDs (2x Auto- und 2x Fußgängerverkehr)

Beschreibung Modell Motorspindel

RalfPongratz. Grundversion. Reaktivlichtmit7SegmentAnzeige

Bachelorprüfung FAB + MBB (Schwerpunkt Mechatronik) / Diplomprüfung MBD Seite 1 von 8. Wintersemester 2015/16 Elektronik

Datentechnik. Prinzipieller Aufbau eines Schnittstellenbausteins

Entfernungsmesser. für den Raspberry Pi. Tim Riddermann / Nils Wortmann

Microcontroller Praktikum SS2010 Dipl. Ing. R. Reisch

USBCAN.DLL. Manual. Microcomputersysteme. Version 1.2

Id PIO1003: Anschaltbeispiele einer Ausgangsleitung aus der PIO II

M1410 Parallel Ein-/Ausgabe

80C535-Mikrocontroller-Board im Streichholzschachtelformat

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Schnittstellenbeschreibung. Inhalt

.Universelles Demonstrationssystem für Grundlagen der Digitaltechnik /

8.1 Grundsätzlicher Aufbau der Beispiele

Dokumentation und Auswertung. Labor. Kaiblinger, Poppenberger, Sulzer, Zöhrer. 2.1 Prüfen von Transistoren 2.2 Schaltbetrieb 2.3 Kleinsignalverstärker

Bootloader FastBoot von Peter Dannegger

f) Was versteht man beim Zugriff auf I/O-Register unter dem Begriff "Memory-mapped"?

8.3 PCA2.D12 Display-Modul mit 4 Ziffern

Timer. Funktionsprinzip


Transkript:

Dokumentation LED Cube 8x8x8 ein Praktikumsprojekt von Claudia Denk Severin Völkl unter der Leitung von Gerald Schickhuber Prof. Georg Scharfenberg durchgeführt vom 18.08.08 bis 26.09.08 im BiSP-Labor der HS Regensburg Seybothstraße 2 93053 Regensburg

2 LED Cube

Inhaltsverzeichnis 1. Aufbau des Würfels...4 2. Funktionsbeschreibung...5 3. Softwarebeschreibung...6 4. Technische Daten...8 5. Die Würfel-Bibliothek...9 6. Beispielprogramm...10 7. Gefahrenhinweise/Pflegeanweisung...11 LED Cube 3

1. Aufbau des Würfels Liste der dazu benötigten Teile: 512 Leuchtdioden 64 dicke Drähte (Säulen; 1-2mm) 88 dünne Drähte (Querstreben; 0,5-1mm) 2 Holzbretter viel Lötzinn - 1. Schritt Löten Sie zunächst je 8 Leuchtdioden im Abstand von 4cm mit der Kathode an insgesamt 64 starre Drähte (Säulen). Biegen Sie dazu die Beinchen der Dioden derart, dass Sie später am Tag die Anodendrähte (Querstreben) senkrecht dazu anlöten können. 2. Schritt: Verbinden Sie nun jeweils 8 Leuchtstangen mit 8 Anodendrähten, so dass ein quadratisches Gitter entsteht. 3. Schritt: Stecken Sie die Gitter in ein vorgebohrtes Holzbrett mit den Lochabständen von jeweils 4cm. Die Bohrlochgröße entspricht etwa der Drahtdicke. Verbinden Sie sie anschließend an den Anoden ebenenweise zu einem Würfel. Führen Sie die Anoden jeder Ebene mittels weiterer Drähte durch das Holzbrett hindurch an dessen Unterseite. 4 LED Cube

2. Funktionsbeschreibung Der Würfel besteht aus 512 Leuchtdioden, die in acht Ebenen zu 64 Dioden angeordnet sind. Die Ebenen werden mit Hilfe eines Multiplexers 1 der Reihe nach eingeschaltet. Das Einschalten erfolgt im 1/8-Puls-Betrieb. Für das Durchschalten der Ebenen wurde 1ms pro Ebene gewählt. Somit ergibt sich eine Zeilenfrequenz von 1000 Hz und ein Bildaufbau mit der Frequenz von 125 Hz. Die Ansteuerung der einzelnen Dioden in einer Ebene übernehmen acht low-aktive Schieberegister 2 deren parallele Ausgänge mit den Kathodenstangen (Säulen) verbunden sind. Über einen Stelleingang begrenzen sie auch den Diodenstrom auf etwa 100mA. Die Register werden seriell mit Daten geladen. Die seriellen Eingänge (einer je Register) liegen am Controller an den Ports 1.0 bis 1.7. Nachdem dort ein Datenbyte ins entsprechende Register geladen wurde, können dessen Bits durch Auslösen einer Taktflanke am Port 3.4 des Controllers in die Register geschoben werden. Sind alle Register aufgeladen, können über eine Flanke an den Latch-Enable-Eingängen der Register, die parallel mit Port 3.5 des Controllers verschaltet sind, die Daten auf die parallelen Ausgänge gelegt werden. Ein 1-aus-16-Decoder (Multiplexer) übernimmt dabei die Adressierung der Ebenen über die Anodenstangen. Seine Ausgänge sind mit den Gates der p-kanal-fets verbunden, die im Bedarfsfall eine Spannung von 5V an die Anodenstangen anlegen. Die Ausgänge des IC sind standardmäßig auf High-Pegel gesetzt. Deswegen sind Pullup-Widerstände zum Deaktivieren der FETs nicht notwendig. Der Decoder ist über vier Adressleitungen mit den Ports 3.0 bis 3.3 des Controllers verbunden, die bei dessen Ausfall über Pull-up-Widerstände auf VCC gezogen werden. In diesem Fall würde Ausgang 15 aktiviert werden, und somit könnte man dort einen Low-Pegel messen. 1 Wir verwenden in der Schaltung einen 74HCT154 mit low-aktiven Ausgängen. 2 Es handelt sich um acht TLC5916 8-Bit Constant-Current LED Sink Drivers. LED Cube 5

3. Softwarebeschreibung Das beiliegende Beispielprogramm, welches die Würfel-Bibliothek nutzt, ist wie folgt aufgebaut: Hauptprogramm Interrupt-Routine Start Einstieg Interrupt Watchdog framerendered Ports false framerendered =false true Timer Kopieren des Backbuffers in den Frontbuffer false framerequest true Deaktivierung der aktuellen Ebene framerequest =false Rendering des Frames im Backbuffer Bereitstellen der nächsten Ebene Aktivierung der nächsten Ebene framerendered =true Ausstieg 6 LED Cube

Zu Beginn wird der Watchdog deaktiviert, um einem automatischen Reset des Systems vorzubeugen. Die Ports und der Timer für den Interruptaufruf werden initialisiert. Im Anschluss daran tritt das Programm in eine Endlosschleife ein, in der falls erforderlich der als nächstes anzuzeigende Frame errechnet wird. Während des Programmablaufs wird jede Millisekunde eine Interruptroutine aufgerufen, in der die Ansteuerung der nächsten Ebene erfolgt. Dazu wird die Technik des Double-Bufferings 3 eingesetzt. Solange das Rendering des neuen Frames nicht vollständig abgeschlossen ist, wird noch die alte Bildinformation, die sich in einem separaten Puffer (back buffer) befindet, zur Ausgabe verwendet. Erst danach wird ein Flag framerendered gesetzt, aufgrund dessen der Puffer mit dem neuen Frame in den Ausgabepuffer (front buffer) kopiert wird. Diese Vorgehensweise verhindert ein Flackern des Bildes unter Aufrechterhaltung der Zeilenfrequenz. Wahlweise kann hierbei zusätzlich ein VSync abgewartet werden. Da der Interrupt jede Millisekunde eintritt, wird hier auch ein Zähler hochgezählt, mithilfe dessen eine regelmäßige Bilderzeugung realisiert wird. In unserem Beispiel wird nur alle 33 Zählerschritte mittels Setzens eines Flags framerequest ein neues Bild angefragt, was einer tatsächlichen Bildrate von augenfreundlichen 4 33fps entspricht. Dieses Vorgehen soll den Controller bei brachialer Programmierung des Hauptprogramms entlasten. 3 siehe auch http://de.wikipedia.org/wiki/double_buffering 4 siehe auch http://de.wikipedia.org/wiki/bewegte_bilder LED Cube 7

4. Technische Daten Farbe der LEDs Gelb Maße (H, B, T) 470mm, 360mm, 360mm Temperaturbereich 0 C-70 C Betriebsspannung 18V 36V Betriebsspannung µc 3,6V Betriebsspannung Logik 5V Leerlaufbetrieb (alle Dioden aus) Stromaufnahme bei 18V 170mA Stromaufnahme bei 30V 125mA Volllastbetrieb (alle Dioden ein) Stromaufnahme bei 18V 890mA Stromaufnahme bei 30V 535mA Taktfrequenz µc 16MHz Bildwiederholrate 125Hz 8 LED Cube

5. Würfel-Bibliothek (ledlib.h) typedef UINT8 cube[8][8] typedef char pattern2d[8][8] void clearcube(cube acube) Löscht alle Bits des übergebenen Würfels. void fillcube(cube acube) Setzt alle Bits des übergebenen Würfels. void setpixel(cube acube, UINT8 x, UINT8 y, UINT8 z) Setzt im übergebenen Würfel das Bit an der angegebenen Position. void delpixel(cube acube, UINT8 x, UINT8 y, UINT8 z) Löscht im übergebenen Würfel das Bit an der angegebenen Position. void copycube(cube sourcecube, cube draincube) Kopiert den Inhalt von sourcecube nach draincube. UINT8 cubesareequal(cube cube1, cube cube2) Gibt 0x01 zurück, wenn sich die übergebenen Würfel gleichen, sonst 0x00. UINT16 activeleds(cube acube) Gibt die Anzahl der leuchtenden LEDs zurück. void drawpattern(cube acube, pattern2d pattern, UINT8 slice) Überträgt ein 2D-Muster auf eine Scheibe des Würfels. void randomizecube(cube acube, UINT8 percentage) Setzt im übergebenen Würfel zufällig. void commit3devolution(cube oldcube, cube newcube) Begeht 3D-Evolution. LED Cube 9

6. Beispielprogramm #include "ledlib.h" typedef char cube[8][8]; //Bibliothek einbinden //Würfelobjekte sind 8x8x8 Bits groß cube maincube, intcube; //Hauptprogramm- und Interruptwürfel deklarieren unsigned char framerequest, framerendered; //Frameflags deklarieren unsigned long counter=0; //Counter initialisieren void main(void) { init_watchdog(); init_dco(); init_ports(); init_timer(); clearcube(maincube); //Watchdogs ausschalten //16MHz //Ports konfigurieren //Timer konfigurieren //Würfelpuffer löschen enable_interrupt(); //Globale Interrupts einschalten framerequest=1; //Mit Frameanfrage beginnen... framerendered=0; //...ohne einen Frame im Puffer for(;;) //Hauptschleife { if (framerequest) { //Framerequest gesetzt? framerequest=0; //Flag löschen clearcube(maincube); //Würfel löschen maincube[(counter/2)%8][(counter/3)%8]=0xff; framerendered=1; //Flag setzen //etwas zeichnen #pragma vector=timer0_a0_vector interrupt void Timer_A (void) { static unsigned char layer=0, slice=0, ints=0; if (layer==8) layer=0; //Jedes Mal den Layer wechseln if (framerendered && layer==0) { framerendered=0; copycube(maincube,intcube); if(ints==33) { counter; framerequest=1; ints=0; //Intern bis 33 zählen... //...dann Counter erhöhen //und Request-Flag setzen P3OUT &=~ 0x0F; //Ebenen ausschalten for (slice=0; slice<8; slice) { //Gitter durchzählen... P1OUT = intcube[layer][slice]; //...und jeweils 1 Bit an... P3OUT = BIT4; //...alle Register senden... P3OUT &=~BIT4; //...und Clock-Flanke erzeugen P3OUT = BIT5; //Latch-Flanke schicken P3OUT &=~BIT5; P3OUT = layer & 0x0F; //Nächste Ebene einschalten 10 LED Cube

7. Gefahrenhinweise/Pflegeanweisung Vor hochenergetischen elektromagnetischen Pulsen (EMP) schützen! Von Kindern fernhalten! Gefahr des Verschluckens. Nicht sandstrahlen! Nicht spülmaschinenfest! Vor starker mechanischer Beanspruchung schützen! Nicht unbeaufsichtigt brennen lassen! Gefahr der Stromverschwendung. Vor der Reinigung Netzstecker ziehen! Reinigung mit antistatischem Staubtuch. LED Cube 11