Проблема с последовательной печатью AnalogValue PIC16F18875 - PullRequest
2 голосов
/ 18 марта 2020

У меня проблемы с моей любопытной доской HP C. Я новичок в микрочипе, и я хочу прочитать аналоговое значение бортового потенциометра. Я использую последовательный преобразователь для отображения значения в терминале на моем P C. Он работает нормально, за исключением случаев, когда я полностью поворачиваю потенциометр от начала до конца, аналоговое значение изменяется от 0 до 255, падает до 0, поднимается до 255, падает до 0, поднимается до 255, падает до 0 и идет до 255 Я ожидал, что это будет go от 0 до 1023. Все мои переменные - 16 бит. U C - это PIC16F18875, а последовательный преобразователь - UM230XB.

Как это может быть? Все переменные и константы имеют правильный размер (если только я не пропустил)

Это главное. c:

void main(void){

   SYSTEM_Initialize();


   static uint16_t adcResult; // Used to store the result of the ADC

   adcResult = ADCC_GetSingleConversion(POT_CHANNEL);


       IO_RC7_SetLow();
       console_print("Value = ");
       console_print_dec_char(adcResult);
       console_print("\t\n\r");
       __delay_ms(100);

Это функция ADCC_GetSingleConversion:

adc_result_t ADCC_GetSingleConversion(adcc_channel_t channel){
// select the A/D channel
ADPCH = channel;  

// Turn on the ADC module
ADCON0bits.ADON = 1;

//Disable the continuous mode.
ADCON0bits.ADCONT = 0;    

// Start the conversion
ADCON0bits.ADGO = 1;

// Extra NOP() instruction required; See rev. A2 errata:  http://ww1.microchip.com/downloads/en/DeviceDoc/80000669C.pdf 
NOP();    

// Wait for the conversion to finish
while (ADCON0bits.ADGO)
{
}


// Conversion finished, return the result
return ((adc_result_t)((ADRESH << 8) + ADRESL));

ADC_result_t также 16 бит.

1 Ответ

0 голосов
/ 19 марта 2020

@ Эраклон прав:
Вы должны преобразовать 8-битное значение ADRESH в 16-битное значение перед левым сдвигом, в противном случае результат сдвига всегда равен 0.

 return ((adc_result_t)(((uint16_t)ADRESH << 8) + ADRESL));
...