Reloj interno del pic 18f2550

Porfavor como puedo configurar el reloj interno del pic 18f2550 a 48 MHz utilizando el Proton Basic, es para conexion USB 2.0
 
Éstas son las configuraciones que se usan para obtener los 48MHz para el módulo USB.

Con un cristal de 4MHz.
Código:
; Palabra de configuración
Config_Start
    FOSC=XTPLL_XT,USBDIV=2,PLLDIV=1,VREGEN=On,PBADEN=OFF
    FCMEN=OFF,IESO=OFF,PWRT=On,WDT=OFF,LVP=OFF
Config_End
;*******************************************************************************
Xtal 48MHz                      ; Definir una frecuencia de 48MHz. (CPU Core)
Con un cristal de 8MHz.
Código:
; Palabra de configuración
Config_Start
    FOSC=HSPLL_HS,USBDIV=2,PLLDIV=2,VREGEN=On,PBADEN=OFF
    FCMEN=OFF,IESO=OFF,PWRT=On,WDT=OFF,LVP=OFF
Config_End
;*******************************************************************************
Xtal 48MHz                      ; Definir una frecuencia de 48MHz. (CPU Core)
A partir de aquí ya solo vas cambiando el factor de división del PLL.
Cristal de 12MHz. = PLLDIV=3
Cristal de 16MHz. = PLLDIV=4
Cristal de 20MHz. = PLLDIV=5
Cristal de 24MHz. = PLLDIV=6
Cristal de 40MHz. = PLLDIV=10

Suerte.
 
Porfavor como puedo configurar el reloj interno del pic 18f2550 a 48 MHz utilizando el Proton Basic, es para conexion USB 2.0

Si te refieres al oscilador interno de 8Mhz del PIC... no se puede, si vez la hoja de datos te darás cuenta que si activas el oscilador interno solo puede ir al CPU y periféricos. Para el USB tiene que ser si o si oscilador externo y la configuración es como se menciona @d-rkbytes
 
Hola, alguien me puede decir que le modifico a mi código para que trabaje con el oscilador interno

Encontre esto en la dcumentacion del ccs

////////////////////////////////////////////////////////////////// INTERNAL RC
// Constants used in setup_oscillator() are:
#define OSC_31250 0x8000
#define OSC_PLL_ON 0x4000
#define OSC_PLL_OFF 0
#define OSC_31KHZ 0
#define OSC_125KHZ 0x10
#define OSC_250KHZ 0x20
#define OSC_500KHZ 0x30
#define OSC_1MHZ 0x40
#define OSC_2MHZ 0x50
#define OSC_4MHZ 0x60
#define OSC_8MHZ 0x70

Código:
#include <18F2550.h>
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,NOVREGEN
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
#define LCD_DATA_PORT getenv("SFR:PORTB")
#include <lcd.c>


unsigned int8 value_IR;
unsigned int8 value_red;
unsigned int8 value_blue;

void main()
{

lcd_init();
set_tris_A(0b1110011);
set_tris_B(0);
setup_adc_ports(AN0_TO_AN1|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(10);

while(true)
{
   
   value_IR = read_adc();
   

}
 
Algo que NO responde la pregunta de Edwar09 pero que se relaciona con lo hablado más arriba.
Para usar USB no se puede utilizar un oscilador interno, porque no tienen la precisión necesaria. Hace falta un cristal externo, que ni siquiera tiene que ser de gran exactitud (no hace falta que sea de 10ppm, con uno de 40 ppm ya alcanza).
Los osciladores internos de los micros (pics, msp430, otros no sé) andan en el orden del 1%, que no es suficientemente bueno para USB 1.0/2.0 (de 3.0 no digo porque no sé).
 
Hola, ¿Alguien me puede decir que le modifico a mi código para que trabaje con el oscilador interno?
Utiliza esta palabra de configuración para usar el oscilador interno a 8MHz:
Código:
#fuses   NOFCMEN,NOIESO,NOBROWNOUT,PLL2,CPUDIV1,NOUSBDIV,NOVREGEN
#use     delay(internal = 8Mhz)
En el void main usa esto: setup_oscillator (OSC_8MHz | OSC_STATE_STABLE);

El oscilador interno puede trabajar a estas frecuencias:
8 MHz, 4 MHz, 2 MHz, 1 MHz, 500 kHz, 250 kHz, 125 kHz y 31 kHz.

Saludos.
 
Utiliza esta palabra de configuración para usar el oscilador interno a 8MHz....

Ok aunque yo lo hice solo asi..

Código:
#include <18F2550.h>
#fuses INTRC,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,NOVREGEN
#use delay(clock=4000000)

Solo cambie el fuse HS por el fuse INTRC y con eso ya especificas que usaras el oscilador interno y solo basta con poner una velocidad valida en el clock y no use el set_up ni otra cosa.

Aunque me gustaría saber si con la forma que usted lo hizo puedo configurar mas cosas
o es mejor o que :LOL:
pero de todos modos gracias
 
Última edición:
Ok aunque yo lo hice solo asi..

Código:
#include <18F2550.h>
#fuses INTRC,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,NOVREGEN
#use delay(clock=4000000)
Solo cambie el fuse HS por el fuse INTRC y con eso ya especificas que usaras el oscilador interno y solo basta con poner una velocidad valida en el clock y no use el set_up ni otra cosa.

Aunque me gustaría saber si con la forma que usted lo hizo puedo configurar mas cosas
o es mejor o que :LOL:
pero de todos modos gracias
Como lo hice es tan solo otra forma, si te fijas, en #use delay(options) selecciono "internal"
Con esta declaración se está indicando que se usará el oscilador interno y a que frecuencia trabajará.
Aparte omito algunos fuses, porque algunos tienen el valor necesario por defecto.
Por ejemplo; NOPROTECT y NODEBUG tendrán el mismo efecto en la palabra de configuración si no los pones.

Éstos son los valores que obtendrás con la palabra de configuración que usaste para 4MHz.
Edwar09.jpg

Y éstos son los valores con la palabra de configuración que yo usé para 4MHz.
D@rkbytes.jpg

Si te fijas, son similares y ambas funcionan, aunque existen algunas diferencias entre los valores.

Saludos.
 
Éstas son las configuraciones que se usan para obtener los 48MHz para el módulo USB.

Con un cristal de 4MHz.
Código:
; Palabra de configuración
Config_Start
    FOSC=XTPLL_XT,USBDIV=2,PLLDIV=1,VREGEN=On,PBADEN=OFF
    FCMEN=OFF,IESO=OFF,PWRT=On,WDT=OFF,LVP=OFF
Config_End
;*******************************************************************************
Xtal 48MHz                      ; Definir una frecuencia de 48MHz. (CPU Core)
Con un cristal de 8MHz.
Código:
; Palabra de configuración
Config_Start
    FOSC=HSPLL_HS,USBDIV=2,PLLDIV=2,VREGEN=On,PBADEN=OFF
    FCMEN=OFF,IESO=OFF,PWRT=On,WDT=OFF,LVP=OFF
Config_End
;*******************************************************************************
Xtal 48MHz                      ; Definir una frecuencia de 48MHz. (CPU Core)
A partir de aquí ya solo vas cambiando el factor de división del PLL.
Cristal de 12MHz. = PLLDIV=3
Cristal de 16MHz. = PLLDIV=4
Cristal de 20MHz. = PLLDIV=5
Cristal de 24MHz. = PLLDIV=6
Cristal de 40MHz. = PLLDIV=10

Suerte.

Esta configuracion es solo para la configuracion de los modos del oscilador y el funcionamiento del USB verdad ?
Como seria la configuracion si quiero modificar el control del oscilador solamente? porque tengo desabilitado el modo USB

Tengo un 18F4550 conectado a un cristal de 4MHz pero el funcionamiento del micro es muy lento. Segun lei en la hoja de datos del micro, los comentarios del foro y de D@rkbytes. Para configurar el oscilador tengo que acceder al los registros de configuracion OSCCON y OSCTUNE pero no estoy entendiendo como hacerlo, como me lo explica la hoja de datos. :confused:


Otra consulta. En un 18F, cuando se utiliza un oscilador externo. Se debe conectar solo una pata del oscilador al micro (OSC1) y la otra del micro queda libre (OSC2)? (imagen adjunta - hoja de datos)

Muchas gracias!!



Perdón. :estudiando: Creo que la pata del micro (OSC2) queda libre cuando estoy en modo HS. Y en mi caso al utilzar un cristal de 4 MHz, estoy en XT. :eek:hno:
 

Adjuntos

  • Sin título.png
    Sin título.png
    6.1 KB · Visitas: 5
Última edición:
Hola, tienes una confusión...

Oscilador externo (External clock) no indica "cristal", este modo solo utiliza la entrada OSC1 inyectando una señal cuadrada de otro circuito oscilante.
Los modos XT, HS y HSPLL usan cristal ocupando las lineas OSC1 OSC2.
Los modos INT y derivados usan el oscilador interno.

Incluye un multiplicador de frecuencia, se puede usar o no y son con la terminación PLL.

Guíate con el diagrama en la configuración de la oscilador (OSCILLATOR
CONFIGURATIONS pag.24 del datasheet), hay varios caminos para seleccionar la freq. adecuada.

Saludos.
 
¿Esta configuración es sólo para la configuración de los modos del oscilador y el funcionamiento del USB verdad?
Sí, aunque también existe la posibilidad de no usar el módulo USB.
¿Cómo sería la configuración si quiero modificar el control del oscilador solamente?
Porque tengo deshabilitado el modo USB.
Eso depende del modo y frecuencia que requieras.
Tengo un 18F4550 conectado a un cristal de 4 MHz, pero el funcionamiento del micro es muy lento.
Según leí en la hoja de datos del micro, los comentarios del foro y de D@rkbytes.
Para configurar el oscilador tengo que acceder al los registros de configuración OSCCON y OSCTUNE, pero no estoy entendiendo cómo hacerlo, como me lo explica la hoja de datos. :confused:
Eso se debe a una mala selección de bits en la palabra de configuración.
Al no ser correcta se pone en funcionamiento el Fail-Safe Clock Monitor (FCMEN) y entra en acción el oscilador interno.
Si el registro OSCCON no está configurado, la frecuencia por defecto en el POR (Power On Reset) será de 1 MHz.
Ahora, si el bit FCMEN está desactivado y la palabra de configuración no es correcta, el microcontrolador no hará nada porque ninguno de los osciladores estará funcionando.
El registro OSCTUNE sirve para ajustar la frecuencia del oscilador interno.
Otra consulta. ¿En un 18F, cuando se utiliza un oscilador externo.
Se debe conectar solo una pata del oscilador al micro (OSC1) y la otra del micro queda libre (OSC2)?
Sí, pero eso depende de la configuración de los bits FOSC3:FOSC0
Por ejemplo:
0101 = EC Oscillator CLKO function on RA6 (EC)
Perdón. :estudiando: Creo que la pata del micro (OSC2) queda libre cuando estoy en modo HS.
Y en mi caso al utilizar un cristal de 4 MHz, estoy en XT. :eek:hno:
Cuando usas el oscilador con un cristal, el pin RA6 (CLKO) siempre será la salida del oscilador.
El fuse XT es para cristales de hasta 4 MHz y el fuse HS es para cristales de hasta 48 MHz.
Para obtener los 48 MHz requeridos por el módulo USB, no se puede usar cualquier cristal.
Ver hoja de datos, sección; 2.3 (Oscillator Settings for USB)
En el modo de oscilador interno, el pin RA6 puede ser usado como un pin E/S
 
Perfecto. Gracias a los dos. (y)

A ver si entiendo…….

Los relojes a los que se refiere todo el tiempo en la hoja de datos (primario, secundario e interno) son los que están dentro del micro. Y también se puede agregar uno periférico, que en mi caso es un cristal de 4MHz.

Entonces, al configurar el OSCCON lo que estoy configurando son los 3 relojes que trae el micro y que el cliente debe configurar de acuerdo a sus prestaciones. NOTA: Es por eso que en mi caso, al no configurar nada, por más que tenga conectado de forma periférica un oscilador de 4MHz el micro se está ejecutando a 1 MHz hasta el punto que a veces se reinicia solo.

Bien. Como quiero utilizar solo el oscilador periférico y apagar los relojes internos (del CPU). Lo que voy hacer es utilizar el modo “PRI_IDLE MODE” configurando el OSCCON de esta forma OSCCON = %1110100
1 – Ejecuto el modo IDLEN y la instrucción SLEEP al poner un 1 en el bit 7,
2 – Al bit 1 y bit 0, les doy los valores 00 para utilizar el modo PRI_IDLE.

Código:
Device 18F4550 
Declare Onboard_USB No 

; Palabra de configuración
Config_Start
    FOSC=XT_XT,USBDIV=2,PLLDIV=1,VREGEN=On,PBADEN=OFF
    FCMEN=OFF,IESO=OFF,PWRT=On,WDT=OFF,LVP=OFF
Config_End
;*******************************************************************************
Xtal 4MHz                      ; Definir una frecuencia de 48MHz. (CPU Core)
OSCCON = %11100000


No se como asignarle el valor 0 a los FOSC3:FOSC3. :cabezon:

No se que les parece si hago eso..



El problema es que cuando simulo en Proteus, me dice que la simulacion no ocurre en tiempo real porque se excede el CPU..


Otra cosa, encontre un pdf. de microchip que contiene todos las modificaciones en la configuracion de los PIC18F.

Adjunto la imagen de lo que me aparece en Proteus y el material que encontré por si le resulta útil a alguien.
 

Adjuntos

  • Sin título88.jpg
    Sin título88.jpg
    46.6 KB · Visitas: 6
  • 18F4550 - Fuses ConfigSet.pdf
    2.4 MB · Visitas: 12
Última edición:
Los relojes a los que se refiere todo el tiempo en la hoja de datos (primario, secundario e interno) son los que están dentro del micro.
Y también se puede agregar uno periférico, que en mi caso es un cristal de 4MHz.
Pues si, el interno LFOSC, (31 KHz/31.25 KHz) sirve para el modo de reposo, es decir, cuando el microcontrolador es puesto en bajo consumo (Sleep) y queda en espera de una interrupción para despertar.
Como el oscilador principal consume más corriente, es por eso que se tiene la opción de qué oscilador quedará funcionando cuando el microcontrolador entre en modo de reposo.
Entonces, al configurar el OSCCON lo que estoy configurando son los 3 relojes que trae el micro y que el cliente debe configurar de acuerdo a sus prestaciones.
NOTA: Es por eso que en mi caso, al no configurar nada, por más que tenga conectado de forma periférica un oscilador de 4MHz el micro se está ejecutando a 1 MHz hasta el punto que a veces se reinicia solo.
No. El registro OSCCON sirve para seleccionar la frecuencia del oscilador interno, entre otros parámetros.
Bien. Como quiero utilizar solo el oscilador periférico y apagar los relojes internos (del CPU).
Lo que voy hacer es utilizar el modo “PRI_IDLE MODE” configurando el OSCCON de esta forma OSCCON = %1110100
1 – Ejecuto el modo IDLEN y la instrucción SLEEP al poner un 1 en el bit 7,
2 – Al bit 1 y bit 0, les doy los valores 00 para utilizar el modo PRI_IDLE.
Entonces no realices la configuración del registro OSCCON y desactiva el fuse FCMEN
Si la palabra de configuración es correcta para usar cristal o un oscilador externo, el microcontrolador deberá funcionar sin problemas.
Y como está inactivo el fuse FCMEN (Fail-Safe Clock Monitor) el oscilador interno no entrará en funcionamiento.
Por lo tanto, si la palabra de configuración no es correcta, el microcontrolador quedará inactivo.
No se como asignarle el valor 0 a los FOSC3:FOSC0. :cabezon:

No sé qué les parece si hago eso.
Me parece que tienes que leer más la hoja de datos, ya que algunos bits son de sólo lectura.
 
Lei todo el capitulo del datasheet y sigo sin solucionar el problema.

Que frecuencia le tiene que llegar al CPU para funcionar bien? 48MHZ(Fcy)? ¿Es posible llegar a esa frecuencia con el oscilador externo de 4MHz?

Probe configurando el OSCON para utilizar solo el reloj interno y no me funciono, el micro no me prende.

Luego probe apagar el CFMEN para utilizar el oscilador primario y tampoco me funciona.

Alguien tiene el codigo que se necesita para configurarlo ? Creo que el problema es que no se como configurar los registros en proton, como pueden ver, lo que si se usar bien es el paint. Les adjunte una imagen con el camino que quiero tomar para saber si entienden y si es posible realizar lo que quiero.

O si les parece mejor a ustedes que tienen mas experiencia, le saco el cristal y utilizo solo el oscilador interno.
 

Adjuntos

  • Sin títulorer.jpg
    Sin títulorer.jpg
    77.8 KB · Visitas: 13
Última edición:
¿Es posible llegar a esa frecuencia con el oscilador externo de 4MHz?
Con esa frecuencia sí es posible.
Probé configurando el OSCON para utilizar solo el reloj interno y no me funcionó, el micro no me prende.

Luego probé apagar el CFMEN para utilizar el oscilador primario y tampoco me funciona.
Seguramente no estás usando la palabra de configuración correcta.
¿Alguien tiene el código que se necesita para configurarlo?
Creo que el problema es que no sé cómo configurar los registros en proton.
En el post #2 de éste mismo tema se encuentra, y con la sintaxis para Proton.
O si les parece mejor a ustedes que tienen mas experiencia, le saco el cristal y utilizo solo el oscilador interno.
Si no necesitas precisión y tampoco requieres una frecuencia de operación mayor a 8 MHz, sí puedes usar el oscilador interno.
 
A que le llamas "necesitar precisión " ? Tengo conectado al micro un reloj DS1307 y una micro SD, la frecuencia del reloj interno afectaría su funcionamiento? Es decir, la comunicacion I2C.. SPI.. ,etc.
 
Última edición:
¿A qué le llamas "necesitar precisión"?
A realizar operaciones con los ciclos de reloj del microcontrolador.
Tengo conectado al micro un reloj DS1307 y una micro SD.
¿La frecuencia del reloj interno afectaría su funcionamiento, es decir, la comunicación I2C, SPI, etc.?
Sólo se verían afectados si la frecuencia de operación del bus está por debajo de los parámetros establecidos de comunicación.
 
Amigos. Al final pude solucionar el problema. Gracias.
Opte por utilizar el reloj interno a una frecuencia de 1MHz en lugar del oscilador externo.

¿Que opinarían ustedes sobre el consumo de batería del micro, si opera con el reloj interno en lugar del externo?

¿Como puedo ser mas eficiente en cuanto al consumo de batería al utilizar el reloj interno (¿función SLEEP?) ?

Saludos !
 
Atrás
Arriba