El programa de PWM se maneja por interrupciones. Esto significa que el temporizador generará
peticiones de interrupción a la CPU, para dejar de procesar el programa principal y responder a la petición de
interrupción. Puesto que este programa del
programa principal, se ha incluida una instrucción "branch to here" bifurcación hacia aquí", después de poner a 0
la instrucción de máscara de interrupción (CLI). Esta instrucción es un bucle infinito. Las interrupciones del
temporizador causarán a la CPU el dejar periódicamente este bucle infinito, para responder a las peticiones del
temporizador y entonces volver a ejecutar el bucle infinito.
Listado 5. Listado del Programa PWM (página 1 de 2)
;Todas las EQU para el 705J1 están incluidas
; pero no se muestran en este listado
;
0000
Percent100
0000
PWM
;
DesiredPWM.
00C0
00C0
DesiredPWM
; expresado como el numerador de DesiredPWM/255.
; 0 = estado bajo continuo.
00C1
PWMCoarse
; antes se empieza comparando PWMFine con el valor en TCR.
00C2
PWMFine
;
; PWMFine es derivado desde los 4 bits más bajos de DesiredPWM.
; Estos 4 bits son puestos en los 4 bits más altos de PWMFine.
00C3
VarEnd
;********************************************************
;
0300
;
0300
Start
0300 9C
0301 3F00
A
0303 A6FF
0305 B704
0307 AEC0
0309 7F
ClrLoop
030A 5C
030B 26FC
030D A680
030F B7C0
PWM
0311 A61C
timer...
0313 B708
0315 9A
0316 20FE
interrup.
Listado 5. Listado del Programa PWM (página 2 de 2)
;********************************************************
;Pone el período RTI. @2MHz y RT1:RT0 = 0:0, período = 8.192 ms
;o 122 Hz aproximadamente.
0318
TimerInt
0318 0E0804 BRSET
Listado 5. Listado del Programa PWM
EQU
$FF
EQU
PA7
ORG
RAMStart
RMB
1
RMB
1
RMB
1
EQU
*
ORG
ROMStart
EQU
*
RSP
CLR
PORTA
LDA
#$FF
;Pone los pins del Puerto A como Salida
STA
DDRA
LDX
#RAMStart
CLR
,X
INCX
BNE
ClrLoop
LDA
#$80
STA
DesiredPWM
LDA
#$1C
STA
TSCR
CLI
BRA
*
EQU
*
TOF,TSCR,TOFInt
;valor de DesiredPWM para 100%
;salida PWM en bit 7 puerto A
;actualiza la variable
;ciclo de servicio PWM deseado...
255 = estado alto continuo.
;Numero de interrupciones TOF...
;Cuando TCR iguala PWMFine,...
; el PWM se pone 'bajo'.
;Reset el Stack Pointer
;Pone a 0 todas las salidas Puerto
;Borra todo de la RAM
;Punto del inicio de la RAM
;Borra un byte
;Apunta a la siguiente posición
;¿Borrada la última posición?
;No, Continua borrando la RAM
;Corresponde al 50% (128/255)
;Establece un 'duty cycle' del
;Borra interrupciones del
;y habilita interrupción RTIF
;Habilita interrupciones
;Bucle Infinito, usa PWM
;¿interrupción TOF?
101
, no tiene viene de otro