Estoy trabajando con Pic18f6622 y migrando mi programa al compilador XC8. Antes de usar el compilador C18, la conversión de ADC funcionaba bien, pero en el nuevo compilador ADC me devuelve un valor de 11 bits y el valor esperado es mucho más diferente. Quizás el tiempo no sea suficiente para permitir que ADC funcione correctamente, pero no podría estar seguro. EDITAR # Estoy usando un cristal externo de 10Mhz #
El valor "analogval" devuelve como 077C, pero debe ser 01DB o cerca de esto. Por cierto estoy leyendo valor PT100. Estoy compartiendo el siguiente fragmento:
#include <xc.h>
#pragma config OSC = HSPLL, WDT = OFF, WDTPS = 512, BOREN = SBORDIS, BORV = 2, PWRT = ON, LVP = OFF, MCLRE = OFF
unsigned int analogval;
void AnalogReader(void) {
while( ADCON0bits.GO != 0 ) continue;
analogval = ADRESH;
analogval <<= 8;
analogval += ADRESL;
ADCON0 = 0x10; // select first AN0 to AN4
ADCON0bits.ADON = 1;
ADCON0bits.GO = 1;
}
void InitDevice(void) {
TRISA = 0b00111111;
TRISB = 0b00000000;
TRISD = 0b00000000;
TRISF = 0b00111111; // F0~F3 analog input
// an0 an1 an2 *an3-NC* an4 an5 an6 an7 an8 analog, internal vref+ vref-
ADCON1 = 0b00000110;
ADCON2 = 0b10110010; // right justified, 16 tad acquisition, fosc/32
ADCON0 = 0b00000001; // enable adc
INTCON2 = 0b11111000; /// pull-up disabled
RCONbits.IPEN = 0; // interrupt priority not used
INTCONbits.INT0IE = 1; // int0 interrupt enabled
INTCONbits.PEIE = 1; // peripheral interrupts enabled
INTCONbits.GIE = 0; // interrupts disabled
}
void InitTimeBase(void) {
T3CON = 0x00;
T1CON = 0x00;
CCP1CON = 0b00001011; // Compare mode(RC2 OUTPUT): reset TMR1, set CCP1IF
CCPR1H = 0x03;
CCPR1L = 0xE8; // 1000 increments(=instructions)
// Instruction cycle: 1/(40Mhz/4) = 0.1us
// 1000 instructions = 0.1ms = 10KHz
TMR1H = 0x00;
TMR1L = 0x00;
T1CONbits.TMR1ON = 1; //start timer
PIE1bits.CCP1IE = 1; // TMR1 interrupt enable bit
INTCONbits.PEIE = 1; // Overflow interrupt enable bit
INTCONbits.GIE = 0; //Global interrupt enable bit
}
void main(void) {
InitDevice();
InitTimeBase();
delay_ms(2000); // custom delay
do {
if (PIR1bits.CCP1IF) { //10kHz --> 1000 instruction.
PIR1bits.CCP1IF = 0;
/*
* Bunch of operations
*/
if (slot == 0)
AnalogReader();
if (slot == 1)
// OP
if (slot == 2)
// OP
if (slot == 3)
//OP
slot++;
if (slot == 100) // slot 0..99 : Enter a slot each 10ms.
slot = 0;
//-----------------------------
counter++;
if (counter == 10000) {
counter = 0; // 1 sec
}
if (counter > 5000) { //0.5 sec
PORTBbits.LED1 = 1;
} else { //0.5 sec
PORTBbits.LED1 = 0;
}
}
} while (1);
}
Aprecio cualquier ayuda.