Cómo Configurar el Oscilador Interno en Microcontroladores PIC: Guía Definitiva para Principiantespost-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

¿Qué es un Oscilador?

En electrónica un oscilador es un circuito que es capaz de convertir la corriente continua en una corriente que varía de forma periódica en el tiempo. Estas oscilaciones pueden ser senoidales, cuadradas, triangulares, etcétera, dependiendo de la forma que tenga la onda producida.

Un oscilador electrónico es fundamentalmente un amplificador cuya señal de entrada se toma de su propia salida a través de un circuito de realimentación. El oscilador del microcontrolador es el encargado de producir una señal de sincronismo para que el dispositivo embebido consiga ejecutar la tarea para la cual está programado.

Importancia del Oscilador en Microcontroladores

Todo microprocesador o microcontrolador requiere de un circuito que le indique a qué velocidad debe trabajar. Este oscilador es como el motor del microcontrolador, por lo tanto, este pequeño circuito no debe faltar. Esto especifica el reloj con el cual va a trabajar el CPU del microcontrolador.

Tipos de Osciladores para PIC

Existen microcontroladores que tienen su oscilador internamente y no requieren de pequeños circuitos electrónicos externos como el PIC16F628A.

Por otro lado, el microcontrolador PIC16F84 requiere de un circuito externo de oscilación o generador de pulsos de reloj. El PIC16F84 puede utilizar cuatro tipos diferentes de reloj oscilador externos. Algunos de estos tipos incluyen:

Lea también: IVA 21% Excel

  • Oscilador tipo "LP" (Low Power) para frecuencias entre 32 y 200 Khz. Este oscilador es igual que el anterior, con la diferencia de que el PIC trabaja de una manera distinta.
  • Oscilador tipo "HS" (High Speed) para frecuencias comprendidas entre 4 y 20 MHz. Habremos de usar esta configuración cuando usemos cristales mayores de 4 MHz.
  • Oscilador tipo "RC" (Resistor/Capacitor) para frecuencias no mayores de 5.5 Mhz. Este es el más económico porque tan solo se utiliza un condensador no polarizado y una resistencia.

Este cristal realmente es otro tipo de oscilador externo disponible para nuestro microcontrolador. Se puede usar la carga y descarga de un condensador como un tipo de clock para el PIC y configurarlo en el CCS.

Configuración del Oscilador Interno en PIC

Hay varias formas de configurar el oscilador interno en PIC16F877a, 16F887, 18F4550, etc. Un punto importante a tener en cuenta es que no todos los PICs del mercado permiten la misma velocidad, puesto que unos admiten más que otros. En el momento de programar el microcontrolador se deberá especificar en los parámetros el tipo de oscilador que utilizamos en nuestro proyecto electrónico.

Aparte de usar una de las configuraciones de hardware, hay otra parte que hay que configurar que es más importante que el circuito que usemos.

Configuración Mediante Fuses (Pragmas)

La idea es que elijas el modo de oscilador interno con los fuses. Los fusibles de configuración son modificados cuando se usa esta opción. El compilador establecerá automáticamente los bits de configuración del oscilador basado en su tipo definido. Si se especificó el cristal interno, el compilador también configura automáticamente el oscilador interno a la velocidad definida.

Entre las opciones de fuses para oscilador interno se tiene INTHS, INTXT, INTRC_IO, INTRC. Ello corresponde según a datasheet a:

Lea también: Guía IVA reducido

  1. INTHS: Internal Oscillator used as microcontroller clock source, HS Oscillator used as USB clock source.
  2. INTXT: Internal Oscillator used as microcontroller clock source, XT Oscillator used as USB clock source.
  3. INTIO: Internal Oscillator used as microcontroller clock source, EC Oscillator used as USB clock source, digital I/O on RA6.
  4. INTCKO: Internal Oscillator used as microcontroller clock source, EC Oscillator used as USB clock source, FOSC/4 output on RA6.

Para el PIC18F4550, un fuse común para el oscilador interno es
#pragma config FOSC = INTOSCIO_EC, que establece el Oscilador interno, el uso del pin RA6 activado y que el USB usa un Clock Externo.

Ajuste de Frecuencia con el Registro OSCCON

Después de configurar los fuses, hay que trabajar sobre el registro OSCCON para seleccionar correctamente la frecuencia. Dependiendo del microcontrolador con declarar mediante fuses la utilización del oscilador interno no alcanza, ya que se pueden seleccionar varias opciones de velocidad (PIC18F).

Por ejemplo, en un PIC18F4550, mirando el esquema del oscilador, tendrías que colocar Internal oscillator, port function on RA6, EC used by USB (INTIO) en FOSC3:FOSC0 y establecer 8 MHz en OSCCON6:OSCCON4 debido a que por default en un reset queda en 1 MHz.

Uso del PLL para Mayores Frecuencias

Para muchos microcontroladores PIC, la máxima velocidad que se puede obtener con el oscilador interno es de 8Mhz. Sin embargo, el PLL no es solo para el USB, sino también para el CPU. Con 20 MHz de cristal externo, habilitando el PLL se puede obtener 48MHz.

Me gustaría operar a la máxima frecuencia posible por si en algún caso añado aplicación por USB con el microcontrolador, es decir a 48MHz.

Lea también: ¿Cómo localizar tus XML del SAT?

Ejemplos de Configuración en CCS C

Directivas `#use delay`

En CCS, la configuración del oscilador interno se puede realizar con directivas específicas. Una de ellas es `#use delay(internal=8M)` que configura el INTOSC_IO para funcionar a 8 MHz. Otra directiva es `#use_delay(clock=8000000)`, especificando la frecuencia del oscilador en Hz. Si se omite la fuente, se utiliza el valor del último `#USE DELAY`.

Si el modo es OSC_INTERNAL, la fuente es un valor de sintonía opcional para el oscilador interno para los dispositivos que lo admiten. Si se cambia la velocidad en tiempo de ejecución, el compilador puede no generar los retrasos correctos para algunas funciones integradas. El último `#USE DELAY` encontrado en el código va a ser tomado como la velocidad correcta.

Función `setup_oscillator()`

En CCS, en teoría, la frecuencia se haría con `setup_oscillator()`. Esta función configura el oscilador con configuraciones de fuente interna y externa preestablecidas. Si los fusibles del dispositivo están configurados y se especifica `#use delay()`, el compilador configurará el oscilador. Utilice esta función para la configuración explícita o la programación de interrupciones de reloj dinámico.

Por ejemplo, colocando `setup_oscillator(OSC_8MHZ|OSC_INTRC)` debería de funcionar para configurar el oscilador interno a 8 MHz.

Ejemplo de Código para PIC18F4550

A continuación se presenta un fragmento de código que muestra la configuración del oscilador interno a 1MHz (valor por defecto) y el uso de delays.

/*programa: prueba oscilador internopic: 18f4550crystal: NOCPU: 1Mhz (valor por defecto)CONEXIONES:1 led en port d0 con una resistencia en serie de 470ohms1 led en port D1 con una resistencia en serie de 470ohmsLos leds cambian de estado cada 1 segundo. Uno enciende y el otro se apaga cada vez.*//*Includes globales*/#include <p18f4550.h>#include <delays.h>/* Bits de configuración*/#pragma config FOSC = INTOSCIO_EC // Oscilador interno, uso de pin RA6 activado, El USB usa Clock Externo.#pragma config WDT = OFF //desactivamos watchdog timer#pragma config PWRT = ON // activamos power up timer/*declaración de funciones*////////////////////////////////////////////////////////////////////////////////////////////////////// Programa Principal ////////////////////////////////////////////////////////////////////////////////////////////////////void main(){ ADCON0 = 0X00,ADCON1 = 0X0F,CMCON = 0X07; //puerto A con todos los pines digitales TRISA = 0X00; // puertos A B y C como salida. Recordar Tip: el 0 es una o de ouput y el 1 una I de input!!! TRISB = 0X00; TRISC = 0X00; LATA = 0X00; // ponemos los puertos en cero LATB = 0X00; LATC = 0X00; TRISDbits.TRISD0 = 0; // Seteamps el pin D1 como salida para el LED TRISDbits.TRISD1 = 0; // Seteamps el pin D1 como salida para el LED LATDbits.LATD0 = 1; // Encendemos el led0 LATDbits.LATD1 = 0; // Apagamos el led1 while(1) { LATDbits.LATD0 = ~LATDbits.LATD0; // Intercambiamos el estado del pin del led (Toggle LED) LATDbits.LATD1 = ~LATDbits.LATD1; // Intercambiamos el estado del pin del led (Toggle LED) Delay10KTCYx(25); //Delay de 250K ciclos (1 segundo a 1MHz. }}

Este programa demuestra cómo configurar un PIC18F4550 con su oscilador interno y realizar operaciones básicas controladas por el tiempo del oscilador.

Consideraciones y Solución de Problemas

Velocidades Máximas

Con el oscilador interno, lo máximo que puedo correr es 8Mhz. Sin embargo, con un cristal externo de 20 MHz, habilitando el PLL se puede obtener 48MHz, lo cual es útil para aplicaciones como USB.

Troubleshooting Básico

A veces, la configuración del oscilador puede generar problemas. Si lo compila bien, pero al probar el hardware no funciona, verifica que tu programador soporte las opciones de configuración de fuses que estás utilizando, como NOMCLR y INTRC_IO al mismo tiempo.

En los fuses, es importante especificar el PLL y el postescalador que usas, ya que esto puede ser la causa de que no funcione correctamente la configuración.

tags: #como #configurar #oscilador #interno #microcontrolador #pic