; 2 x 2 x 2 LED-Cube mit Minimalbeschaltung ( 1 C, 2 R, 1 uC ATtiny13 und 8 LED ) ; alle FUSES auf Standart, lediglich RSTDISBL (Achtung!) muss gesetzt werden ; leider habe ich mit dem Setzen des RSTDISBL-Flags (Reset-Disable, um PB5 als I/O-Pin nutzen zu koennen) ; die Programmierbarkeit meines ATtiny13 fruehzeitig (schon beim ersten Test) deaktiviert, daher hier nur so ein einfaches Programm .device ATtiny13 .include "tn13def.inc" .def tmp = r16 ;temporaere Daten .def wc = r17 ;wait counter parameter .def w1 = r18 ;wait counter 2 .def w2 = r19 ;wait counter 3 .org 0x0000 ;Einsprungspunkt nach Reset rjmp reset ;koennte man auch weg lassen, solange keine Interrupt-Vektoren oder aehnliches in Benutzung sind ;ich lasse es dem guten Stil wegen trotzdem drin reset: ;schreiben in I/O-Register nur ueber Register moeglich ldi tmp, ramend ;laden von tmp mit oberster Adresse vom Ram (ramend aus tn13def.inc) out spl, tmp ;(Kopieren von Register in I/O-Register) Stackpointer initialisieren clr tmp ;Register loeschen out portb, tmp ;alle Ausgaenge auf 0 setzen ;zuerst die Ausgaenge einstellen, um einen definierten Startzustand zu bekommen ;das ist bei der aktuellen Anwendung unwichtig, gehoert aber zum guten Stil ldi tmp, 0x3F ;alle Pins als Ausgang einstellen out ddrb, tmp ;Data Direction Register, 1 = out, 0 = in mainloop: ; pb4 und pb5 zwischen 0 und 1 wechseln, um den entsprechenden "Layer" zu aktivieren (Multiplexing) sbic PORTB, 4 ;(branch if bit in I/O-Reg cleared) Unterscheidung ob PORTB auf 1 oder 0 gesetzt werden muss rjmp layer0 ;(relative jump) wenn 1, dann auf 0 setzen rjmp layer1 ;wenn 0, dann auf 1 setzen layer0: cbi PORTB, 4 ;Bit in I/O-Register loeschen sbi PORTB, 5 ;Bit in I/O-Register setzen rjmp layer_set layer1: sbi PORTB, 4 cbi PORTB, 5 layer_set: ; alle 4 LEDs durch schalten sbi PORTB, 0 ldi wc, 1 ;Parameter fuer Funktion setzen rcall wait ;Funktion aufrufen cbi PORTB, 0 sbi PORTB, 1 ldi wc, 1 rcall wait cbi PORTB, 1 sbi PORTB, 2 ldi wc, 1 rcall wait cbi PORTB, 2 sbi PORTB, 3 ldi wc, 1 rcall wait cbi PORTB, 3 rjmp mainloop ; Funktion wait ; so oft warten, wie in wc steht (Achtung! 0 = 256 mal!) ; 1 mal entspricht bei 9,6MHz etwa 1/6 Sekunde wait: clr w2 wait2: clr w1 wait1: inc w1 brne wait1 ;(branch not equal - Testet Zero-Flag, also Ueberlauf nach inc) inc w2 brne wait2 dec wc brne wait ret