Autor Tema: 3 HPWM CON PIC16F737 Y PROTON  (Leído 3190 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado krizpin

  • PIC10
  • *
  • Mensajes: 32
3 HPWM CON PIC16F737 Y PROTON
« 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #1 en: 29 de Marzo de 2015, 20:53:10 »
podes modificar los registros directamente ? eso podria solucionarlo

Desconectado krizpin

  • PIC10
  • *
  • Mensajes: 32
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #2 en: 30 de Marzo de 2015, 04:25:35 »
lo habia pensando si,,pero no lo tengo muy claro... la verdad es que no lo tengo nada claro jejej

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #3 en: 30 de Marzo de 2015, 04:32:19 »
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

Desconectado krizpin

  • PIC10
  • *
  • Mensajes: 32
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #4 en: 30 de Marzo de 2015, 07:28:31 »
gracias intentare dar con ello... a ver si hay suerte. un abrazoooo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #5 en: 30 de Marzo de 2015, 21:02:44 »
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
« Última modificación: 30 de Marzo de 2015, 21:12:29 por dogflu66 »
Saludos desde Granada, España.

Desconectado krizpin

  • PIC10
  • *
  • Mensajes: 32
Re: 3 HPWM CON PIC16F737 Y PROTON
« Respuesta #6 en: 31 de Marzo de 2015, 13:02:43 »
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


 

anything