Source file: /~heha/Mikrocontroller/LEDs/Lauflicht.zip/main.S

#define TS 200		// Schiebetakt-Zeit in ms, max. 510
#define T1 6		// Ein-Zeit in TS, mithin die Länge der leuchtenden LED-Kette, max. 255
#define T0 6		// Aus-Zeit in TS, mithin die Lücke zwischen leuchtenden LED-Ketten, max. 255-T1
/* Hardware
	PB5	(1)	LED5 (Kettenende) - high-aktiv
	PB3	(2)	LED3
	PB4	(3)	LED4
	0V	(4)	Masse
	PB0	(5)	LED0 (Kettenanfang)
	PB1	(6)	LED1
	PB2	(7)	LED2
	5P	(8)	Versorgung
*/

#define __SFR_OFFSET 0
#include <avr/io.h>

.section .fuse
	.byte	0xEB	// LFUSE = interner Oszillator 128 kHz (u.a.)
	.byte	0xFE	// HFUSE

.section .signature
	.byte	0x1E,0x90,0x07	// Damit der Programmiersoftware den richtigen Chip prüfen kann

.section .text
// 0. Stackpointer initialisieren (der wird wirklich gebraucht! Das macht sonst die C-Laufzeitbibliothek)
	ldi	r24,RAMEND
	out	SPL,r24
// 1. Taktteiler konfigurieren
	ldi	r24,0x80
	ldi	r25,0x0F
	out	ACSR,r24
	rjmp	1f
	reti			// Der hier ist wichtig: Das sleep in der Hauptschleife wird erlöst
1:	out	CLKPR,r24
	out	CLKPR,r25	// durch 256 teilen, um auf 500 Hz zu kommen (minimaler Stromverbrauch)
// 2. Sleep-Modus setzen und Interrupts freigeben
	ldi	r24,0x20
	out	MCUCR,r24
	sei
// 3. Timer0 auf Zeitgeber programmieren
	ldi	r24,0x02
	out	TCCR0A,r24	// CTC-Modus
	ldi	r24,TS>>1-1
	out	OCR0A,r24
	ldi	r24,0x01
	out	TCCR0B,r24	// Vorteiler 1
	ldi	r24,0x04
	out	TIMSK0,r24	// Interrupt bei Vergleich
// 4. Ports konfigurieren (auf Ausgang)
	ldi	r24,0xFF
	out	DDRB,r24
// 5. Los geht's
2:	ldi	r25,T1+T0	// Gesamtbitzähler setzen
3:	sleep
	cpi	r25,T1		// wenn r25<T1, leuchtende LEDs einschieben, sonst ausgehen lassen
	rol	r24
	out	PORTB,r24
	dec	r25		// nächste Runde
	brne	3b
	rjmp	2b
Detected encoding: UTF-80