;* Lauflicht mit Timer-Interrupt-Flackereffekt,
;* Verlassen und Wiederherstellen der
;* Interruptroutine
;* CPU Takt 4 MHz
;* LED-Ausgabe auf Port B
;
.nolist
.include "8515def.inc"
.list
.def temp = r16
.def temp1 = r17
.def temp2 = r18
.def temp3 = r19
.def zeit = r20
.def zeit1 = r21
.def zeit2 = r22
.equ leds = portb
.CSEG
.org 0x0000
rjmp Hauptprogramm
.org 0x007 ;.equ OVF0addr=$007;Overflow0 Interrupt Vector Address
rjmp Timerueberlauf
Hauptprogramm:
ldi temp, low(RAMEND) ;Stackpointer initialisieren
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi temp, 0xFF ;Portzuweisung: durch Laden von
out DDRB, temp ;HexFF Datenrichtung PortB Ausgang
ldi temp, 0x05 ;Timer 1 Vorteiler 1:1024
out TCCR0, temp
ldi temp, 0x02 ;Interruptausgabe mit TOIE0 enablen
out TIMSK, temp
ldi temp3, 0x00
sei ;generelle Interruptfreigabe
rjmp Lauflicht
Timerueberlauf:
;clr temp2
;in temp2, SREG ;Sichert Statusregister
;push temp2 ;auf Stack
ldi temp1, 0xFF ;bewirkt Flackern aller LEDs
out leds, temp1
inc temp3
cpi temp3, 0x85 ;nach 133 "Breaks"
breq Timervar ;Verlassen des Timer-Interrupts
;pop temp2 ;Wiederherstellen
;out SREG, temp2 ;des Statusregisters
reti
Timervar: ;Verlassen des Timer-
ldi temp, 0x06 ;Interrupts durch Laden
out TCCR0, temp ;"falscher" Werte in TCCR0
ldi temp, 0x02 ;Interruptausgabe mit TOIE0 enablen
out TIMSK, temp
ret
Lauflicht:
rcall Lichtpunkt
rcall Timerreset
rjmp Lauflicht
;ret
Timerreset: ;Wiederherstellen der
;Timer-Interrupt-Routine
rjmp Hauptprogramm
;ret
Lichtpunkt:
ldi ZL, LOW(leds0*2) ;Adresse des Strings0 in den
ldi ZH, HIGH(leds0*2) ;Z-Pointer laden
rcall print ;Funktion print aufrufen
rjmp Leuchtband ;in den naechsten String springen
;Konstanten von String0 werden hier im Flash abgelegt:
leds0:
.db 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
.db 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE
.db 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
.db 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE
.db 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFB, 0xFB, 0xFB
.db 0xFB, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xEF, 0xEF
.db 0xEF, 0xEF, 0xEF, 0xEF, 0xDF, 0xDF, 0xDF, 0xDF
.db 0xDF, 0xDF, 0xDF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF
.db 0xBF, 0xBF, 0xBF, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F
.db 0x7F, 0x7F, 0x7F, 0x7F, 0xFF, 0
;inclusive Nullterm geradzahlige Anzahl Bytes,
;sonst "padding-byte-mismatch"-Warnmeldung
print:
lpm ;erstes Byte des Strings0 nach R0 lesen
tst R0 ;R0 auf 0 testen
breq print_end ;wenn 0, dann zu print_end
mov temp, r0 ;Inhalt von R0 nach temp kopieren
rcall ausgabe ;Ausgabe ueber PortB
adiw ZL:ZH, 1 ;Adresse des Z-Pointers um 1 erhoehen
rjmp print ;zum Anfang springen, um naechstes
;Byte aus dem dseg-Label leds0 ;zu holen
print_end:
ret
; Ausgabe, sendet das Byte aus temp ueber den PortB
ausgabe:
out leds, temp
rcall Warten
ret
Leuchtband:
ldi ZL, LOW(leds1*2) ;Adresse des Strings1 in den
ldi ZH, HIGH(leds1*2) ;Z-Pointer laden
rcall print1 ;Funktion print1 aufrufen
rjmp Toggle
print1:
lpm ;erstes Byte des Strings1 nach R0 lesen
tst R0 ;R0 auf 0 testen
breq print_end1 ;wenn 0, dann zu print_end1
mov temp, r0 ;Inhalt von R0 nach temp kopieren
rcall ausgabe
adiw ZL:ZH, 1 ;Adresse des Z-Pointers um 1 erhoehen
rjmp print1 ;zum Anfang springen, um naechstes
;Byte aus dem dseg-Label leds1 ;zu holen
print_end1:
ret
leds1: ;Konstanten von String1
.db 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F
.db 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F
.db 0x3F, 0x3F, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
.db 0xFF, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0xF0, 0x0F
.db 0x0F, 0x0F, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F
.db 0x0F, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0
;inclusive Nullterm geradzahlige Anzahl Bytes,
;sonst "padding-byte-mismatch"-Warnmeldung
Toggle:
ldi ZL, LOW(leds2*2) ;Adresse des Strings2 in den
ldi ZH, HIGH(leds2*2) ;Z-Pointer laden
rcall print2 ;Funktion print1 aufrufen
;rjmp Lauflicht
ret
print2:
lpm ;erstes Byte des Strings2 nach R0 lesen
tst R0 ;R0 auf 0 testen
breq print_end2 ;wenn 0, dann zu print_end2
mov temp, r0 ;Inhalt von R0 nach temp kopieren
rcall ausgabe
adiw ZL:ZH, 1 ;Adresse des Z-Pointers um 1 erhoehen
rjmp print2 ;zum Anfang springen, um naechstes
;Byte aus dem dseg-Label leds2 ;zu holen
print_end2:
ret
leds2: ;Konstanten von String2
.db 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55
.db 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0x55
.db 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55
.db 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55
.db 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55
.db 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
.db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA
.db 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55
.db 0x55, 0x55, 0x55, 0x55, 0xEF, 0xFF, 0xEF, 0xFF
.db 0xEF, 0xFF, 0xEF, 0xFF, 0xFF, 0
;inclusive Nullterm geradzahlige Anzahl Bytes,
;sonst "padding-byte-mismatch"-Warnmeldung
Warten: ;Pause
ldi zeit, 0xFF
ldi zeit1, 0xFF
ldi zeit2, 0x85
push zeit
push zeit1
push zeit2
Verzoegerungs_Schleife:
dec zeit
cpi zeit, 1
brlt Verzoegerungs_Schleife
ldi zeit, 0xFF
dec zeit1
cpi zeit1, 1
brlt Verzoegerungs_Schleife
ldi zeit1, 0xFF
dec zeit2
cpi zeit2, 1
brlt Verzoegerungs_Schleife
pop zeit2
pop zeit1
pop zeit
ret