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 0.5% (1/200).
;definición de variables y constantes
PWM_DUTY
equ
7FH
;CICLO DE TRABAJO
PWM_CTA
equ
7EH
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:
djnz
PWM_CTA,PWM_CHK
mov
PWM_CTA,#200
clr
PWM_OUT
reti
PWM_CHK:
xch
A,PWM_CTA
cjne
A,PWM_DUTY,PWM_fin
setb
PWM_OUT
PWM_fin:
xch
A,PWM_CTA
reti
;*************************************
;
------- Inicio de programa principal -------
;-------------------------------------------------------
INICIO:
acall
COND_INI
CICLO1:
mov
A,PWM_DUTY
cjne
A,#200,INCREMENTA
sjmp
DECREMENTA
INCREMENTA:
inc
PWM_DUTY
acall
RETARDO
sjmp
CICLO1
CICLO2:
mov
A,PWM_DUTY
cjne
A,#0,DECREMENTA
sjmp
CICLO1
DECREMENTA:
dec
PWM_DUTY
acall
RETARDO
sjmp
CICLO2
;-------------------------------------------------------
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
mov
PWM_CTA,#200
ret
;***************************************
end