#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-8 | 0
|