Autor Tema: 16f690 y PWM...no consigo entenderlo!  (Leído 15905 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #15 en: 06 de Septiembre de 2009, 10:02:44 »
Perdona la pregunta suky, pero dices que los puertos C estan bien definidos en el codigo de origen (el tuyo). Te importaria señalarme donde estan definidos?  :oops: :oops:
No, mi código es para el PIC16F628, no tiene puerto C, cuando comentabas eso pensé que te referías a los pines físicos del 16F690. Por eso te comento que debes tener los 2 datasheet para entender el funcionamiento del código y de ahí pasarlo al microcontrolador que piensas usar.




Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #16 en: 06 de Septiembre de 2009, 12:32:00 »
De nuevo dando guerra  :oops: pero quiero aprender y no pienso tirar la toalla!

Este es mi codigo modificado hasta el momento

Código: [Seleccionar]
Inicio
bsf STATUS,RP0 ; Banco 1
bcf STATUS,RP1  ; -
movlw b'11111011' ; Todo entradas menos una salida
movwf TRISC
bcf STATUS,RP0 ; Banco 0
movlw b'00000110' ; Se selecciona TMR2, preescaler de 1/16.-
movwf T2CON
bsf STATUS,RP0 ; Banco 1
movlw 0x1E ; Senal de 2kHz
movwf PR2
bcf STATUS,RP0 ; Banco 0
clrf CCPR1L ; Ciclo de trabajo 0%
bcf     CCP1CON,6
bcf     CCP1CON,7
bcf CCP1CON,DC1B1
bcf CCP1CON,DC1B0
bsf CCP1CON,CCP1M3 ; Configura modulo CCP modo PWM.-
bsf CCP1CON,CCP1M2

Y este, el output que me da (2 mensajes que me avisan de que trisc y pr2 no se hallan en el banco 0).

Message[302] C:\USERS\KAZUYA\DESKTOP\PIC\CUADRO\INTENTO PWM.ASM 63 : Register in operand not in bank 0.  Ensure that bank bits are correct. (se refiere a la linea  movwf   TRISC )
Message[302] C:\USERS\KAZUYA\DESKTOP\PIC\CUADRO\INTENTO PWM.ASM 69 : Register in operand not in bank 0.  Ensure that bank bits are correct  (se refiere a la linea  movwf   PR2)

Cosa que NO entiendo, ya que en ambos casos NO estamos en el banco 0!  :? :( Quien se volvera loco antes? el programa? vosotros? o yo? :mrgreen: El caso es que se enciende el led en cuestion, pero no varia la señal (seguramente el hecho de que no tenga implementado ningun pulsador tenga mucho que ver, pero es que quiero que el programa de 0 mensajes y errores antes de proseguir; solo entonces acabare de adaptarlo a mis necesidades)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #17 en: 06 de Septiembre de 2009, 12:57:49 »
No te preocupes por el mensaje, solo indica que te asegures si estas trabajando en el banco correcto a TRISC. Luego la señal PWM sale por el pin RC5, y como el ciclo de trabajo es 0% no debería prenderse el led.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #18 en: 07 de Septiembre de 2009, 16:24:42 »
Bien, yo sigo aqui ensimismado y cegado en mi empeño por que esto vaya de una vez. Me estoy mirando todo cuanto pone en el datasheet (primero el 16f690, y luego me mirare el 16f628 y jugare a "busca las 7 diferencias"  :mrgreen:) y he visto algo interesante, y es un "paso a paso" de lo que hay que hacer. Lo malo es que no se identificar que es lo que he hecho hasta ahora. Ayuda, please? :oops: :oops:

Paso a Paso:

11.3.7 SETUP FOR PWM OPERATION
The following steps should be taken when configuring
the CCP module for PWM operation:
1. Disable the PWM pin (CCP1) output driver by
setting the associated TRIS bit.
2. Set the PWM period by loading the PR2 register.
3. Configure the CCP module for the PWM mode
by loading the CCP1CON register with the
appropriate values.
4. Set the PWM duty cycle by loading the CCPR1L
register and DC1B<1:0> bits of the CCP1CON
register.
5. Configure and start Timer2:
• Clear the TMR2IF interrupt flag bit of the
PIR1 register.
• Set the Timer2 prescale value by loading the
T2CKPS bits of the T2CON register.
• Enable Timer2 by setting the TMR2ON bit of
the T2CON register.
6. Enable PWM output after a new PWM cycle has
started:
• Wait until Timer2 overflows (TMR2IF bit of
the PIR1 register is set).
• Enable the CCP1 pin output driver by clearing
the associated TRIS bit.

Codigo

Código: [Seleccionar]
Reset.
org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
 
; **** Programa Principal ****
org 0x05
Inicio
bsf STATUS,RP0 ; Banco 1
bcf STATUS,RP1  ; -
movlw b'11111011' ; Todo entradas menos una salida
movwf TRISC
bcf STATUS,RP0 ; Banco 0
movlw b'00000110' ; Se selecciona TMR2, preescaler de 1/16.-
movwf T2CON
bsf STATUS,RP0 ; Banco 1
movlw 0x1E ; Senal de 2kHz
movwf PR2
bcf STATUS,RP0 ; Banco 0
clrf CCPR1L ; Ciclo de trabajo 0%
bcf     CCP1CON,6
bcf     CCP1CON,7
bcf CCP1CON,DC1B1
bcf CCP1CON,DC1B0
bsf CCP1CON,CCP1M3 ; Configura modulo CCP modo PWM.-
bsf CCP1CON,CCP1M2
Bucle
btfsc PORTB,decre ; Testea si se quiere reducir CT.-
goto Decrementa
btfsc PORTB,incre ; Testea si se quiere aumentar CT.-
goto Incrementa
goto Bucle
Incrementa
incf CCPR1L,1
call Demora_50ms
goto Bucle
Decrementa
decf CCPR1L,1
call Demora_50ms
goto Bucle
 
 
;**** Demora ****
Demora_50ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x40 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
;..............................................
end

Entiendo que los pasos 2, 3 y 4 ya estan implementados pero, y el resto?  :? siento ser tan pesado, pero me interesa mucho entenderlo...y soy un poco cerrado con estas cosas, sobretodo hasta que no empiezo a entender algo! :mrgreen:

Saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #19 en: 07 de Septiembre de 2009, 21:13:15 »
Bueno, te comento de nuevo, el pin donde se obtiene la señal PWM es RC5, osea que debes cambiar la configuración del TRISC.

Luego los pines RB0 a RB3 no están implementados, así que los más sencillos de utilizar serian RB6 y RB7, si utilizas otros debes tener en cuenta de configurar correctamente los comparadores o el conversor analógico. Cambiando eso seguro que ese código funciona  ;-)



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #20 en: 10 de Septiembre de 2009, 17:59:38 »
Y una vez mas, volvemos al ataque (y una vez mas, tras infinidad de intentos infructuosos, y me empiezo a plantear ya tirar la toalla porque debe de ser que soy tonto y no llego). A ver, mi problema esta claro que no es tanto con el codigo como lo es con la configuracion del pwm del pic.

Veamos, poco a poco y buena letra. Por partes (es el paso a paso que pone el datasheet que hay que seguir para generar una pwm normal; no el "enhanced"):

1. Disable the PWM pin (CCP1) output driver by
setting the associated TRIS bit.

Entiendo que lo que debo hacer aqui es desactivar (poner a 0) RC5, puesto que es el pin asociado a CCP1. Si es asi, deduzco que seria hacer un BCF de dicho pin en el portc, me equivoco? o debo de cambiar algun valor desde el TRISC?.

2. Set the PWM period by loading the PR2 register.

Nada que aclarar, tan solo hay que cargar el periodo deseado en el registro PR2.

Código: [Seleccionar]
bsf STATUS,RP0 ; Banco 1
movlw 0x1E ; Senal de 2kHz
movwf PR2
bcf STATUS,RP0 ; Banco 0

3. Configure the CCP module for the PWM mode
by loading the CCP1CON register with the
appropriate values.

Aqui empieza lo bueno. Esta claro que tengo que modificar los bits en CCP1CON, pero no se a que se refieren!. CCP1RL son los MSB's del duty, DCB1 y DCB0 los LSB's, y el resto de bits no tengo muy claro si debo o no activarlos (seguramente la mayoria de mis errores se hallan aqui)

4. Set the PWM duty cycle by loading the CCPR1L
register and DC1B<1:0> bits of the CCP1CON
register.

Aqui no hay duda, tal y como he comentado antes. Los MSB's a CPR1L y los LSB's a DCB <1:0>. Todo y que no lo tengo implementado aun, entiendo que no es mas que un par de mov a la manera tradicional para poner los valores deseados en los registros pertinentes.

5. Configure and start Timer2:
• Clear the TMR2IF interrupt flag bit of the
PIR1 register.
• Set the Timer2 prescale value by loading the
T2CKPS bits of the T2CON register.
• Enable Timer2 by setting the TMR2ON bit of
the T2CON register.

Todo esto no entiendo bien de que va, ya que usa bits que en ningun lado del apartado PWM se comentan, e incluso en el codigo de Suky juraria que no hay nada parecido.

6. Enable PWM output after a new PWM cycle has
started:
• Wait until Timer2 overflows (TMR2IF bit of
the PIR1 register is set).
• Enable the CCP1 pin output driver by clearing
the associated TRIS bit.

Mas de lo mismo. Es un proceso un tanto ilogico que no consigo entender por mas que me lo mire. Me he estudiado el datasheet decenas de veces y sigo sin entender que tengo y que no tengo que hacer para generar un misero pwm!.

Por otra parte he estado haciendo pruebas con el 16F84A para hacer un pwm artesanal y funciona bien, pero el codigo es tan sumamente inmenso que lo veo ridiculo. Ademas, el efecto no es el mismo ni remotamente, asi que hasta que ya tire la toalla oficialmente, me gustaria seguir intentandolo con el 16F690. Por favor, lo pido desde la mas absoluta desesperacion, AYUDA  :( :( :(

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #21 en: 10 de Septiembre de 2009, 18:08:37 »
 :8} Yo ya probé (en proteus) el código que tu posteaste anteriormente cambiando el pin correspondiente (RC5) y funciona  :?
No contesto mensajes privados, las consultas en el foro

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #22 en: 10 de Septiembre de 2009, 18:34:52 »
¿??? lo probaste tal cual y funciona???? :shock: ESTE codigo???? porque a mi no me va ni a la de tres! :(

Código: [Seleccionar]
;/////////////////////////////////
;**** Inicio del Micro ****
Reset.
org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
 
; **** Programa Principal ****
org 0x05
Inicio
bsf STATUS,RP0 ; Banco 1
bcf STATUS,RP1  ; -
movlw b'11101111' ; Todo entradas menos una salida
movwf TRISC
bcf STATUS,RP0 ; Banco 0
movlw b'00000110' ; Se selecciona TMR2, preescaler de 1/16.-
movwf T2CON
bsf STATUS,RP0 ; Banco 1
movlw 0x1E ; Senal de 2kHz
movwf PR2
bcf STATUS,RP0 ; Banco 0
clrf CCPR1L ; Ciclo de trabajo 0%
bcf     CCP1CON,6
bcf     CCP1CON,7
bcf CCP1CON,DC1B1
bcf CCP1CON,DC1B0
bsf CCP1CON,CCP1M3 ; Configura modulo CCP modo PWM.-
bsf CCP1CON,CCP1M2
Bucle
goto Incrementa
goto Bucle
Incrementa
incf CCPR1L,1
call Demora_50ms
goto Bucle
 
;**** Demora ****
Demora_50ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x40 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
;..............................................
end

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #23 en: 10 de Septiembre de 2009, 18:45:37 »
Citar
[/qmovlw   b'11101111'   ; Todo entradas menos una salida
   movwf   TRISC
uote]

Yo creo que lo que TE dice Suki esta aqui, pones de salida RC4 Y no RC5, corre el 0 una posicion a la izquierda.

tapi8

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #24 en: 10 de Septiembre de 2009, 18:58:07 »
Error garrafal, y eso que desde que me lo dijo suky lo cambie (mal, esta claro) y no lo he vuelto a mirar. Error mio, lo siento.  :(

Peeeero...sigue sin funcionar! estoy seguro de que algo mas tiene que fallar, algo tan basico que un novato como yo no consigue ver, y vosotros, mas veteranos, si. Yo estoy grabando EXACTAMENTE lo que pone en el codigo (con su correspondiente cabecera, naturalmente).

Código: [Seleccionar]
; PICkit 2 Lesson 1 - 'Hello World'
;
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
org 0

;**** Definicion de variables ****
Contador1 equ 0x20 ;
Contador2 equ 0x21 ;

decre equ 0 ; Pulsador para decrementar Ciclo de Trabajo
incre equ 1 ; Pulsador para incrementar Ciclo de Trabajo


;/////////////////////////////////
;**** Inicio del Micro ****
Reset.
org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
 
; **** Programa Principal ****
org 0x05

No me da ningun error, pero no va  :(

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #25 en: 10 de Septiembre de 2009, 19:01:52 »
Yo cambie el tris como te indican y seleccione para los pulsadores los pines RB6 y RB7. No me acuerdo haber hecho otro cambio  :tongue:
No contesto mensajes privados, las consultas en el foro

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #26 en: 10 de Septiembre de 2009, 19:18:21 »
Veras, es que el caso es que yo no necesito los pulsadores (almenos no ambos), y es muy probable que sea parte del problema en mi codigo. Mi idea es la de hacer que un led se encienda poco a poco...y se mantenga encendido mientras llegue una señal positiva de control. En el momento en el que esta pase a 0, se apague poco a poco. Se usara en un coche, asi pues esa "señal de control" sera el contacto. Una vez el contacto se active, se encendera poco a poco, y en cuanto el usuario retire la llave, debe apagarse de la misma manera. Quiza esta puntualizacion ayude mucho a "aligerar" el codigo.


Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #27 en: 10 de Septiembre de 2009, 19:28:41 »
Citar
decre   equ      0   ; Pulsador para decrementar Ciclo de Trabajo
   incre   equ      1   ; Pulsador para incrementar Ciclo de Trabajo


No he seguido el hilo de cerca y no trabaje nunca con el 16f690, pero has cambiado esto?

Desconectado MADKazuya

  • PIC10
  • *
  • Mensajes: 39
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #28 en: 10 de Septiembre de 2009, 19:32:53 »
No, eso es del codigo original de suky. Entiendo que tras cada pulsacion de uno u otro pulsador incrementaba o decrementaba el pwm. Por eso digo que es muy probable que la implementacion de los dos pulsadores este afectando mucho el resultado final para lo que yo deseo.

De todos modos, si os fijais he hecho un pequeño ajuste que, en teoria, hace que el programa no dependa de pulsador alguno.

Código: [Seleccionar]
Bucle
goto Incrementa
goto Bucle
Incrementa
incf CCPR1L,1
call Demora_50ms
goto Bucle

Al final del programa sencillamente aumenta sin cesar el duty, y lo hace cada 50ms, con lo que el led deberia de ir ganando intensidad sin parar hasta llegar al 100 de duty.
« Última modificación: 10 de Septiembre de 2009, 19:39:43 por MADKazuya »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: 16f690 y PWM...no consigo entenderlo!
« Respuesta #29 en: 10 de Septiembre de 2009, 19:52:56 »
Citar
Yo cambie el tris como te indican y seleccione para los pulsadores los pines RB6 y RB7. No me acuerdo haber hecho otro cambio 

fijate lo que te pone aqui, yu los pones en RB0 Y RB1 que por lo que decis no estan implementados en este PIC, cambia equ  0 y equ  1 por 6 y 7 asi es como dice Suki que le funciona.


 

anything