PIC18F4520 falló al usar el oscilador interno a 1MHz

0

Estoy deseando usar el oscilador interno del pic18f4520 a una frecuencia de 1Mhz, lo que deseo lograr al final es usar 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 50Hz con un oscilador externo de 20Mhz. Quiero usar el PWM sin el oscilador externo solo porque parece un truco para saber.

Soy muy nuevo en los microcontroladores y me disculpo 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é a OSSCON el registro valor necesario para encender el oscilador interno y configurarlo en 1MHZ.

El código no se compila y parece ser un poco dudoso acerca de mi configuración de OSC a INTIO1, aunque eso es lo que dice la hoja de datos cuando se desea utilizar 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úsculas todo lo que aparece delante del signo "#", por lo que debe asumir que todo es correcto, excepto en la inclusión y pragma, excepto pragma config OSC = INTIO1, que como se mencionó no permitió la construcción exitosa.

    
pregunta Rashiid Sherif

1 respuesta

1

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

Selección del 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):

Sinembargo,deacuerdoconel Anexo de configuración de PIC18 las opciones se nombran de manera diferente en la herramienta C18 suite (página 131):

LaconfiguracióndeOSCaINTIO7daráunasalidadeFOSC/4(elrelojdeinstrucciones)enelpinOSC2(RA6).Estopodríanoserdeseable,paraunrelojtotalmenteinternoesposiblequedeseeINTIO67ensulugar.

Configuracióndeloscilador

Enrealidad,noesnecesariocambiarOSCCONdurantelainicializaciónsideseaunasalidade1Mhzporqueeseeselvalorpredeterminado.Puedesverestoenlahojadedatos(página30):

  

bit6-4IRCF2:IRCF0:bitsdeseleccióndefrecuenciadelosciladorinterno

    
  • 100=1MHz(3)
  •   

3-FrecuenciadesalidapredeterminadadeINTOSCalreiniciar.

Además,debeesperaraqueelosciladorinternoseestabiliceantesdecontinuar.PuedehacerestocontrolandoelbitIOFSdeOSCCON.NoestoysegurodecómoC18presentaesteregistro,peroalgocomolosiguientefuncionaría:

//Waitfortheinternaloscillatortobestablewhile(!(OSCCON&0b100));

Tengaencuentaquetambiénpuedeusarcualquieradeestosquesonexactamenteequivalentes.Esprobablequetodossecompilenconlamismainstruccióndepruebadebits(porejemplo,btfss):

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

Faltadebucleprincipal

Notieneunbucleprincipal,comoobservóRogerenloscomentarios.Generalmenteharíastutrabajoenunaaparienciacomo:

voidmain(){//Setupportsandinternalfeatures//Mainprogramwhile(1){//Doyourworkhere,whichrepeatsforever}//Executionwillneverreachhere}

Incluirsintaxis

Suscomentariossugierenquerecibióesteerror:

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

Estosedebeaquenecesitaparéntesisangularesalrededordelasdirectivas#include,deestemodo:

#include<p18cxxx.h>

Echeunvistazoa esta pregunta de Stackoverflow para una explicación detallada de por qué.

    
respondido por el David

Lea otras preguntas en las etiquetas