Vous êtes sur la page 1sur 3

;PROGRAMA PWM 16F628

;Aumenta o disminuye el brillo de un led


;Hecho por: JOAQUIN CANO BECERRA
;================================================= ====
RADIX dec
include <P16F628A.INC> ;incluye archivo
;================================================= ====
;Definicion de Variables
;================================================= ====
#DEFINE banco0 bcf STATUS,RP0 ; Fija banco 0 de la memoria
#DEFINE banco1 bsf STATUS,RP0 ; Fija banco 1 de la memoria
CMCON equ 0x1f
PICRES equ 0x00
PICRAM equ 0x20
PICINT equ 0x04
MAXI equ 0 ;Posicion de pulsador 1
MINI equ 1 ;Posicion de pulsador 2
T1 equ 0x21 ;Variables para temporizador
T2 equ 0x22
T3 equ 0x23
T4 equ 0x24
AUX1 equ 0x25 ;Variable para control de PWM
;================================================= ====
;Define memoria de programa en vector de reset
;================================================= ====
org PICRES ; reset
MIRESET:
goto INICIO ; salta el vector de interrupcion
;================================================= ====
;Direccion de rutina de interrupcion
;================================================= ====
org PICINT ; toda interrupcion apunta a esta direccion
MINIMO:
retfie ; retorno de interrupcion
;================================================= ====
; INICIO DEL PROGRAMA PRINCIPAL
;================================================= ====
INICIO:
movlw 0x00 ; configuracion delos bits de INTCON
movwf INTCON
clrf PORTA
clrf PORTB
banco1 ; selecciona banco 1 para registros OPTION y TRIS
movlw 0x03 ; Pone los bits en RA0 y RA1 como entradas
movwf TRISA ; y los restantes como salidas
movlw 0x00 ; Pone los bits de RB0 a RB7 como salidas
movwf TRISB
movlw 0xFF
movwf PR2 ; Inicializa CCP1
banco0 ;cambia a banco 0
movlw 0x07 ;Cancela comparadores internos
movwf CMCON
movlw 0x05 ;postscale 1:1, prescala 4, timer 2 fijado
movwf T2CON
movlw 0x0F ;Inicializa CCP -> PWM
movwf CCP1CON
movlw 0xFF ;
movwf CCPR1L ;inicia Duty Cycle en 100%
movlw 0xFF ;Apaga Led de puerto CCP1

movwf AUX1
;=================================================
; LOOP PRINCIPAL (BUCLE)
;=================================================
LOOP:
btfsc PORTA,MAXI ;Verifica estado de pulsador 1
call tec1 ;Presionada, giro horario
btfsc PORTA,MINI ;Verifica estado de pulsador 2
call tec2 ;Presionada, giro anti-horario
goto LOOP
;=================================================
; SUBRUTINAS DE OPERACION DE LOS 2 PULSADORES
;=================================================
tec1:

====
====

====
====

call _5ms ; espera para verificar si hay una tecla presionada


btfsc PORTA,MAXI ;Verifica estado de pulsador 1 nuevamente
goto tec1_1 ; presionada, giro horario
goto FINALR
tec1_1:
movf AUX1,W ;Carga W con aux
xorlw 0xFF ;Compara con 255
btfss STATUS,Z ;Verifica
call sube ;Aumenta valor de PWM
goto FINALR
tec2:
call _5ms ; espera para verificar si hay una tecla presionada
btfsc PORTA,MINI ;Verifica estado de pulsador 1 nuevamente
goto tec2_1 ; presionada, giro horario
goto FINALR
tec2_1:
movf AUX1,W ;Carga W con aux
xorlw 0x00 ;Compara con 0
btfss STATUS,Z ;Verifica
call baja ;Disminuye valor de PWM
FINALR:
return
;================================================= ====
; SUBRUTINAS DE MANEJO DE PWM (SUBE O BAJA)
;================================================= ====
sube:
incf AUX1,F ;Incrementa AUX
movf AUX1,W ;Carga W con aux
movwf CCPR1L ;Carga CCPR2L con valor de AUX
xorlw 0xFF ;Compara con 255
btfss STATUS,Z ;Verifica
goto baja1 ;Apenas ejecuta instrucciones de baja
bsf CCP1CON,CCP1X ;Limpia bits 4 y5
bsf CCP1CON,CCP1Y ;LSB de Duty Cycle = 100%
return
baja:
decf AUX1,F ;Decrementa AUX
movf AUX1,W ;Carga W con AUX
movwf CCPR1L ;Carga CCPR2L con valor en AUX
baja1:
bcf CCP1CON,CCP1X ;Limpia bits 4 y 5
bcf CCP1CON,CCP1Y ;LSB de Duty Cycle
return
;================================================= =============================

; Temporiza con Reloj interno o externo de 4 Mhz, se trata de un temporizador co


n espera ocupada
;================================================= =============================
; RUTINAS DE TEMPORIZACION
;================================================= =============================
_1ms:
movlw 0x02 ;Carga W con 2
movwf T1 ;Carga T1 con W
movlw 0x00 ;Carga W con 0
movwf T4 ;Carga T4 con 0
goto CAR_1
_5ms:
movlw 0x06 ;Carga W con 6
movwf T1 ;Carga T1 con W
movlw 0x00 ;Carga W con 0
movwf T4 ;Carga T4 con 0
goto CAR_1
_20ms:
movlw 0x18 ;Carga W con 24
movwf T1 ;Carga T1 con W
movlw 0x00 ;Carga W con 1
movwf T4 ;Carga T4 con 1
goto CAR_1
_200ms:
movlw 0x01 ;Carga W con 1
movwf T1 ;Carga T1 con W
movlw 0x01 ;Carga W con 1
movwf T4 ;Carga T4 con 1
goto CAR_1
_1000ms:
movlw 0x0F ;Carga W con 6
movwf T3 ;Carga T3 con W
movlw 0x01 ;Carga W con 0
movwf T4 ;Carga T4 con 0
CAR:
movlw 0xFF ;Carga W con 255
movwf T1 ;Carga T1 con W
btfsc T4,0 ;Verifica bit 0 de T4
decfsz T3,F ;Decrementa T3
goto CAR_1
return
CAR_1:
movlw 0xFF ;Carga W con 255
movwf T2 ;Carga T2 con 255
DEC_1:
decfsz T2,1 ;Decrementa T2
goto DEC_1 ;255 x T1 veces
decfsz T1,1 ;Decrementa T1
goto CAR_1 ;Vuelve a Cargar T2
btfsc T4,0 ;verifica bit 0 de T4
goto CAR ;retorna 0 en W
return
;================================================= =============================
========
; FIN DEL PROGRAMA
;================================================= =============================
=======
end

Vous aimerez peut-être aussi