bond писал(а):Буду вникать.

Хотелось бы поверить...
Есть ли возможность минимизировать правки?
Есть ли возможность передать параметр управления в Макрос
FC_CAL_Enable_ADC, так, чтобы именно в самом макросе осуществились все настройки?
Включение внутреннего ИОН происходит в регистре
ADMUX.
Чтобы настроить (выбрать тип опорного) Матриксы в Макрос
FC_CAL_Enable_ADC передают параметр
MX_UINT8 Vref, в самом тексте Макроса
ReadAsByte он определен как
%a_MX_ADC_VREFOP (смотри макрос [Defines] компонента АЦП ФК). Вот сейчас пришло время рассмотреть параметр определенный через знак
%.
Когда в свойствах компонента вы выбираете опции опорного напряжения, то через параметр
%e значение присваивается константе
%a_MX_ADC_VREFOP. Значение может быть равно
0 (VDD) или
1 (VREF+). В самом макросе
FC_CAL_Enable_ADC с этим значением выполняют действие
Vref = 1 - Vref;.
Если
1-0, то
Vref=1, если
1-1, то
Vref=0. С какой целью Матриксы это сделали, я не знаю (можно было бы сразу передавать нужное значение).
Что происходит дальше?
Эта строка
ADMUX = (Vref << REFS0) | (1 << ADLAR) | Channel; настраивает АЦП.
Подобная запись
1 << ADLAR говорит о том, что в бит определенный под именем
ADLAR будет записана единица. Как работать с битами описывалось неоднократно, вот
крайний разМы видим, что настройка опорного производится только одним битом, а нам нужно занести два бита. По аналогии - подобная запись
Vref << REFS0 говорит, что в бит
REFS0 будет записано значение переменной Vref. На первый взгляд не хватает еще одного бита
REFS1.... Почему-то многие всегда думают, что в такой записи
(Vref << REFS0) переменная
Vref – это
1 или
0. Но это не верно, Vref может быть любое число. На самом деле,
<< это операция сдвига и запись
Vref << REFS0 говорит о том, что переменную
Vref нужно сдвинуть на…… вот тут и кроется ответ, именно на…, на столько-то бит. Имя бита
REFS0 – это условность и в заголовочном файле (
iom8.h) . это имя (константа) определено как
#define REFS0 6.
Заголовочный файлТаким образом, запись
ADMUX = (Vref << REFS0) выглядит как
ADMUX = (Vref << 6) – сдвинуть переменную
Vref на
6 бит и поместить в
ADMUX. Смотрим в
ДАТУ ADMUX.jpg
и видим что
REFS1 и
REFS0 это две рядом расположенные единицы, и, если число
3 сдвинуть на
6 бит, то мы достигнем нужного результата
ADMUX = (3 << 6) = 11000000.
Теперь о том, как передать это число в макрос FC_CAL_Enable_ADC. Если бы не действие Vref = 1 - Vref; то можно было бы в [Defines] компонента вместо
%e вписать число 3, но операция вычитания накладывает свои правила. Число
3 мы можем получить, если вычесть из числа 1 число
254.
Вычитание– это сложение прямого и обратного кода.
При этом в силу вступает свойство разрядной сетки, поскольку числа только положительные, то у числа
-254 после преобразования знак минус выйдет за границы сетки. Например,
254=0b11111110, -254 = 1 00000001+1=0b00000010=2Можно представить это в следующем виде - формула (для понимания) этого действия выглядит так Vref = N – Vref, если Vref >N то Vref = N – Vref +256.
Таким образом, вместо %e нужно вписать число
254 в [Defines] и тем самым решить задачу.
Prim3.rar
У вас нет доступа для просмотра вложений в этом сообщении.