Zeitschleifenbibliothek
von
am 14.12.2012 um 19:39 (5081 Hits)
Hallo,
hier stelle ich meine Zeitschleifenbibliothek vor.
Es enthält genaue Zeitschleifen von 1Mikrosekunde bis 1Minute. Und mann kann Zeitschleifen über eine verschachtelte Zeitschleife X mal aufrufen. Zum Beispiel, für 3 Sekunden
warten , lädt man in Register X eine 3 und ruft WX1s auf.
Alles andere ist im Quellkode Komentaren beschrieben.
Wenn noch Fragen, ich Antworte gerne.
Gruß
Code:;********************************************************************************* ; Titel: SR_TIME_16M ; Datum: 13.12.2012 ; Autor: enprog ; ; InformNationen zur Beschaltung ; Prozessor: ATmega32 Quarzfrequenz:16MHz ; Eingänge: ; Ausgänge: ; Information zur Funktionsweise: Zeitschleifenbibliothek ; ;******************************************************************************* ;Wait 1us W1us: nop nop nop nop nop nop nop nop nop ret ; 16bit Zeitschleife wartet 10us(Wait 10us) W10us: push WL ;rette verwendete Registerinhalte push WH ldi WL,0x24 ;Schleifenzähler W=24 ldi WH,0x00 W10usL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W10usL ; Schleife wenn nicht gleich null pop WH ;Registerinhalte Wiederherstellen pop WL ret ; 16bit Zeitschleife wartet 100us(Wait 100us) W100us: push WL ;rette verwendete Registerinhalte push WH ldi WL,0x8c ;Schleifenzähler W=396 ldi WH,0x01 W100usL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W100usL ; Schleife wenn nicht gleich null pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 100us WX100us: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX100us ;Sprung wenn nicht gleich null tst XH brne WX100us ret WX100us:push XL ;rette verwendete Registerinhalte push XH WX100usL: rcall W100us ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX100usL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret ; 16bit Zeitschleife wartet 1ms(Wait 1ms) W1ms: push WL ;rette verwendete Registerinhalte push WH ldi WL,0x9C ;Schleifenzähler W=3996 ldi WH,0x0F W1msL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W1msL ; Schleife wenn nicht gleich null pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 1ms WX1ms: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX1msp ;Sprung wenn nicht gleich null tst XH brne WX1msp ret WX1msp:push XL ;rette verwendete Registerinhalte push XH WX1msL: rcall W1ms ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX1msL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret ; 16bit Zeitschleife wartet 10ms(Wait 10ms) W10ms: push WL ;rette verwendete Registerinhalte push WH ldi WL,0x3c ;Schleifenzähler W=39996 ldi WH,0x9c W10msL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W10msL ; Schleife wenn nicht gleich null pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 10ms WX10ms: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX10msp ;Sprung wenn nicht gleich null tst XH brne WX10msp ret WX10msp:push XL ;rette verwendete Registerinhalte push XH WX10msL: rcall W10ms ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX10msL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret ; 16bit Zeitschleife wartet 100ms(Wait 100ms) W100ms: push WL ;rette verwendete Registerinhalte push WH push r16 ldi WL,0x50 ;Schleifenzähler W=3920 ldi WH,0x0f ldi r16,0x63 ; r16=99 W100msr16:rcall W1ms ;unterprogramm W1ms wird 99mal aufgerufen subi r16,1 ;decrementiere r16 brne W100msr16 ; Schleife wenn r16 nicht gleich null W100msL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W100msL ; Schleife wenn nicht gleich null nop nop ; no operation für präzise Zeit nop pop r16 pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 100ms WX100ms: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX100msp ;Sprung wenn nicht gleich null tst XH brne WX100msp ret WX100msp:push XL ;rette verwendete Registerinhalte push XH WX100msL: rcall W100ms ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX100msL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret ; 16bit Zeitschleife wartet 1s(Wait 1s) W1s: push WL ;rette verwendete Registerinhalte push WH push r16 ldi WL,0xf0 ;Schleifenzähler W=39920 ldi WH,0x9b ldi r16,0x63 ; r16=99 W1sr16:rcall W10ms ;unterprogramm W1ms wird 99mal aufgerufen subi r16,1 ;decrementiere r16 brne W1sr16 ; Schleife wenn r16 nicht gleich null W1sL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W1sL ; Schleife wenn nicht gleich null nop nop ; no operation für präzise Zeit nop pop r16 pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 1s WX1s: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX1sp ;Sprung wenn nicht gleich null tst XH brne WX1sp ret WX1sp:push XL ;rette verwendete Registerinhalte push XH WX1sL: rcall W1s ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX1sL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret ; 16bit Zeitschleife wartet 1m(Wait 1m) W1m: push WL ;rette verwendete Registerinhalte push WH push XL push XH ldi WL,0xca ;Schleifenzähler W=33994 ldi WH,0x84 ldi XL,6f ldi XH,17 ; x=5999 W1m10ms:rcall W10ms ;unterprogramm W1ms wird 5999mal aufgerufen sbiw XL,1 ;decrementiere X brne W1m10ms ; Schleife wenn X nicht gleich null W1mL: sbiw WL,1 ;dekrementiere den schleifenzähler W brne W1mL ; Schleife wenn nicht gleich null nop nop ; no operation für präzise Zeit nop pop XH pop XL pop WH ;Registerinhalte Wiederherstellen pop WL ret ; verschachtelte 16bit Zeitschleife wartet X mal 1m WX1m: tst XL ; Teste ob das Register gleich null oder negativ ist.Wenn X=0 dann zurück. brne WX1mp ;Sprung wenn nicht gleich null tst XH brne WX1mp ret WX1mp:push XL ;rette verwendete Registerinhalte push XH WX1mL: rcall W1m ;Rufe innere Schleife (Uterprogramm W1ms) sbiw XL,1 ;dekrementiere den Schleifenzähler brne WX1mL ;Schleife pop XH ;Registerinhalte Wiederherstellen pop XL ret