SE – uC: Los Osciladores Del PIC18F14K50

El modulo del oscilador tiene una variedad de fuentes de reloj y funciones para adaptarlo a diferentes aplicaciones, mejorando el rendimiento y disminuyendo la potencia consumida.

Las fuentes de reloj que permite este uC son las siguientes, las cuales se explicaran con más detalle en los siguientes subcapítulos:

  • Oscilador externo primario (Primary external oscillator)
  • Oscilador externo secundario (Secondary external oscillator)
  • Oscilador interno (Internal oscillator)

Los módulos que utilizaran el oscilador seleccionado son los siguientes:

  1. USB de baja velocidad (Low Speed USB)
    • Solo con el oscilador primario 6 MHz / 12 MHz
    • EC High power mode / HS mode = 6 MHz
  1. USB de alta velocidad (High Speed USB)
    • Solo con oscilador primario 12 MHz / 48 MHz
    • EC High power mode / HS mode = 48 MHz
  1. Sistema (System)
    • Puede ser cualquier oscilador

El diagrama del oscilador es el siguiente:

Para seleccionar y configurar el oscilador existen dos maneras:

  1. Utilizando la memoria de configuración para que se configure durante su programación. Este modo es el más común y por ende será la única que se explicara en este documento.
  2. Utilizando los registros específicos durante su ejecución. Obviamente para que el uC funcione bien durante su arranque y permita cambiar estos registros se debe configurar primero con la memoria de configuración.

Oscilador Externo Primario (Primary External Oscillator)

Esta configuración es requerida para el funcionamiento del USB y es opcional para el reloj del sistema. Para demostrar como configurarlo se utilizaran los siguientes ejemplos.

  1. En este ejemplo requerimos una velocidad del sistema de 48 MHz, utilizando un oscilador HS de 12 MHz, el periférico USB no se utilizara.
    1. Para realizar esta configuración lo primero es activar el reloj primario
    2. Especificar que es un oscilador HS
    3. Para el sistema: Multiplicamos x4 el reloj 12 x 4 = 48 MHz y no dividimos
#pragma config PCLKEN=ON		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=HS			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  
#pragma config PLLEN=ON			// 4 X PLL Enable bit:
								// OFF			PLL is under software control  
								// ON			Oscillator multiplied by 4  
#pragma config CPUDIV=NOCLKDIV 	// CPU System Clock Selection bit:
								// NOCLKDIV		No CPU System Clock divide  
								// CLKDIV2		CPU System Clock divided by 2  
								// CLKDIV3		CPU System Clock divided by 3  
								// CLKDIV4		CPU System Clock divided by 4  
  1. En este ejemplo requerimos una velocidad del sistema de 48 MHz, utilizando un oscilador HS de 12 MHz, el periférico USB se debe configurar para baja velocidad.
    1. Lo primero es activar el reloj primario
    2. Especificamos que es un oscilador HS
    3. Para el sistema: Multiplicamos x4 el reloj 12 x 4 = 48 MHz y no dividimos
    4. Para el USB: dividimos los 12 MHz entre dos dando 6 MHz que necesita el USB de baja velocidad
#pragma config PCLKEN=ON		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=HS			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  
#pragma config PLLEN=ON			// 4 X PLL Enable bit:
								// OFF			PLL is under software control  
								// ON			Oscillator multiplied by 4  
#pragma config CPUDIV=NOCLKDIV 	// CPU System Clock Selection bit:
								// NOCLKDIV		No CPU System Clock divide  
								// CLKDIV2		CPU System Clock divided by 2  
								// CLKDIV3		CPU System Clock divided by 3  
								// CLKDIV4		CPU System Clock divided by 4
#pragma config USBDIV=ON		// USB Clock Selection bit:
								// OFF	USB Clock comes directly from the OSC1/OSC2 oscillator block; no divide  
								// ON	USB clock comes from the OSC1/OSC2 divided by 2
  1. En este ejemplo requerimos una velocidad del sistema de 24 MHz, utilizando un oscilador HS de 12 MHz, el periférico USB se debe configurar para alta velocidad.
    1. Lo primero es activar el reloj primario
    2. Especificamos que es un oscilador HS
    3. Para el sistema: Multiplicamos x4 el reloj 12 x 4 = 48 MHz y dividimos entre dos = 24 MHz
    4. Para el USB: Se deja en 48 MHz
#pragma config PCLKEN=ON		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=HS			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  
#pragma config PLLEN=ON			// 4 X PLL Enable bit:
								// OFF			PLL is under software control  
								// ON			Oscillator multiplied by 4  
#pragma config CPUDIV=CLKDIV2 	// CPU System Clock Selection bit:
								// NOCLKDIV		No CPU System Clock divide  
								// CLKDIV2		CPU System Clock divided by 2  
								// CLKDIV3		CPU System Clock divided by 3  
								// CLKDIV4		CPU System Clock divided by 4
#pragma config USBDIV=OFF		// USB Clock Selection bit:
								// OFF	USB Clock comes directly from the OSC1/OSC2 oscillator block; no divide  
								// ON	USB clock comes from the OSC1/OSC2 divided by 2

Oscilador Externo Secundario (Secondary External Oscillator)

Esta configuración de oscilador se utiliza únicamente para cristales externos de 32.768 KHz y es utilizado principalmente como fuente del Timer1, pero también puede ser utilizado para el sistema.

Esta configuración se verá con más detalle en la sección de temporizadores (Timers).

Oscilador Interno (Internal Oscillator)

El modulo del oscilador interno cuenta con dos osciladores independientes:

  1. LFINTOSC: Oscilador interno de baja frecuencia
    • Frecuencia de 31 KHz.
    • Es la fuente de: Power-up Timer, Watchdog Timer, Fail-Safe Clock Monitor y puede ser del Sistema también.

En este ejemplo activaremos el LFINTOSC como fuente del sistema, el modulo USB no se utilizara:

#pragma config PCLKEN=OFF		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=IRC			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  


#include <p18f14k50.h>
#include "stdvars.h"
#include "pic18f14k50_cbits.h"

void main(){
	// Start-up configuration
	OSCTUNEbits.INTSRC = 0;		// Source is LFINTOSC
	OSCCONbits.IRCF = 0b000;	// Poscaler select 31 KHz
		
	while(true){
		// Program to run at 31 KHz
	};
}
  1. HFINTOSC: Oscilador interno de alta frecuencia
    • Frecuencia de 16 MHz, oscilador de precisión (Pero no lo suficiente para USB)
    • 8 frecuencias para seleccionar (16M, 8M, 4M, 2M, 1M, 500k, 250k, 31.25k)
    • Puede ser la fuente del sistema

En este ejemplo activaremos el HFINTOSC a 16 MHz como fuente del sistema, el modulo USB no se utilizara:

#pragma config PCLKEN=OFF		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=IRC			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  


#include <p18f14k50.h>
#include "stdvars.h"
#include "pic18f14k50_cbits.h"

void main(){
	// Start-up configuration
	OSCCONbits.IRCF = 0b111;		// Poscaler selected to 16 MHz
		
	while(true){
		// Program to run at 16 MHz
		
	};
}

También se puede utilizar el oscilador interno con el multiplicador (PLL) para generar una señal de 32 MHz de la siguiente manera:

#pragma config PCLKEN=OFF		// Primary Clock Enable Bit:
								// OFF			Primary clock is under software control  
								// ON			Primary clock enabled
#pragma config FOSC=IRC			// Oscillator Selection bits:
								// LP			LP oscillator
								// XT			XT oscillator  
								// HS			HS oscillator  
								// ERCCLKOUT	External RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTH	EC, CLKOUT function on OSC2 (high)  
								// ECH			EC (high)  
								// ERC			External RC oscillator  
								// IRC			Internal RC oscillator  
								// IRCCLKOUT	Internal RC oscillator, CLKOUT function on OSC2  
								// ECCLKOUTM	EC, CLKOUT function on OSC2 (medium)  
								// ECM			EC (medium)  
								// ECCLKOUTL	EC, CLKOUT function on OSC2 (low)  
								// ECL			EC (low)  
#pragma config PLLEN=OFF		// 4 X PLL Enable bit:
								// OFF			PLL is under software control  
								// ON

#include <p18f14k50.h>
#include "stdvars.h"
#include "pic18f14k50_cbits.h"

void main(){
	// Start-up configuration
	OSCCONbits.IRCF = 0b110;		// Poscaler selected to 8 MHz
	OSCTUNEbits.SPLLEN = 1;			// PLLx4 Enable

	while(true){
		// Program to run at 32 MHz
		
	};
}

Referencias:

Galería

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: