Este ejemplo genera una señal modulada por ancho de pulso (PWM) con un periodo de 20 mSeg y un ciclo de trabajo de 0 a 100% y de regreso. La variación mínima del ancho del pulso es de 1/200.
;definición de variables y constantes
PWM_DUTY
equ
7FH
;CICLO DE TRABAJO
PWM_TMP1
equ
7EH
PWM_TMP2
equ
7DH
PWM_OUT
equ
P1.1
;señal pwm
;**************************************
org
0
sjmp
INICIO
;-------------------------------------------------------
;
------- Rutina de interrupción PWM -------
;-------------------------------------------------------
Org
0BH
;vector de interrupción del Timer0
PWM_SERVO:
mov
PWM_TMP2,A
djnz
PWM_TMP1,PWM_CHK
mov
PWM_TMP1,#200
clr
PWM_OUT
reti
PWM_CHK:
xch
A,PWM_TMP1
cjne
A,PWM_DUTY,PWM_fin
setb
PWM_OUT
PWM_fin:
xch
A,PWM_TMP1
mov
A,PWM_TMP2
reti
;*************************************
;
------- Inicio de programa principal -------
;-------------------------------------------------------
INICIO:
acall
COND_INI
INICIO00:
mov
A,PWM_DUTY
cjne
A,#200,INCREMENTA
sjmp
DECREMENTA
INCREMENTA:
inc
PWM_DUTY
acall
RETARDO
sjmp
INICIO00
INICIO01:
mov
A,PWM_DUTY
cjne
A,#0,DECREMENTA
sjmp
INICIO00
DECREMENTA:
dec
PWM_DUTY
acall
RETARDO
sjmp
INICIO01
;-------------------------------------------------------
RETARDO:
djnz
R7,$
djnz
R6,RETARDO
ret
;*************************************
;
------- Rutina de configuración del sistema -------
;--------------------------------------------------------
COND_INI:
mov
TMOD,#02H
mov
TL0,#48H
mov
TH0,#48H
;T = 20mSeg, xtal 11.059 MHz
setb
TR0
mov
IE,#82H
clr
PWM_OUT
mov
PWM_DUTY,#0
;valor de inicio 0º
mov
PWM_TMP1,#200
ret
;***************************************
end