PIC18F4520 falló al usar el oscilador interno a 1 MHz

Estoy deseando usar el oscilador interno del pic18f4520 a una frecuencia de 1Mhz, lo que deseo lograr al final es usarlo para controlar un servo.

#include p18cxxx.h          
#include pwm.h              
#include timers.h               
#include adc.h

#pragma config OSC = INTIO1
#pragma config MCLRE = ON           /* Set Master Clear */ 
#pragma config WDT = OFF            /* set watchdog timer off */ 
#pragma config LVP = OFF            /* Low Voltage Programming Off */ 
#pragma config DEBUG = OFF          /* Compile without extra Debug compile Code */ 
#pragma config PBADEN = OFF         /* Disable Analogue on PORTB */

void main() { 
    OSCCON = 0x42;
    TRISC = 0X00;
    PR2=152;  // period
    T2CON = 0x06;  //prescale to 16
    OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 0b1011); 
    SetChanADC(ADC_CH0); 
    ConvertADC( ); 
    while(BusyADC( )); /* wait for completion */
    CCP1CONbits.CCP1M = 0x0C;    //make the pin an output
    CCPR1L = (ReadADC()/4);   // duty cycle
    CCP1CONbits.DC1B=0;
}

Cuando uso un oscilador externo, el pwm funciona bien, pero no puedo obtener una señal de 50 Hz con un oscilador externo de 20 Mhz, quiero usar el PWM sin el oscilador externo solo porque parece un buen truco para saberlo.

Soy muy nuevo en los microcontroladores y pido disculpas si no sigo ningún protocolo para explicar mi problema, pero para repetir, el problema es configurar el oscilador interno a 1MHz, leí la hoja de datos y asigné el registro OSSCON el valor necesario y para encender el oscilador interno y configurarlo a 1MHZ.

El código no se compila y parece ser un poco dudoso que yo configure el OSC en INTIO1, aunque eso es lo que dice la hoja de datos cuando se desea usar las capacidades del oscilador interno del microcontrolador.

El programa está en el compilador c18.

Por alguna razón, el sitio borra las palabras con "< >" y pone en mayúscula todo lo que está delante del signo "#", así que suponga que todo es correcto, excepto en la inclusión y pragma excepto la configuración de pragma OSC=INTIO1 que, como se mencionó, no permitía construcción exitosa.

Wow "MHz" (correcto), "MHZ" y "Mhz" todo en una pregunta. No soy un experto en micros, pero la atención al detalle es importante, estoy seguro. Yo también seguro que alguien te ayudará pero no me pedantes!!
por favor pega el error del compilador
Lo primero que noto es que no tiene un ciclo principal, su código simplemente pasa por la función principal. Eso siempre va a dar resultados extraños.
He agregado una respuesta porque mis comentarios eran demasiado largos para comentarios. Actualizaré esto si puede mostrarnos el error del compilador como sugirió Vladimir.
Hola, Andy Aka, lo siento por mi error de MHZ, Mhz y MHZ.
He agregado un ciclo while como se indicó, lamento mucho la demora, no pensé que una respuesta seguiría tan rápido. este es el error que parece estar recibiendo de MPLAB: C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:1:Error [1026] malformed #include directiva C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:2:Error [1026] malformado #include directiva C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:3:Error [1026] malformado #include directiva C:\Users\Rashiid \Desktop\PWM TEST PIC18F4520\pwm.c:4:Error [1026] directiva #include mal formada –
¿ Está absolutamente seguro de que tiene <y >corchetes alrededor de los archivos de encabezado #include?
tienes toda la razón, debo haber copiado el código que puse aquí en MPLAB, ¡no hice caso de mi propio consejo! wow, debo estar pareciendo tan tonto. Lo siento mucho por mi incomodidad.

Respuestas (1)

Algunas observaciones. Estoy usando esta hoja de datos como referencia.

Selección de oscilador

Su problema parece ser un conflicto entre la hoja de datos y la documentación del compilador. Aquí vemos la lista de posibles tipos de osciladores (hoja de datos página 23):

Tipos de oscilador PIC 18F4520

Sin embargo, de acuerdo con el Anexo de ajustes de configuración de PIC18, las opciones se nombran de manera diferente en el conjunto de herramientas C18 (página 131):

ingrese la descripción de la imagen aquí

El ajuste OSCa INTIO7dará una salida de FOSC/4 (el reloj de instrucciones) en el OSC2pin ( RA6). Esto podría no ser deseable, para un reloj completamente interno, es posible que desee INTIO67en su lugar.

Configuración del oscilador

En realidad, no necesita cambiar OSCCONdurante la inicialización si desea una salida de 1Mhz porque ese es el valor predeterminado. Puede ver esto en la hoja de datos (página 30):

bit 6-4 IRCF2:IRCF0: bits de selección de frecuencia del oscilador interno

  • 100 = 1 megaciclo (3)

3 - Frecuencia de salida por defecto de INTOSC en Reset.

Además, debe esperar a que el oscilador interno se estabilice antes de continuar. Puede hacer esto monitoreando el IOFSbit de OSCCON. No estoy seguro de cómo C18 presenta este registro, pero algo como lo siguiente funcionaría:

// Wait for the internal oscillator to be stable
while(!(OSCCON & 0b100));

Tenga en cuenta que también puede usar cualquiera de estos que son exactamente equivalentes. Es probable que todos se compilen en la misma instrucción de prueba de bits (p. ej. btfss):

while(OSCCONbits.IOFS == 0);
while(!OSCCONbits.IOFS);

Falta de bucle principal

No tienes un bucle principal, como lo observa Roger en los comentarios. En general, haría su trabajo de la siguiente manera:

void main() {
    // Setup ports and internal features

    // Main program
    while(1) {
        // Do your work here, which repeats forever
    }

    // Execution will never reach here
}

Incluir sintaxis

Tus comentarios sugieren que recibiste este error:

PIC18F4520\pwm.c:1:Error [1026] malformed #include directive

Esto se debe a que necesita corchetes angulares alrededor de las #includedirectivas, así:

#include <p18cxxx.h>

Eche un vistazo a esta pregunta de Stackoverflow para obtener una explicación detallada de por qué.

Esta es una forma más clara de verificar el bit IOFS: while (OSCCONbits.IOFS == 0) ;
Saludos, no estaba seguro de cómo funcionaba eso en C18, pero así es como lo hago en XC8. Incluso más ordenado es !OSCCONbits.IOFS:)
Hola, ¿dónde me gustaría comprobar para este bit? antes de mi bucle while (1) para que solo entre en el bucle principal una vez que el oscilador se haya estabilizado?
Sí, ese sería un buen lugar. Después de realizar cualquier cambio en la configuración del oscilador o en el inicio/despertar del modo de suspensión.
Además, no tengo idea de cómo configurar mi oscilador, C:\Users\Rashiid\Desktop\PWM TEST PIC18F4520\pwm.c:6:Error [1225] valor de configuración 'INTIO1' no reconocido para la configuración 'OSC' Esto es la respuesta de error cuando intento usar INTIO2 #pragma config OSC = INTIO2
De acuerdo con este documento, probablemente desee OSC = INTIO67. Loco.
¡Se construyó con éxito! Nunca supe de ese documento, pero ahora lo leeré antes de hacer preguntas aquí. Muchas gracias a todos por ayudarme hasta ahora. Es increíble lo rápido que todos respondieron.
Parece que la hoja de datos y la documentación del compilador entran en conflicto directamente, lo que no es útil. Actualizaré mi respuesta por la mañana.
No hay problema, mi servo simplemente funcionó completamente, así que fue extremadamente alegre, ¡ver que medio día no se desperdició!
Si esto responde a su pregunta, debe marcarlo como aceptado.