как совместить ADRESH и ADRESL на 12-битном АЦП

MICRO: PIC18LF47K42 компилятор: XC8 приложение: MPLABX

Привет, я пытаюсь объединить значения в моем 12-битном АЦП. они входят в АДРЕШ и АДРЕСЛ. мой АЦП настроен для выравнивания по правому краю, который формирует так: ADRESH: (---- MSB, x, x, x) ADRESL: (X, X, X, X, X, X, X, LSB)

Это моя первая работа с АЦП, и, надо признать, я мало о них знаю. Но, проверив значение в моем регистре результатов, я могу сказать, что у меня нет хорошего разрешения. Я почти уверен, что это потому, что я совмещаю ADRESH и ADRESL. как я мог это сделать? И снова это 12-битный АЦП. его тестируют с помощью LDR, когда нет света, я получаю 0, и это нормально, но когда есть слабый свет, он переходит к десятичному значению 48, поэтому я снова немного увеличиваю яркость, и она остается на уровне 48. до тех пор, пока не произойдет большой скачок до WhicHit перескакивает на 64 или что-то в этом роде.

          #include "myIncludes.h"
volatile unsigned char ZCDSoftwareFlag = 0;
volatile unsigned char switchValue = 0;
void main(void) 
{
   
    portInit(); 
    triac = 0;
    unsigned char result;
    adcInit();                 
    while(1)
    {
      
        
        __delay_us(4);
        ADCON0bits.GO = 1; //Start conversion
        while (ADCON0bits.GO); //Wait for conversion done
        
        result = ADRESH;
        
        result = result << 8;
        result = result |ADRESL;
        
        
    }
}

И вот функция инициализации ADC

      void adcInit(void)
{
    ADCON0bits.FM = 1;              //right-justify 
    ADCON0bits.CS = 1;              //ADCRC Clock
    ADPCH = 0x00;                   //RA0 is Analog channel
    ADCON0bits.ON = 1;              //Turn ADC On
    ADCON0bits.GO = 1;              //Start conversion
}

1 ответ

Вы пытаетесь поместить 12-битный результат в 8-битную переменную. Переключите его на 16 бит

      uint_t result;
Другие вопросы по тегам