;*******************************************************************************
;*
;*	Titel:	Bibliothek mit Zeitunterprogrammen
;*              (SR_TIME_16M.asm)
;*	Datum:	10/04/10        	Version: 0.5 (27/12/12)
;*	Autor:	WEIGU
;*
;*	Informationen zur Beschaltung:
;*	Prozessor:	ATMEGA32        	Quarzfrequenz:	 extern 16MHz
;*			
;*	Informationen zur Funktionsweise:
;*
;*	  Die Bibliothek enthaelt Zeitschleifenunterprogramme zur Verwendung mit
;*	  einem externen 16MHz Quarz.
;*	
;*      Unterprogramme:
;*
;*      Folgende Zeitschleifen sind sehr genau: 
;*      
;*      W1US:   16-Bit-Zeitschleife wartet 1us  (Wait 1us)
;*      W5US:   16-Bit-Zeitschleife wartet 5us
;*      W10US:  16-Bit-Zeitschleife wartet 10us
;*      W50US:  16-Bit-Zeitschleife wartet 50us
;*      W100US: 16-Bit-Zeitschleife wartet 100us
;*      W500US: 16-Bit-Zeitschleife wartet 500us
;*      W1MS:   16-Bit-Zeitschleife wartet 1ms
;*      W5MS:   16-Bit-Zeitschleife wartet 5ms
;*      W10MS:  16-Bit-Zeitschleife wartet 10ms
;*      
;*      Bei den folgenden Zeitschleifen kann der Fehler durch push, pop, ret
;*	und die Schleifenbefehle vernachlaessigt werden:
;*
;*      W50MS:	16-Bit-Zeitschleife wartet 50ms  (Wait 50ms)
;*      W100MS:	16-Bit-Zeitschleife wartet 100ms
;*      W500MS:	16-Bit-Zeitschleife wartet 500ms
;*      W1S:	16-Bit-Zeitschleife wartet 1s
;*      W5S:	16-Bit-Zeitschleife wartet 5s
;*      W10S:	16-Bit-Zeitschleife wartet 10s
;*      W1MIN:	16-Bit-Zeitschleife wartet 1 Minute
;*      W5MIN:	16-Bit-Zeitschleife wartet 5 Minuten
;*      W10MIN:	16-Bit-Zeitschleife wartet 10 Minuten
;*      
;*      Die folgenden Zeitschleife warten W mal die Zeit ab
;*      Der Anfangswert von W (r25:r24) muss im Hauptprogramm gesetzt
;*      werden!
;*      
;*      Bsp.:	ldi WL,LOW(300)		;Warte 300ms
;*      		ldi WH,LOW(300)
;*      		rcall	WW1MS
;*      		
;*      WW1US:	16-Bit-Zeitschleife wartet W*1us  (Wait W*1us)
;*      WW10US:	16-Bit-Zeitschleife wartet W*10us
;*      WW100US:	16-Bit-Zeitschleife wartet W*100us
;*      WW1MS:	16-Bit-Zeitschleife wartet W*1ms
;*      WW10MS:	16-Bit-Zeitschleife wartet W*10ms
;*      WW100MS:	16-Bit-Zeitschleife wartet W*100ms
;*      WW1S:	16-Bit-Zeitschleife wartet W*1s
;*      WW1MIN:	16-Bit-Zeitschleife wartet W*1 Minute
;*      
;*      Bemerkung:	Die Zeitschleife WW1MS kann auch mit W = 0 verwendet
;*      			werden (siehe Kapitel Zeitschleifen auf weigu.lu/a)		
;*      
;*      Copyright (c) 2013   Guy WEILER         weigu[at]weigu[dot]lu
;*
;*      Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software
;*      und der zugehoerigen Dokumentationen (die "Software") erhaelt, die
;*      Erlaubnis erteilt, uneingeschraenkt zu benutzen, inklusive und ohne
;*      Ausnahme, dem Recht, sie zu verwenden, kopieren, aendern, fusionieren,
;*      verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und
;*      Personen, die diese Software erhalten, diese Rechte zu geben, unter den
;*      folgenden Bedingungen:
;*
;*      ;Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in alle
;*      ;Kopien oder Teilkopien der Software beizulegen.
;*      ;
;*      ;DIE SOFTWARE WIRD OHNE JEDE AUSDRUECKLICHE ODER IMPLIZIERTE GARANTIE
;*      ;BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FUER DEN
;*      ;VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER RECHTS-
;*      ;VERLETZUNG, JEDOCH NICHT DARAUF BESCHRAENKT. IN KEINEM FALL SIND DIE
;*      ;AUTOREN ODER COPYRIGHTINHABER FUER JEGLICHEN SCHADEN ODER SONSTIGE
;*      ;ANSPRUECHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFUELLUNG EINES
;*      ;VERTRAGES, EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE
;*      ;ODER SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN.
;*
;*******************************************************************************

;Damit der Code im Flash gering bleibt werden ausschliesslich die benutzten
;Unterprogramme freigeschaltet (Flag = 1)
.EQU    Flag_W1US       = 1     ;1us
.EQU    Flag_W5US       = 1     ;5us
.EQU    Flag_W10US      = 1     ;10us
.EQU    Flag_W50US      = 1     ;50us
.EQU    Flag_W100US	= 1     ;100us
.EQU    Flag_W500US	= 1     ;500us
.EQU    Flag_W1MS	= 1     ;1ms
.EQU    Flag_W5MS	= 1     ;5ms
.EQU    Flag_W10MS	= 1     ;10ms
.EQU    Flag_W50MS	= 1     ;50ms
.EQU    Flag_W100MS	= 1     ;100ms
.EQU    Flag_W500MS	= 1     ;500ms
.EQU    Flag_W1S		= 1     ;1s
.EQU    Flag_W5S		= 1     ;5s
.EQU    Flag_W10S	= 1     ;10s
.EQU    Flag_W1MIN	= 1     ;1 Minute
.EQU    Flag_W5MIN	= 1     ;5 Minuten
.EQU    Flag_W10MIN	= 1     ;10 Minuten

.EQU    Flag_WW1US	= 1	;W*1us
.EQU    Flag_WW10US	= 1     ;W*10us
.EQU    Flag_WW100US	= 1     ;W*100us
.EQU    Flag_WW1MS	= 1     ;W*1ms
.EQU    Flag_WW10MS	= 1     ;W*10ms
.EQU    Flag_WW100MS	= 1     ;W*100ms
.EQU    Flag_WW1S	= 1     ;W*1s
.EQU    Flag_WW1MIN	= 1     ;W*1 Minute

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 1us (Wait 1us)
;       Hierzu werden bei 16MHz 1/0,0625=16 Taktezyklen benötigt.
;	Dies erreichen 9 nop-Befehle und ein ret-Befehl da der rcall Befehle
;       auch 3 Taktzyklen benötigt.
;-------------------------------------------------------------------------------
.IF Flag_W1US == 1
W1US:	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 5us (Wait 5us)
;-------------------------------------------------------------------------------
.IF Flag_W5US == 1
W5US:	push	r24     ;rette verwendete Registerinhalte
	push    r25
	ldi     r24,0x10 ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x00 ;G = (t-tT)/4tT = 5us/4*62,5ns-1/4 = 20-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 20-4 = 16 = 0x0010
W5USL:	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W5USL	;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop     r24
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 10us (Wait 10us)
;-------------------------------------------------------------------------------
.IF Flag_W10US == 1
W10US:  push    r24     ;rette verwendete Registerinhalte
        push    r25
        ldi     r24,0x24 ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x00 ;G = (t-tT)/4tT = 10us/4*62,5ns-1/4 = 40-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 40-4 = 36 = 0x0024
W10USL: sbiw    r24,1   ;Dekrementiere den Schleifenzaehler W
        brne    W10USL  ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25     ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 50us (Wait 50us)
;-------------------------------------------------------------------------------
.IF Flag_W50US == 1
W50US:  push    r24      ;rette verwendete Registerinhalte
        push    r25
        ldi     r24,0xC4 ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x00 ;G = (t-tT)/4tT = 50us/4*62,5ns-1/4 = 200-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 200-4 = 196 = 0x00C4
W50USL: sbiw   r24,1     ;Dekrementiere den Schleifenzaehler W
        brne    W100USL ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25      ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 100us (Wait 100us)
;-------------------------------------------------------------------------------
.IF Flag_W100US == 1
W100US:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi     r24,0x8C ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x01 ;G = (t-tT)/4tT = 100us/4*62,5ns-1/4 = 400-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 400-4 = 396 = 0x018C
W100USL: sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W100USL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 500us (Wait 500us)
;-------------------------------------------------------------------------------
.IF Flag_W500US == 1
W500US: push    r24      ;rette verwendete Registerinhalte
        push    r25
        ldi     r24,0xCC ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x07 ;G = (t-tT)/4tT = 500us/4*62,5ns-1/4 = 2000-1/4
			;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 2000-4 = 1996 = 0x07CC
W500USL: sbiw   r24,1    ;Dekrementiere den Schleifenzaehler W
        brne    W500USL ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25      ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 1ms (Wait 1ms)
;-------------------------------------------------------------------------------
.IF Flag_W1MS == 1
W1MS:	push	r24	;rette verwendete Registerinhalte
	push	r25
        ldi     r24,0x9C ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x0F ;G = (t-tT)/4tT = 1ms/4*62,5ns-1/4 = 4000-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 4000-4 = 3996 = 0x0F9C
                        ;(Korrektur koennte man vernachlaessigen,Fehler 0,1%)
W1MSL:	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W1MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 5ms (Wait 5ms)
;-------------------------------------------------------------------------------
.IF Flag_W5MS == 1
W5MS:   push    r24      ;rette verwendete Registerinhalte
        push    r25
        ldi     r24,0x1C ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x4E ;G = (t-tT)/4tT = 5ms/4*62,5ns-1/4 = 20000-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 20000-4 = 19996 = 0x4E1C
                        ;(Korrektur koennte man vernachlaessigen)
W5MSL:  sbiw    r24,1    ;Dekrementiere den Schleifenzaehler W
        brne    W5MSL   ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25      ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 10ms (Wait 10ms)
;-------------------------------------------------------------------------------
.IF Flag_W10MS == 1
W10MS:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi     r24,0x3C ;Initialisiere den Schleifenzaehler W
        ldi     r25,0x9C ;G = (t-tT)/4tT = 10ms/4*62,5ns-1/4 = 40000-1/4
                        ;Korrektur: -15tT fuer rcall, 2 push, 2 pop, ret
                        ;1 Durchlauf der Schleife benoetigt 4tT
                        ;GKorrektur = G-1/4-15/4 = 40000-4 = 39996 = 0x9C3C
                        ;(Korrektur koennte man vernachlaessigen)
W10MSL:	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W10MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 50ms (Wait 50ms)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden.
;-------------------------------------------------------------------------------
.IF Flag_W50MS == 1
W50MS:	push	r24	;rette verwendete Registerinhalte
	ldi	r24,5	;Zaehler = 5
W50MSL: rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	dec	r24	;Dekrementiere den Schleifenzaehler W
	brne	W50MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r24	;Wiederherstellung der verwendeten Registerinhalte
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 100ms (Wait 100ms)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W100MS == 1
W100MS:	push	r24	;rette verwendete Registerinhalte
	ldi	r24,10	;Zaehler = 10
W100MSL: rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	dec	r24	;Dekrementiere den Schleifenzaehler W
	brne	W100MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r24	;Wiederherstellung der verwendeten Registerinhalte
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 500ms (Wait 500ms)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W500MS == 1
W500MS:	push	r24	;rette verwendete Registerinhalte
	ldi	r24,50	;Zaehler = 50
W500MSL: rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	dec	r24	;Dekrementiere den Schleifenzaehler W
	brne	W500MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r24	;Wiederherstellung der verwendeten Registerinhalte
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 1s (Wait 1s)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W1S == 1
W1s:	push	r24	;rette verwendete Registerinhalte
	ldi	r24,100	;Zaehler = 100
W1sL:	rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	dec	r24	;Dekrementiere den Schleifenzaehler W
	brne	W1sL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r24	;Wiederherstellung der verwendeten Registerinhalte
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 5s (Wait 5s)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W5S == 1
W5s:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi	r24,0xF4 ;Zaehler = 500
	ldi	r25,0x01
W5sL:	rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W5sL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 10s (Wait 10s)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W10S == 1
W10s:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi	r24,0xE8	 ;Zaehler = 1000
	ldi	r25,0x03
W10sL:	rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W10sL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 1min (Wait 1min)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W1MIN == 1
W1MIN:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi	r24,0x70 ;Zaehler = 6000
	ldi	r25,0x17
W1MINL:	rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W1MINL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet 10min (Wait 10min)
;	Der Fehler durch zusaetz. Befehle kann hier vernachlässigt werden. 
;-------------------------------------------------------------------------------
.IF Flag_W10MIN == 1
W10MIN:	push	r24	;rette verwendete Registerinhalte
	push	r25
	ldi	r24,0x60	 ;Zaehler = 60000
	ldi	r25,0xEA
W10MINL: rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	W10MINL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 1us (Wait X*1us)
;       Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;       Der Fehler durch die zusaetzlichen Befehle kann oft vernachlässigt
;       werden
;-------------------------------------------------------------------------------
.IF Flag_WW1US == 1
WW1US:  push    r24      ;rette verwendete Registerinhalte
        push    r25
WW1USL: rcall   W1US    ;Rufe innere Schleife (Unterprogramm W100us)
        sbiw    r24,1    ;Dekrementiere den Schleifenzaehler W
        brne    WW1USL  ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25      ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 10us (Wait X*10us)
;       Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;       Der Fehler durch die zusaetzlichen Befehle kann oft vernachlässigt
;       werden
;-------------------------------------------------------------------------------
.IF Flag_WW10US == 1
WW10US: push    r24      ;rette verwendete Registerinhalte
        push    r25
WW10USL: rcall   W10US  ;Rufe innere Schleife (Unterprogramm W100us)
        sbiw    r24,1    ;Dekrementiere den Schleifenzaehler W
        brne    WW10USL ;Verlasse die Schleife bei Schleifenzaehler W = 0
        pop     r25      ;Wiederherstellung der verwendeten Registerinhalte
        pop     r24
        ret             ;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 100us (Wait X*100us)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;       Der Fehler durch die zusaetzlichen Befehle kann oft vernachlässigt
;       werden (max Fehler bei einmaligem Aufruf < 1,2%).
;-------------------------------------------------------------------------------
.IF Flag_WW100US == 1
WW100US: push	r24	;rette verwendete Registerinhalte
	push	r25
WW100USL: rcall	W100US	;Rufe innere Schleife (Unterprogramm W100us)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW100USL ;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 1ms (Wait X*1ms)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;       Der Fehler durch die zusaetzlichen Befehle kann meist vernachlässigt
;       werden (max Fehler bei einmaligem Aufruf < 0,12%).
;-------------------------------------------------------------------------------
.IF Flag_WW1MS == 1
WW1MS:	tst     r24       ;Falls X = 0 schnellstmoeglich zurueck
        brne    WW1MSP
        tst     r25
        brne    WW1MSP
        ret
WW1MSP: push	r24	;rette verwendete Registerinhalte
	push	r25
WW1MSL:	rcall	W1MS	;Rufe innere Schleife (Unterprogramm W1ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW1MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF
	
;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 10ms (Wait X*10ms)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;	Der Fehler durch die push- und pop-Befehle kann hier vernachlässigt
;	werden. 
;-------------------------------------------------------------------------------
.IF Flag_WW10MS == 1
WW10MS:	push	r24	;rette verwendete Registerinhalte
	push	r25
WW10MSL: rcall	W10MS	;Rufe innere Schleife (Unterprogramm W10ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW10MSL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 100ms (Wait X*100ms)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;	Der Fehler durch die push- und pop-Befehle kann hier vernachlässigt
;	werden. 
;-------------------------------------------------------------------------------
.IF Flag_WW100MS == 1
WW100MS: push	r24	;rette verwendete Registerinhalte
	push	r25
WW100MSL: rcall	W100MS	;Rufe innere Schleife (Unterprogramm W100ms)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW100MSL ;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF
	
;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 1s (Wait X*1s)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;	Der Fehler durch die push- und pop-Befehle kann hier vernachlässigt
;	werden. 
;-------------------------------------------------------------------------------
.IF Flag_WW1S == 1
WW1S:	push	r24	;rette verwendete Registerinhalte
	push	r25
WW1SL:	rcall	W1S	;Rufe innere Schleife (Unterprogramm W1s)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW1SL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet X mal 1min (Wait X*1min)
;	Der Anfangswert von X muss im Hauptprogramm gesetzt werden!
;	Der Fehler durch die push- und pop-Befehle kann hier vernachlässigt
;	werden. 
;-------------------------------------------------------------------------------
.IF Flag_WW1MIN == 1
WW1MIN:	push	r24	;rette verwendete Registerinhalte
	push	r25
WW1MINL: rcall	W1MIN	;Rufe innere Schleife (Unterprogramm W1min)
	sbiw	r24,1	;Dekrementiere den Schleifenzaehler W
	brne	WW1MINL	;Verlasse die Schleife bei Schleifenzaehler W = 0
	pop	r25	;Wiederherstellung der verwendeten Registerinhalte
	pop	r24	
	ret		;Ruecksprung ins Hauptprogramm
.ENDIF

;-------------------------------------------------------------------------------
