Das Programm lässt eine LED alle 500ms blinken (500ms aus, 500ms an) -> Blinklicht. Ein Beispiel-Programm in Assembler, programmiert ohne Timer, sondern mit einer Verzögerungsfunktion (mit einer gewissen Genauigkeit). Das Unterprogramm kann als “Software-Timer” benutzt werden. Falls es auf keine hohe zeitliche Genauigkeit ankommen soll, können solche Delay-Funktionen/Unterprogramme sehr gut benutzt werden.
ASM-Programm
FILE: main.asm
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: main.asm ; Author: declis (xdec.de) ;*********************************************** .cdecls "msp430g2231.h" time_ms .equ 500 ;time-value in milliseconds .ref time_wait .global main .text main: mov.w #0x280,SP ;initialize stack pointer mov.w #WDTPW+WDTHOLD,&WDTCTL ;stop watchdog timer bis.b #BIT6,&P1DIR ;P1.6 -> output bic.b #BIT6,&P1OUT ;clear P1.6 (LED off) mov.w #time_ms,R4 ;500ms loop: xor.b #BIT6,&P1OUT ;toggle P1.0 (LED2) call #time_wait ;wait 500ms jmp loop .end
FILE: lib_func.asm
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: lib_func.asm ; Author: declis (xdec.de) ;*********************************************** .cdecls "msp430g2231.h" .def time_wait ;global entry of function .text ;------------------------------------------ ; Name: time_wait ; Description: wait "x" ms ; (the inner loop consume 1ms, ; outer loop is multiplication ; factor "x". ; (1ms*200=200ms for example) ; SMCLK=DC0=~1MHz ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; time in s = (5*195+24)*x/(1*10^6Hz) ; example: x=500 (500ms) ; => 0,4995s ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; Input: R4 - "x" ms ; Returns: nothing ; Destroys: nothing ;------------------------------------------ time_wait: push.w SR ;3 cycles push.w R4 ;3 cycles push.w R5 ;3 cycles outer_loop: mov.w #195,R5 ;2 cycles inner_loop: sub.w #1,R5 ;2 cycles nop ;1 cycle jnz inner_loop ;2 cycles sub.w #1,R4 ;2 cycles jnz outer_loop ;2 cycles pop.w R5 ;3 cycles pop.w R4 ;3 cycles pop.w SR ;3 cycles ret .end