"Teoría es cuando se sabe todo y nada funciona. Práctica es cuando todo funciona y nadie sabe porqué. En este recinto se conjugan Teoría y Práctica: nada funciona y nadie sabe porqué..."

---------------------------------------------------------------


Ejemplo para generar una Señal PWM por Interrupción

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