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.
Algunas observaciones. Estoy usando esta hoja de datos como referencia.
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):
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):
El ajuste OSC
a INTIO7
dará una salida de FOSC/4 (el reloj de instrucciones) en el OSC2
pin ( RA6
). Esto podría no ser deseable, para un reloj completamente interno, es posible que desee INTIO67
en su lugar.
En realidad, no necesita cambiar OSCCON
durante 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 IOFS
bit 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);
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
}
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 #include
directivas, así:
#include <p18cxxx.h>
Eche un vistazo a esta pregunta de Stackoverflow para obtener una explicación detallada de por qué.
!OSCCONbits.IOFS
:)OSC = INTIO67
. Loco.
Andy alias
vladimir cravero
Rogelio Rowland
David
Sherif Rashiid
Sherif Rashiid
David
<
y>
corchetes alrededor de los archivos de encabezado#include
?Sherif Rashiid