Пытаетесь понять выбор канала с помощью АЦП на микроконтроллере PIC?

Я пытаюсь написать программу, которая для микроконтроллера PIC18F252 использует АЦП для преобразования 3 аналоговых сигналов (на 3 отдельных выводах) в цифровые сигналы для использования на выходе программы. Руководство, которое я использовал, чтобы помочь мне понять АЦП, было полезным, но я борюсь с частью, где они собирают все это вместе. Вот код:

unsigned int ADC_Read(unsigned char channel)
{
  ADCON0 &= 0x11000101; //Clearing the Channel Selection Bits
  ADCON0 |= channel<<3; //Setting the required Bits
  __delay_ms(2); //Acquisition time to charge hold capacitor
  GO_nDONE = 1; //Initializes A/D Conversion
  while(GO_nDONE); //Wait for A/D Conversion to complete
  return ((ADRESH<<8)+ADRESL); //Returns Result
}

Затем вы можете вызвать функцию и назначить ее переменной, используя это:

i = (ADC_Read(4)); //store the result of adc in “i”

Моя проблема в том, что я изо всех сил пытаюсь понять битовую часть кода. Я понимаю, почему и как он очищает биты выбора канала, но мне трудно понять, как 'channel‹‹3', когда в этом примере канал = 4, может создать двоичное значение, которое можно объединить по ИЛИ со значением ADCON0. Кто-нибудь может объяснить, каково значение канала после запуска кода, если он начинается с 4, а также какой будет новая конфигурация ADCON0 после строки ИЛИ?

Я понимаю каждую строку по отдельности, я просто пытаюсь понять, как они соединяются, потому что это нужно делать 3 раза, каждый раз выбирая другой канал, и на данный момент я не могу сказать, какой канал это устанавливает.


person MendelumS    schedule 14.11.2019    source источник
comment
Скажем, канал имеет диапазон 0..7 и находится в битах 5..3 (на основе 0). Сдвиг канала на 3 приведет к тому, что канал будет выглядеть как xxx000 в двоичном виде, поэтому выполнение операции ИЛИ с этим значением установит биты 5..3.   -  person ikegami    schedule 14.11.2019
comment
Ответы предполагают, что 0x11000101 должно быть 0b11000101   -  person ikegami    schedule 14.11.2019


Ответы (3)


Другие ответы обеспечивают расположение регистров. Этот ответ иллюстрирует процесс изменения нужных битов.

Во-первых, мы очищаем биты канала (и нереализованный бит 1).

        7   6   5   4   3   2   1   0
      +---+---+---+---+---+---+---+---+
      | a | b | c | d | e | f | g | h |   Initial state
      +---+---+---+---+---+---+---+---+
      
      +---+---+---+---+---+---+---+---+   (The OP incorrectly
&     | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |   used 0x11000101
      +---+---+---+---+---+---+---+---+   instead of 0b11000101.)
      
      +---+---+---+---+---+---+---+---+
=     | a | b | 0 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

Далее нам нужно сдвинуть канал в биты 5-3.

      +---+---+---+---+---+---+---+---+
      |(0)|(0)|(0)|(0)|(0)| 1 | 0 | 0 |   4   (Channel in bits 2-0)
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
<< 3  |(0)|(0)| 1 | 0 | 0 |(0)|(0)|(0)|       (Channel in bits 5-3)
      +---+---+---+---+---+---+---+---+

Теперь мы можем выполнить операцию ИЛИ.

      +---+---+---+---+---+---+---+---+
      | a | b | 0 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
|     |(0)|(0)| 1 | 0 | 0 |(0)|(0)|(0)|
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
=     | a | b | 1 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

Я использовал (0) для обозначения нулевого бита, который не несет данных.

person ikegami    schedule 14.11.2019
comment
Спасибо за этот ответ, он очень полезен! У меня просто дополнительный вопрос; эти вопросительные знаки указывают на неустановленное состояние или на то, что он просто установлен на то, на что я его ранее установил? Потому что мне просто интересно, нужен ли мне еще один шаг, чтобы снова настроить другие биты? Спасибо! - person MendelumS; 14.11.2019
comment
Начальное состояние сохраняется в этих битах - person ikegami; 14.11.2019

Если вы обратитесь к Техническому описанию для PIC18F252 Раздел 17.0

Дано определение ADCON0. Здесь биты 3,4,5 - это биты выбора канала.

Код

  ADCON0 &= 0x11000101; //Clearing the Channel Selection Bits
  ADCON0 |= channel<<3; //Setting the required Bits

установит каналы от 0 до 7 в соответствии с параметром функции.

См. изображение здесь введите здесь описание изображения

person Rishikesh Raje    schedule 14.11.2019

Регистр ADCON0 выглядит так

bit 7-6  A/D Conversion Clock Select bits (ADCON0 bits in bold)
bit 5-3  Analog Channel Select bits
bit 2    GO/DONE
bit 1    Unimplemented
bit 0    ADON

Как видите, биты 5-3 служат для выбора канала. биты 5-3 обрабатываются как 3-битное значение, поэтому, если вы хотите выбрать канал 4, который равен 100 в двоичном формате, вы должны сдвинуть число 4 (100) на 3 шага влево, чтобы поместить его в биты выбора канала.

person Fredrik    schedule 14.11.2019