; ;* Lauflicht mit Timer-Interrupt-Flackereffekt, ;* Verlassen und Wiederherstellen der ;* Interruptroutine ;* Verwendung von Datensegment "dseg" ;* CPU Takt 4 MHz ;* LED-Ausgabe auf Port B ; .nolist .include "tn4313def.inc" .list ; .def temp = r16 .def temp1 = r17 .def temp2 = r18 .def temp3 = r19 ; .equ leds = portb ; .dseg .org 0x0060 ; Zeitschleifen-Konstanten ins dseg Zeit_0: .BYTE 1 ; laden Zeit_1: .BYTE 1 Zeit_2: .BYTE 1 Zeit_3: .BYTE 1 ; .cseg .org 0x0000 rjmp Hauptprogramm .org 0x0007 ; .equ OVF0addr=$0007;Overflow0 Interrupt 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 ldi temp, 0xFF sts Zeit_0, temp ; Zeitschleifen-Ladewerte ins dseg sts Zeit_1, temp ; laden ldi temp, 0x85 sts Zeit_2, temp ldi temp, 0x9F sts Zeit_3, temp ldi temp, 0x1F;0x38 ; WDP0,1,2, WDE; WDCE Watchdog ena 0x38 WDE; WDP3,WDCE out WDTCR, temp ; WDRCSR wdr sei ;generelle Interruptfreigabe rjmp Lauflicht ; Timerueberlauf: wdr ldi temp1, 0xFF ;bewirkt Flackern aller LEDs out leds, temp1 inc temp3 cpi temp3, 0x82 ;nach 130 "Breaks" breq Timervar ;Verlassen des Timer-Interrupts reti ; Timervar: ;Verlassen des Timer-Interrupts wdr ldi temp, 0x00 ;durch Prescaler-Laden auf Null out TCCR0, temp ;Timer inaktiv ldi temp, 0x00 ;Interruptausgabe mit TOIE0 disabled out TIMSK, temp ret ; Lauflicht: rcall Lichtpunkt rcall Timerreset rjmp Lauflicht ;ret Timerreset: ;Wiederherstellen der Timer-Interrupt-Routine rjmp Hauptprogramm ;ret Lichtpunkt: wdr 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 ; 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 ; Leuchtband: wdr ldi ZL, LOW(leds1*2) ;Adresse des Strings1 in den ldi ZH, HIGH(leds1*2) ;Z-Pointer laden rcall print1 ;Funktion print1 aufrufen rjmp Abwechseln ; print1: lpm ;erstes Byte des Strings1 nach R0 lesen tst R0 ;R0 auf 0 testen breq print_end ;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 ; Abwechseln: wdr ldi ZL, LOW(leds2*2) ;Adresse des Strings2 in den ldi ZH, HIGH(leds2*2) ;Z-Pointer laden rcall print2 ;Funktion print1 aufrufen rcall Funkeln ret ; print2: lpm ;erstes Byte des Strings2 nach R0 lesen tst R0 ;R0 auf 0 testen breq print_end ;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 ; Funkeln: wdr ldi ZL, LOW(leds3*2) ;Adresse des Strings3 in den ldi ZH, HIGH(leds3*2) ;Z-Pointer laden rcall print3 ;Funktion print3 aufrufen rcall Warten rcall ausgabe2 ret ; print3: lpm ;erstes Byte des Strings3 nach R0 lesen tst R0 ;R0 auf 0 testen breq print_end3 ;wenn 0, dann zu print_end3 mov temp, r0 ;Inhalt von R0 nach temp kopieren rcall ausgabe rcall ausgabe1 adiw ZL:ZH, 1 ;Adresse des Z-Pointers um 1 erhoehen rjmp print3 ;zum Anfang springen, um naechstes ; ;Byte aus dem dseg-Label leds2 zu holen print_end3: ret ; ; Ausgabe, sendet das Byte aus temp ueber den PortB ausgabe: wdr out leds, temp rcall Warten ret ; ausgabe1: wdr push temp out leds, temp rcall Warten1 ldi temp1, 0x03 add temp, temp1 out leds, temp rcall Warten1 pop temp ret ; ausgabe2: ;LED-Gruppen links schieben lassen wdr push temp3 ;viermal ldi temp3, 0x05 rjmp ausgabe2_ ; ausgabe2_: wdr ldi temp, 0x03 ldi temp1, 0x08 rjmp ausgabe3 ; ausgabe3: wdr rol temp mov temp2,temp com temp2 out leds, temp2 rcall Warten dec temp1 cpi temp1, 1 brne ausgabe3 dec temp3 cpi temp3, 1 brne ausgabe2_ pop temp3 ret ; ;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 ; 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 ; 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, 0xE7, 0xC5, 0x81 .db 0x01, 0 ; leds3: ;Konstanten von String3 .db 0x01, 0x03, 0x05, 0x07, 0x0F, 0x1F, 0x3F, 0x5F .db 0x7F, 0xFF, 0x01, 0x03, 0x05, 0x07, 0x0F, 0x1F .db 0x3F, 0x5F, 0x7F, 0xFF, 0x01, 0x03, 0x05, 0x07 .db 0x0F, 0x1E, 0x3E, 0x5E, 0x7E, 0xFE, 0x02, 0x04 .db 0x06, 0x08, 0x0F, 0x2F, 0x4F, 0x7F, 0x0F, 0x9F .db 0x11, 0x23, 0x15, 0x27, 0x4F, 0x19, 0x31, 0x57 .db 0x7F, 0xFF, 0x71, 0x63, 0x75, 0x17, 0x01, 0x10 .db 0x35, 0x55, 0x74, 0xF1, 0x11, 0x53, 0x15, 0x67 .db 0x0F, 0x1F, 0x3F, 0x44, 0x69, 0x66, 0x01, 0x13 .db 0x95, 0x87, 0x0F, 0x3F, 0x38, 0x58, 0x76, 0xFF .db 0x91, 0x13, 0x05, 0x07, 0x0F, 0x1F, 0x3F, 0x5F .db 0xFF, 0 ; Warten: ; groessere Pause wdr push temp push temp1 push temp2 lds temp, Zeit_0 lds temp1, Zeit_1 lds temp2, Zeit_2 ; Schleife: dec temp cpi temp, 1 brlt Schleife ldi temp, 0xFF dec temp1 cpi temp1, 1 brlt Schleife ldi temp1, 0xFF dec temp2 cpi temp2, 1 brlt Schleife pop temp2 pop temp1 pop temp ret ; Warten1: ; kuerzere Pause wdr push temp push temp1 lds temp, Zeit_0 lds temp1, Zeit_3 Schleife1: dec temp cpi temp, 1 brlt Schleife1 ldi temp, 0xFF dec temp1 cpi temp1, 1 brlt Schleife1 pop temp1 pop temp ret