Hola Colegas!...Ya he ido desarrollando el programa para la manipulacion de la velocidad del motor mediante PWM, aqui les muestro el programa que hice, les ruego que lo vean y me digan si lo puedo optimizar o si le falta algo, espero sus respuestas, gracias.
;* Este programa utilizando un PIC16F877
;* Controla el ciclo de trabajo de la salida PWM
;* (Patita CCP1) del PIC con la cual controlará la velocidad de un motor DC
;* Se usa un botón conectado a RB0 para incrementar la velocidad y
;* Otro conectado a RB1 para disminuirla.
;* Se supone un cristal de 14.7456 Mhz
;* Reinaldo Mendez
;* Ingeniería Electrónica
;* Instituto Universitario Politécnico “Santiago Mariño”
;*****************************************************************
cont EQU 0x20
cont1 EQU 0x21
CTH EQU 0x22
CTL EQU 0x23
org 0x0000
inic BSF STATUS, RP0 ; Banco1
BSF TRISB, 0 ; Configura RB0 como entrada
BSF TRISB, 1 ; Configura RB1 como entrada
MOVLW 0xFF ; carga periodo
MOVWF PR2 ; lo establece para el PWM
BCF TRISC, 2 ; patita RC2/CCP1 como salida
BCF STATUS, RP0 ; Banco 0
CLRF CCPR1L ; inicializa Ciclo de trabajo en cero
BCF CCP1CON, CCP1X
BCF CCP1CON, CCP1Y
MOVLW 0x04 ; configura Timer 2
MOVWF T2CON ; preescalador 1/1, habilita Timer 2
BSF CCP1CON, CCP1M3 ; Configura el modulo CCP1 para
; Operación PWM
BSF CCP1CON, CCP1M2
; En este punto la salida PWM
; tiene un Ciclo de trabajo CT=0
CLRF CTL ; inicializa CT de 10 bits en cero
CLRF CTH
Esp0 BTFSC PORTB, 0 ; Checa Botón RB0
CALL incre ; si está presionado incrementa CT
Esp1 BTFSC PORTB, 1 ; si no se ha presionado Checa botón RB1
CALL decre ; si está presionado Decrementa CT
MOVF CTH, W ; si no se ha presionado obtiene copia de ; CT parte alta
MOVWF CCPR1L ; actualiza parte alta del CT real
; A continuación actualiza la parte alta del ; CT real
MOVLW 0xCF ; máscara
ANDWF CCP1CON, 1 ; limpia los dos msbits del CT real
MOVLW 0x03 ; máscara
ANDWF CTL, 1 ; limpia los 6 bits altos en CTL
SWAPF CTL, W ; copia los 2 bits bajos de CTL en el nibble ; alto de W
IORWF CCP1CON, 1 ; pone bits que deben ser 1 en los dos msb ; del CT real
; Con esto queda actualizada la parte baja ; del CT real
CALL pau ; pausa para moderar la velocidad de ; incremento/decremento
GOTO Esp0 ; repite
incre INCF CTL, 1 ; incrementa parte baja de la copia de ; CT
MOVF CTL
ANDWF 0x04
BTFSC STATUS, Z ; ¿El bit 2 de CTH es cero?
RETURN ; si no, retorna
CLRF CTL
INCF CTH, 1 ; si se hizo cero incrementa parte alta ; de CT y limpia la parte baja.
RETURN
decre DECF CTL,1 ; decrementa parte baja de la copia de ; CT
COMF CTL, W ; copia negado de CTL a W (para ver si ; CTL=0xFF)
BTFSS STATUS, Z ; checa si W es cero
RETURN ; si no, retorna
DECF CTH, 1 ; si sí, Decrementa parte alta de CT
MOVF CTL
ANDWF 0x03
MOVWF CTL ; Borra 6 bits más significativos de CTL
RETURN
pau CLRF cont1 ;** pausa de 50 miliseg. Aproximadamente
CLRF cont
p1 DECFSZ cont,1
GOTO p1
DECFSZ cont1, 1
GOTO p1
RETURN
end