TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: krizpin en 29 de Marzo de 2015, 20:15:18
-
BUENAS A TODOS.
TENGO UN PROBLEMA Y ES QUE NO SOY A CONFIGURAR EL MODULO CCP3 DE ESTE MICRO. AL PARECER E LEIDO QUE PROTON SOLAMENTE TRABAJA COMO MAX CON 2 MODULOS CCP Y NO SOY A CONFIGURAR EL CCP3 PARA GENERAR PWM . ALGUIEN TIENE ALGUNA IDEA??????
GRACIASSSS
-
podes modificar los registros directamente ? eso podria solucionarlo
-
lo habia pensando si,,pero no lo tengo muy claro... la verdad es que no lo tengo nada claro jejej
-
Si no te queres complicar mucho, configura uno de los PWM fijate que valores tiene cada uno de sus registros y copialos al otro. y Luego lo unico que necesitarias es variar el duty. que es un registro tambien.
podrias observar cual es el maximo y minimo que puede tomar el otro registro y no te excedes de esos valores.
Y eso te salva de saber que hace cada registro y como funciona. Si existe un error entonces ahi vas a tener que ponerte de cabeza y ver por qeu no funciona xD
-
gracias intentare dar con ello... a ver si hay suerte. un abrazoooo
-
Este código lo escribe hace algún tiempo para simplificarme la tarea de trabajar con el modulo CCP, está orientado a funciones y que yo sepa Proton no las permite, de todas formas lo mismo alguien te puede orientar ya que están todos o la mayoría de los registros necesarios para el Pic18F2550, seguramente tendrá similitud con el que usas.
'********************************************************
'Pic18F2550
'Resumen y conjunto de funciones para configurar el modulo CCP1
'By COS
'********************************************************
'Configura el modulo CCP1 en modo PWM y TIMER2
Symbol _pinccp1 = rc2 'Asigna el pin de trabajo del CCP1
ConfigPin _pinccp1 = Output 'Pin como salida
Call _set_pwm1_duty(0) 'Maximo 1020, minimo 0, potencia inicial
Call _setup_timer2(_tmr2_div4, 255, 1) '9765.63Hz a 10Mhz
Call _setup_ccp1(_ccp_pwm) 'PWM1 a On
main:
Dim _power As Word
_power = 0
While x = x
Call _set_pwm1_duty(_power) 'Selecciona el duy-cycle de trabajo
If _power < 1020 Then _power = _power + 1 'Incrementa potencia
WaitMs 100 'Pausa
Wend
Goto main
End
'**********************************************************
'**********************************************************
'Include "_FuncionesPic18F2550.bas" *****************************
'By COS, 19/06/2014, 12/2013, Pic Simulator IDE v7.19_03 ***********
'**********************************************************
'Funciones para configuración y control del modulo CCP1 (Pic18F2550)
'**********************************************************
'GESTIÓN MODULO CCP1:
'_setup_ccp1(), _set_pwm1_duty()
'**********************************************************
'Call _Setup_CCP1(modo)
'Modo:
'_CCP_OFF modulo CCP apagado
'_CCP_PWM modulo CCP trabajando como PWM
'Call _Set_Pwm1_Duty(Duty)
'Duty = duración del pulso alto con respecto al pulso bajo.
'**********************************************************
'**********************************************************
'TIMER2:
'**********************************************************
'_set_timer2(Byte), _clear_tiemr2(), _get_timer2(), _tmr2if
'_setup_timer2(), _timer2()
'**********************************************************
'_setup_timer2(_prediv As Byte, _periodo As Byte, _posdiv As Byte)
'_Prediv: 'Preescaler
'_tmr2_disable: Para el Tmr2
'_tmr2_div1: Divide por 1
'_tmr2_div4: Divide por 4
'_tmr2_div16: Divide por 16
'_Periodo: Carga el registro del TMR2
'_posdiv: Postscale, Valores comprendidos entre 0 y 16
'_set_timer2(Byte): Recarga el contador del TIMER2
'_get_timer2(): Lee el contador del TIMER2 (Byte)
'_clear_timer2(): Borra el contador del TIMER2
'_tmr2if: Etiquea el flag de desborde TIMER2
'_timer2(): (_on), (_off), activa o para el timer2
'**********************************************************
'**********************************************************
'MODULO CCP1
'**********************************************************
Const _on = 1
Const _off = 0
'Const _ccp_off = 0
'Const _ccp_pwm = 1
'Selecciona el modo de trabajo del modulo CCP1
Proc _setup_ccp1(_mode As Byte)
If _mode = 0 Then 'CCP1 a Off
ccp1con.ccp1m0 = 0
ccp1con.ccp1m1 = 0
ccp1con.ccp1m2 = 0
ccp1con.ccp1m3 = 0
Endif
If _mode = 1 Then 'CCP1 en modo Pwm
ccp1con.ccp1m0 = 0
ccp1con.ccp1m1 = 0
ccp1con.ccp1m2 = 1
ccp1con.ccp1m3 = 1
Endif
End Proc
'Carga el duty cycle
Proc _set_pwm1_duty(_duty As Word)
ccp1con.dc1b0 = _duty.0 'ccp1y = _duty.0
ccp1con.dc1b1 = _duty.1 'ccp1x = _duty.1
ccpr1l = ShiftRight(_duty, 2)
End Proc
'***************************************************
'***************************************************
'TIMER2
'***************************************************
'Etiquetas y constantes
Symbol _tmr2if = PIR1.tmr2if 'Etiquea el flag de desbordamiento Timer2
'ConFigura el TIMER2
'Prescale Select Bits (T2CON: T2CKPS1, T2CKPS0)
Const _tmr2_disable = 0x00 'Timer2 a Off
Const _tmr2_div1 = 0 'Prescale Select bits
Const _tmr2_div4 = 1 'Prescale Select bits
Const _tmr2_div16 = 2 'Prescale Select bits
'Postscale Select Bits (T2CON: TOUTPS3, TOUTPS2, TOUTPS1, TOUTPS0)
'Postscale de 0 a 16.
'prediv: (prescaler) _tmr2_disable, _tmr2_div1, _tmr2_div4, _tmr2_div16
'Period: Cuando se hace reset (8Bit), TMR2 = PR2.
'_posdiv: (postscaler) valores comprendidos entre 0 1 16.
Proc _setup_timer2(_mode As Byte, _periodo As Byte, _posdiv As Byte)
t2con = 0x00 'Timer2 a Off
t2con.t2ckps0 = _mode.0
t2con.t2ckps1 = _mode.1
pr2 = _periodo 'Desborde TMR2 (TMR2 = PR2)
t2con.toutps0 = _posdiv.0 'Asigna postscale
t2con.toutps1 = _posdiv.1 'Asigna postscale
t2con.toutps2 = _posdiv.2 'Asigna postscale
t2con.toutps3 = _posdiv.3 'Asigna postscale
End Proc
'Borra el registro del TMR2
Proc _clear_timer2()
tmr2 = 0 'Borra el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Proc
'Recarga el registro del TMR
Proc _set_timer2(_reg As Byte)
tmr2 = _reg 'Recarga el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Proc
'Devuelve el registro del Tmr2
Function _get_timer2() As Byte
_get_timer2 = tmr2 'Carga el byte
PIR1.tmr2if = 0 'Flash dosborde a cero
End Function
'Activa o para el contador del timer2
Proc _timer2(_on_off As Bit)
t2con.tmr2on = _on_off
End Proc
'***************************************************
Y en esta pagina hay un calculador que al suministrarle los valores cristal, frecuencia deseada y duty-cycle nos indica con que valores hay que cargar la mayoría de registros del modulo CCP1.
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
-
Device = 16F737
Xtal 4
Config1 CP_ALL , CCP2_RB3 , DEBUG_OFF , VBOR_2_0 , BOREN_OFF , MCLRE_OFF , PWRTE_ON , WDT_OFF , INTRC_IO , MCLR_OFF , WDTE_OFF
Config2 BORSEN_1 , IESO_OFF , FCMEN_OFF
OSCCON=%01101110 'CONFIGURAMOS EL CRISTAL INTERNO PARA 4MHZ
All_Digital true
Declare CCP1_Pin PORTC.2
Dim X As Word
Dim Duty As Word
Dim Vout As Word
Dim Duty_R As Byte
Symbol Quanta = 49
'______________________________________________________________________________
' *********************************
' * The main program starts here! *
' *********************************
TRISB.5 = 0 ' PONEMOS EL PUERTO B.5 COMO SALIDA PARA PODER CONFIGURAR EL MODULO CCP3 COMO PWM
T2CON = %00000100 ' TIMER 2 ON
PR2 = 255 ' CARGAMOS TIMER2 A 255
Vout = 2500 'TENSION DE SALIDA EN CCP3 2,5V
GoSub Make_pwm
Stop
'______________________________________________________________________________
Make_pwm:
Duty = (Vout*10) / Quanta
Duty_R = (Vout) // Quanta
Duty = Duty + Duty_R
X=Duty
CCP3CON.4 = X.0
CCP3CON.5 = X.1
X = X >> 2
CCPR3L = X
CCP3CON.2 = 1
CCP3CON.3 = 1
Return
Stop
LISTO YA FUNCIONA GRACIAS A TODOS