TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: chacon2000 en 21 de Octubre de 2017, 15:33:17
-
Hola, mucho gusto
soy nuevo en el foro y estoy muy confundido respecto al uso del CCP1 de este pic y con mas que busco en los foros solo me revuelvo mas
Lo que pasa es que me pidieron controlar un motor DC por medio de interrupciones en el CCP1 (yo se que este no tiene una interrupción como tal si no que usa la del timer2). Tengo un programa que genera el pwm pero no se como implementar la interrupción y en si la duda que tengo es:
1.-¿Que tipo de interrupcion podria realizar con el timer2?
Por que me gustaría que por ejemplo que cada 5 segundos se genere una interrupción para detener el motor y realizar otra acción o generar una interrupción donde cada cierto tiempo aumente el pwm al 90% y regrese al 50%.
O de plano estoy confundiendo el tipo de interrupción que se genera con el timer2?
Muchas gracias por su atención
List p=16F877A
include "P16F877A.INC"
__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC
;PR2=[(4MHz)/(10KHz*4*1)]-1 usando un prescaler de 1 y oscilador de 4Mhz
;PR2=100-1
;PERIODO=[(100+1)*4*Tosc*Prescaler]
;PERIODO=101us=.000101
;Buscando un ciclo de la mitad el Duty seria de:
;Duty=.000050
Periodo equ .000101 ;100 uS
Duty equ .000050 ;50 uS
org 0x00
goto Inicio
org 0x05
;Programa principal
Inicio clrf PORTA
clrf PORTB
clrf PORTC ;Borra salidas
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'11111011'
movwf TRISC ;RC2 salida
movlw Periodo-1
movwf PR2 ;Carga el registro de periodos
bcf STATUS,RP0 ;Selecciona banco 0
movlw Duty
movwf CCPR1L ;Carga la anchura del pulso
;Configura el modo PWM-----------------
movlw b'00001100'
; 11xx= modo PWM
movwf CCP1CON
;--------------------------------------
;Preescaler de 1:1 por lo tanto con una frecuencia de 4MHz evoluciona:
;cada 1uS (4*Tosc)
movlw b'00000100'
; ------00= Prescaler de 1
; -----1--= Timer2 activado
movwf T2CON ;T2 en On
Loop nop
goto Loop ;Bucle infinito
end
-
No se que interrupcion genera el CCP en modo PWM (tal ves cuando termine cada ciclo), el problema es que no vas a poder usar el Timer2 para crear ese tiempo. Ya que este nunca se va a producir el overflow (cuando pasa de 0xFF a 0x00) por estar trabajando con el CCP. Es decir el TMR2 jamas va a tener su flag activo.
Para el tiempo que estas pensando, y para que se vea, vas a tener que usar otro timer, por lo que decis son 5 segundos, entonces lo mejor es usar el Timer1 que es de 16bits, y requeris menos interrupciones para llegar a esos segundos. Y dejas el TMR2 + CCP funcionando para unicamente el PWM.
-
Se puede usar el modulo PWM con otro timer que no sea timer2?
por que si uso el timer1 ya no estaría usando como tal el modulo PWM si no el comparador o captura y en la escuela me pidieron programar el PWM solamente.
-
No el CCP utiliza para el PWM el TMR2 unicamente.
Te quedan 2 opciones:
- En tu loop principal, leer un boton, cuando sea presionado, activar el PWM hacerlo pasar por una demora de 1s por ejemplo, y aumentar el PWM, asi 5 veces (asi llegamos a los 5s ) y detener el PWM, y volver a leer el boton. Si haces mas pequeño el delay, podes hacer que aumente en pasos mas pequeños el duty del PWM.
- La otra que te queda es intentar definir un "periodo" entero, y ver si el flag de interrupcion del CCP se activa, de esa forma si tu periodo es de 10ms por ejemplo, y necesitas esperar 5s, contas 5s/10ms = 500 interrupciones, para saber que pasaron los 5s.
Esto supuestamente si es que el flag se activa. Ahora no veo sentido el porque no te permite usar CCP+TMR2 para el PWM y un TMR1 para cualquier "tiempo" que quieras dar.
En resumen, si solo queres usar el CCP+TMR2, entonces la primera opcion es la que debes seguir. Pero no utilizarias interrupciones.