Migración de C18 a XC8 Problema de conversión de ADC

1

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.

    
pregunta TheSoulkiller

0 respuestas

Lea otras preguntas en las etiquetas