;*******************************************************************************
;*
;*	Titel:	Bibliothek mit Zeitunterprogrammen (Grundgeruest)
;*		(SR_TIME_16M_sample.asm)
;*		
;*	Datum:	24/09/10			Version:	0.3 (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:
;*      
;*      W1MS:	16-Bit-Zeitschleife wartet 1ms (Wait 1ms)
;*      WW1MS:	Verschachtelte 16-Bit-Zeitschleife wartet W mal 1ms (Wait W*1ms)
;*      		Der Anfangswert von W (r25:r24) muss im Hauptprogramm gesetzt
;*      		werden!
;*
;*      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.
;*			
;*******************************************************************************

;-------------------------------------------------------------------------------
;       16-Bit-Zeitschleife wartet 1ms (Wait 1ms)
;-------------------------------------------------------------------------------
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

;-------------------------------------------------------------------------------
;       Verschachtelte 16-Bit-Zeitschleife wartet W mal 1ms (Wait W*1ms)
;	Der Anfangswert von W (r25:r24) muss im Hauptprogramm gesetzt werden!
;	Der Fehler durch die zusaetzlichen Befehle kann hier vernachlässigt
;	werden (max Fehler bei einmaligem Aufruf < 0,12%).
;-------------------------------------------------------------------------------
WW1MS:	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

;-------------------------------------------------------------------------------
