TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: peguerosdc en 24 de Diciembre de 2014, 08:47:06
-
Hola! Estoy usando el compilador MPLABX y quiero usar un cristal de 3.58MHz como oscilador externo para mi PIC. He leído la hoja de especificaciones y tengo entendido que debo modificar los bits OSCCON, además de que el compilador me pide especificar el valor de la frecuencia en una constante _XTAL_FREQ. Mi programa es un "hola mundo", solo quiero leer el valor en un pin (usando un push button) y escribirlo en otro pin para verlo en un LED. Este es mi código:
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic16f887.h>
#define _XTAL_FREQ 3579545
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF
// CONFIG 2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
int main(int argc, char** argv) {
ANSEL = 0;
ANSELH = 0;
TRISA = 0xFF;
TRISC = 0x00;
OSCCONbits.OSTS = 0b1;
OSCCONbits.HTS = 0b1;
OSCCONbits.LTS = 0b1;
OSCCONbits.SCS = 0b0;
while (1) {
RC6 = RA0;
}
return (EXIT_SUCCESS);
}
Esto funciona perfectamente si uso el oscilador externo que trabaja a 4MHz (para esto quito las lineas de OSCCON y _XTAL_FREQ =4000000), el problema es que cuando intento usar mi oscilador externo mi PIC se vuelve muuuy lento. El ciclo while tarda unos 8 segundos en ejecutarse por primera vez y el tiempo que tarda en leer el valor en RC6 y escribirlo en RA0 es de unos 3 segundos, pero no veo razón por la que esto suceda!! Alguien me podría ayudar, por favor? :)
La resistencia que uso entre las patitas de mi cristal es de 10Mohms y los capacitores son de 33pF.
-
#pragma config FOSC = XT
Con esa linea seleccionas tu oscilador, el OSCCON solamente te serviria para un cambio de frecuencia cuando tenes:
#pragma config IESO = ON
Asi tu micro arranca con el oscilador interno y luego pasas al externo.
OSCCONbits.OSTS = 0b1;
OSCCONbits.HTS = 0b1;
OSCCONbits.LTS = 0b1;
OSCCONbits.SCS = 0b0;
Los bits que NO estan en negrita en el reset se ponen a esos valores, asi que no tienen sentido cambiarlos, y los que estan en negrita son de estado asi que no los podes escribir, y solamente sirven para ver que el oscilador interno esta estable ( tanto el de 8Mhz HTS como el de 32k LTS )
Si me decis que con un cristal de 4 Mhz anda, y imagino que es un resonador ceramico, podrias probar con otra resistencia mas chica ( 2Mohm en paralelo o tal ves sacarlo ) o podrias aumentarle la ganancia al circuito del oscilador poniendolo en HS y no XT, asi le aumentas la ganancia al inversor. Son las unica opciones que se me ocurren.
Incluso me encontre un Application Note que no es del PIC:
http://www.st.com/web/en/resource/technical/document/application_note/CD00004059.pdf
Pero incluso dice de sacar la resistencia en paralelo y para valores de 4Mhz capacitores de 47pF a 100pF dependiendo del resonador.
Y tambien veo resonadores ceramicos con capacitores incluidos que en ese rango estan dentro de los 30pF, asi que primero probaría lo de arriba.