Autor Tema: calcular pwm  (Leído 31646 veces)

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

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Re: calcular pwm
« Respuesta #15 en: 15 de Julio de 2015, 00:53:41 »
Claro! entiendo... En algun lugar de mi gran cabeza habia algo que me decía que tenia que ver con eso mismo, la comparación entre un valor de 8 bits contra uno de 10 bits. De principio intuía la misma relación que haces vos con el pre-escalar en 1:1. Pero lo impresionante es que hiciste las otras deducciones en la dirección correcta! Mientras que yo las intentaba hacer en la dirección opuesta y no entendía por que esos dos ultimos bits me cambiaban de valor tan rápidamente!! :z) . en otras palabras, mientras que vos dividís la frecuencia FOSC yo intentaba multiplicarla, se entiende?. Pero claro haciendo lo que vos, ese factor "4" desaparece siempre... Mil gracias!
Lo mismo con la fórmula, intentaba ir al reves pero claro, nunca iba a llegar a la tésis partiendo desde algo equivocado ya que no tenía claro que pasaba con ese maldito 4!
Clarísimo...
Ahora, una última duda, entiendo que FOSC no es directamente la frecuencia del cristal conectado a OSC1 y OSC2 ¿no es asi?. Si no que FOSC es la frecuencia que llega finalmente al CPU despues de pasar por algunos PLL y pre-escalares. Es decir, en mi caso tengo un cristal de 20MHz. pero como uso el PIC con Bootloader, éste configura los preescalares para obtener una frecuencia de 48MHz en el módulo USB y viendo el código del Bootloader, hace llegar esa misma frecuencia al CPU. Finalmente FOSC en el timer2 es en mi caso 48MHz?
Además intuyo que ese "4" en FOSC/4 se debe a que cada cuatro ciclos de reloj se da una ejecución. Por eso insisto en que FOSC es 48MHz en mi caso.

Mil Gracias! SALUDOS!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: calcular pwm
« Respuesta #16 en: 15 de Julio de 2015, 03:36:08 »
Si pensalo de esta forma... Fosc siempre se le llamo a la frecuencia que ingresa al core y luego se divide por 4 (O sea la frecuencia antes de la ultima etapa que se divide por 4 para lso modulos). Puede ser un cristal, un reloj externo o puede ser como es en el caso de este PIC, en el que posee un PLL interno y luego preescaler, entonces lo que entra al PIC vendria a ser justo esos 48Mhz que estas nombrando, eso es Fosc, luego cuando se divide por 4, la nomeclatura de Microchip fue siempre Fcy (Fosc/4) y el inverso Tcy (4/Fosc)

Y si el 4 se debe al pipeline y algo mas de la arquitectura. ya que si fueramos rigurosos, solo bastaria 1 ciclos ( suponiendo que utiliza 1/2 ciclo para cada etapa, busqueda y ejecucion), por eso la gran pelea de algunos otros usuarios de otros micros en el que sus instrucciones o modulos se terminan ejecutando en Fosc y no Fosc/4. Por ejemplo en los Atmega sus instrucciones se realizan en 1 ciclo de reloj ( es decir en Tosc ), pero bueno, tambien tienen otro "formato" de memoria respecto a los PIC16, y es mas parecido a un PIC24 o dspic, y luego tenes otra forma de operar con los datos, lo cual para algunas cosas se hacen mejores en uno que otro. ( PD: eso me recuerda algun dia ponerme con los atmega en ASM :) )

Ejemplo para sumar 2 valores en PIC seria algo asi:

1er valor en registro VALOR1
2do valor literal VALOR2

PIC (suponiendo PIC16 y que estoy en el banco ese de RAM):

MOVF VALOR2         ; W = Valor2
ADDWF VALOR1,F    ; Valor1 = Valor2 + Valor1

ATmega ( recien me puse a ver su set y puede que le este errando feo)

valor1 = direccion 0x0060
valor2 = direccion 0x0061

;Carga del valor en un registro de trabajo, esto puede ser directo o indirecto, expongo caso de indirecto y que esten seguidos valor1 y 2 ( cosa que no importa en el PIC )
ldi r27,$00                              (1) ciclo
ldi r26,$60   ;apunto direccion 0x0060     (1) ciclo
ld  r0,X+      ; Pongo el valor en r0 e incremento X, quedando en 0x0061, (2) ciclo
ld  r1,X        ; en R1 pongo lo de 0x0061 (1) ciclo
add r0,r1     ; r0 = r0 + r1 (1) ciclo
st -X,r0        ; Procede a decrementar ( X = 0x0060 ) y guardar en la RAM, (2) ciclo

Y tuvimos justamente 8 ciclos de reloj o que es igual que el PIC. Y si digamos que queremos un equivalente podemos usar el PIC18

LFSR 2,0060          ; direccion (2) ciclos
MOVF POSTINC2,W  ; W= Valor2 y FSR2 +1 (1) ciclos
ADDWF INDF2,F      ; Valor1 = Valor2 + Valor1 (1) ciclos
(Este llevo mucho mas usando indirecto)

Pero obviamente esto no es para todos los casos, si estaba a mano de un acceso directo entonces era distinto, otras operaciones tambien hubieran resultado distinto Por ejemplo el PIC18 tiene resta con literales en su set extendido de instrucciones. Es decir depende de lo que sea necesario hacer, alguno va a tener una ventaja o no respecto al otro. Por otro lado, el PIC16 tiene creo que 23 instrucciones, mientras que el atmega tiene Muchisimas mas.
« Última modificación: 15 de Julio de 2015, 07:25:09 por KILLERJC »

Desconectado gabrielnbr89

  • PIC10
  • *
  • Mensajes: 10
Re: calcular pwm
« Respuesta #17 en: 15 de Julio de 2015, 15:23:06 »
Clarísimo! muchas gracias! ((:-))