Autor Tema: USO de MPLAB IDE (compilador xc8)+Proteus Y función Delay10KTx()  (Leído 3073 veces)

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

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
USO de MPLAB IDE (compilador xc8)+Proteus Y función Delay10KTx()
« en: 28 de Diciembre de 2014, 18:41:42 »
Hola, hay muchos post sobre este tema, pero siempre me queda una cosa colgando, y no se en que fallo.. si es que fallo. Me explico.
Tengo: cristal de 20MHz/ Pic 18F4550. Quiero usar la salida USB ( va a 48 MHz) y asimismo usar un cristal interno para que vaya también a 48MHz la frecuencia de programa.
Cosas que tengo hechas , los fuses o configuration bits:
Código: C
  1. #pragma config PLLDIV = 5       // PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))
  2. #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
  3. #pragma config USBDIV = 2       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)
  4. #pragma config FOSC = HSPLL_HS  // Oscillator Selection bits (HS oscillator, PLL enabled (HSPLL))

el esquematico muestra lo que quiero:


 y el archivo c es :
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <xc.h>
  4. #include <pic18f4550.h>
  5. #include <delays.h>
  6. #include "configuration_bits.h"
  7.  
  8.  
  9. #define _XTAL_FREQ 20000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
  10. #include <xc.h>
  11. void retardo_1seg(void);
  12. //int main(int argc, char** argv) {
  13.  
  14. int main(void) {
  15.     TRISD = 0b00000000; // Configuro puerto B como salidas
  16.     while (1) // Bucle infinito
  17.     {
  18.         PORTDbits.RD0 = 0; // Apago pin RB0
  19.         retardo_1seg();
  20.        
  21.        
  22.         PORTDbits.RD0 = 1; // Enciendo pin RB0
  23.         retardo_1seg();
  24.        
  25.     }
  26.     // return (EXIT_SUCCESS);
  27.     return 0;
  28. }
  29.  
  30. void retardo_1seg(void) {
  31.     Delay10KTCYx(200);
  32.     Delay10KTCYx(200);
  33.     Delay10KTCYx(200);
  34.     Delay10KTCYx(200);
  35.     Delay10KTCYx(200);
  36.     Delay10KTCYx(200);
  37.    
  38. }

Según los calculos dados, para hacer un delay de 1 segundo he de usar la función de ese modo.
Las dudas:

1. En #define _XTAL_FREQ 20000000 se pone la frecuencia del CRYSTAL, y no la de uso de la CPU.Cierto? Por que si no... para que estan los "configuration bits"... Asumo que si...pero no estoy 100 % seguro.

2. Ya en proteus, el Processor clock frequency... se remite a la frecuencia de uso en el programa ? (en mi caso quiero CPU = 48 Mhz, como uso tambien del USB), o sea, 48 MHz...o he de poner lña frecuencia del oscilador, del crystal externo.

La segunda pregunta es la que me tiene realmente mosqueado, porque creo que se ha de poner la freq. del CRYSTAL (20 Mhz en este caso). Pero solo me sale  1 seg. si pongo 48MHz.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: USO de MPLAB IDE (compilador xc8)+Proteus Y función Delay10KTx()
« Respuesta #1 en: 28 de Diciembre de 2014, 19:18:13 »
1- No, en realidad lo que se pone es la frecuencia de entrada, en este caso 48Mhz, creo que esta definido (el nombre) como XTAL_FREQ por hay muchos que no poseen PLL. Lo que va a aqui es lo que llama en el datasheet Fosc ( Frecuencia de oscilacion ) pensalo como un cristal de 48Mhz conectado a la entrada.

El programa de delay necesita de este valor para poder calcular la cantidad de ciclos a contar donde cada ciclo es Tcy = 4 / Fosc, y es parte de la funcion de delays. Se podria hacer dependiente de los bits de configuracion pero creo que seria mas problema para el compilador, donde tiene que recordar ademas si tienen PLL, la formula de cada uno, etc. En cambio asi solo depende de esta constante.

Delay10KTCYx()
esta la funcion __delay_ms() tambien,
es un poco mas intuitivas que 10.000 Tcy ( con la funcion __delay_ms() calcula el tiempo con la constante XTAL_FREQ asi sabe la cantidad de ciclos a contar y luego ejecuta lo demas, con Delay10KTCYx no deberia ya que se aseguraria de lograr los x * 10000 TCY )

2-
Si el proteus le podes la frecuencia de oscilacion que seleccionaste (48Mhz). Imagino que es el clock que va a la CPU el que se debe cargar ya que el USB no hay muchas opciones mas que funcione a esa velocidad.


PD: Gran manejo del paint xD
« Última modificación: 28 de Diciembre de 2014, 19:20:34 por KILLERJC »

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: USO de MPLAB IDE (compilador xc8)+Proteus Y función Delay10KTx()
« Respuesta #2 en: 30 de Diciembre de 2014, 07:42:01 »
Jaja! No subestimes al pequeño Paint! :D
Bueno siguiendo tu indicación, he cambiado  XTAL_FREQ a 48MHz y en proteus tambien 48 MHz. Y el tiempo está clavado, 1 segundo de apagado, y 1 segundo de encendido

[/url]

Pero... si pongo XTAL_FREQ a 20MHz ( y mantengo en Proteus la freq. de oscilacion a 48 MHz) me salen los mismos tiempos. Por eso..la simulacion no es real...Proteus es quien impone aqui la frecuencia de oscilacion.

[/url]


Se deberia cargar configuration bits y programa directamente en Proteus (en ASM) pues..?

Ah, respecto la funcion __delays_ms() ya la he usado, pero se desborda....no es delayms() como en el compilador CCS...no es tan facil... o almenos a mi con xc8 me ha dado problemas que con CCS no tenia...asi que he usado Delay10KTCx()...horrorosa..por otra parte...
« Última modificación: 30 de Diciembre de 2014, 07:46:40 por PICYO »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: USO de MPLAB IDE (compilador xc8)+Proteus Y función Delay10KTx()
« Respuesta #3 en: 30 de Diciembre de 2014, 10:39:32 »
Si la funcion __delay_ms() tiene un limite de :

Citar
must be a constant and less than approximately 179,200 for PIC18 devices and approximately 50,659,000 for other devices.

esas cantidades de ciclos xD, imagino que el ultimo valor debe ser para micros de 16 y 32 bits.



Es correcto el funcionamiento en la simulacion de Proteus, como dije o no se si me exprese mal, los que usan el XTAL_FREQ son las funciones __delay_ms() y __delay_us() , en estas usan el valor dado del cristal para calcular la cantidad de ciclos y asi usar las funciones esas de esperar 10k de ciclos o 1k o ciclos. Si vas a usar estas funciones entonces ahi SI va a cambiar la frencuencia. Ciclos = Tiempo * XTAL_FREQ / 4

Ahora si vas a esperar 200 * 10k de ciclos va a depender unicamente de la frecuencia de operacion del micro ( 48Mhz ) y no del valor de XTAL_FREQ por que no se usa para calcular nada ( antes calculabas los ciclos con eso, ahora se los estas dando vos mismo a los ciclos, no es necesario calcularlos).

Es por eso que no varia en tu simulacion el delay variando el XTAL_FREQ, si quisieras verlo variar por modificar esta variable entonces usa las funciones que nombre.
Cabe destacar que XTAL_FREQ no es una condicion o exigencia hacia el microcontrolador es un valor definido como cualquier otra que puedo crear usando la directiva #define
#define PI 3.1416
Reemplazando el compilador cualquier PI por 3.1416

El delay maximo que podes lograr con __delay_ms a 48Mhz es de 14.9mS ( 179200 ciclos), asi que podrias hacer uno de 10ms y que entre 100 veces. Asi da 1 segundo. Y podes probar cambiando el valor de XTAL_FREQ, poniendolo en 24Mhz deberia cambiar cada 0.5s. Y si se te ocurre cambiar la frec de simulacion a 24Mhz entonces vas a tener un cambio cada 2seg. Esto es solo a modo de prueba.



Proteus por mas que le pongas un cristal va a hacer caso a la frecuencia puesta en la configuracion del micro. Creo que lo unico que simula es el WDT, no se si otra cosa mas de los FUSES.
« Última modificación: 30 de Diciembre de 2014, 23:13:25 por KILLERJC »


 

anything